Spring cloud Gateway网关

    科技2022-07-12  129

    三大核心概念 Route(路由)、Predicate(断言)、Filter(过滤);

    spring cloud Gateway 使用的web Flux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架; GateWay 核心逻辑 :路由转发+执行过滤链;

    GateWay 网关路由两种方式:yml配置文件方式、编程方式

    <!--gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>

    yml配置文件方式、 一、建module、改pom引入依赖

    <!--gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--eureka-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>

    二、改yml

    server: port: 9527 spring: application: name: cloud-gateway cloud: gateway: discovery: locator: enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由 routes: - id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名 uri: http://localhost:8001 #匹配后提供服务的路由地址 predicates: - Path=/payment/get/** #断言,路径相匹配的进行路由 - id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名 uri: http://localhost:8002 #匹配后提供服务的路由地址 predicates: - Path=/payment/lb/** #断言,路径相匹配的进行路 eureka: instance: hostname: cloud-gateway-service client: #服务提供者provider注册进eureka服务列表内 service-url: fetch-registry: true register-with-eureka: true defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版

    三、主启动

    @SpringBootApplication @EnableEurekaClient public class GateWayMain9527 { public static void main(String[] args) { SpringApplication.run(GateWayMain9527.class,args); } }

    编程方式 在原基础上建立Gatewayconfig类

    @Configuration public class Gatewayconfig { /* *配置了一个id为route-name的路由规则, * 当访问地址http://localhost:9527/guonei时会自动转发到地址:http://news.baidu.com/guonei * * */ @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){ RouteLocatorBuilder.Builder routes=routeLocatorBuilder.routes(); routes.route("path_route_zhutianlu",r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build(); return routes.build(); } @Bean public RouteLocator customRouteLocator2(RouteLocatorBuilder routeLocatorBuilder){ RouteLocatorBuilder.Builder routes=routeLocatorBuilder.routes(); routes.route("path_route_zhutianlu2",r -> r.path("/guoji").uri("http://news.baidu.com/guoji")).build(); return routes.build(); } }

    通过微服务实现动态路由功能 上面文件保持不变改变yml配置文件

    server: port: 9527 spring: application: name: cloud-gateway cloud: gateway: discovery: locator: enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由 routes: - id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名 #uri: http://localhost:8001 #匹配后提供服务的路由地址 uri: lb://cloud-payment-service #匹配后提供服务的路由地址 predicates: - Path=/payment/get/** #断言,路径相匹配的进行路由 - id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名 #uri: http://localhost:8002 #匹配后提供服务的路由地址 uri: lb://cloud-payment-service #匹配后提供服务的路由地址 predicates: - Path=/payment/lb/** #断言,路径相匹配的进行路由 eureka: instance: hostname: cloud-gateway-service client: #服务提供者provider注册进eureka服务列表内 service-url: fetch-registry: true register-with-eureka: true defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版

    Filter的使用 建立MyLogGateWayFilter类 实现GlobalFilter, Ordered接口 重写两个方法进行编码即可

    @Component @Slf4j public class MyLogGateWayFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("*********************come in MyLogGateWayFilter: "+new Date()); String uname = exchange.getRequest().getQueryParams().getFirst("uname"); if(uname == null){ log.info("************************用户名为null,非法用户,┭┮﹏┭┮"); exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } @Override public int getOrder() { return 0; } }

    predicate的使用详见 spring cloud gateway系列教程1—Route Predicate

    Processed: 0.012, SQL: 8