8.4.2 YML配置说明
1.==在配置文件yml中配置:==见前面的步骤
2.代码中注入RouteLocator的Bean
百度国内新闻网址:http://news.baidu.com/guonei
业务需求:通过9527网关访问到外网的百度新闻网址
- 在cloud-gateway-gateway9527上进行编码
@Configuration public class GateWayConfig { /** * 配置了一个id为route-name的路由规则, * 当访问地址 http://localhost:9527/guonei时会自动转发到地址:http://news.baidu.com/guonei * @param builder * @return */ @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){ RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes(); routes.route("path_route_rg",r->r.path("/lady").uri("https://news.baidu.com/lady")). route("path_route_rg2",r->r.path("/guonei").uri("https://news.baidu.com/guonei")). build(); return routes.build(); } }
- 测试:
8.5 通过微服务名实现动态路由
默认情况下Gateway会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能
修改YML
lb://serviceName是spring cloud gateway在微服务中自动为我们创建的负载均衡uri
uri的协议为lb,表示启用Gateway的负载均衡功能。
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 #匹配后提供服务的路由地址 lb://表示基于服务注册的负载均衡 predicates: Path=/payment/get/** #断言, 路径相匹配的进行路由 - id: payment_routh2 # payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名 #uri: http://localhost:8001 #匹配后提供服务的路由地址 uri: lb://cloud-payment-service #匹配后提供服务的路由地址 predicates: - Path=/payment/lb/** #断言, 路径相匹配的进行路由 eureka: instance: hostname: cloud-gateway-service client: #服务提供者provider注册进eureka服务列表内 service-url: register-with-eureka: true fetch-registry: true #defaultZone: http://eureka7001.com:7001/eureka defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7004.com:7004/eureka # 集群版
测试: 访问http://localhost:9527/payment/lb ,8001/8002两个端口不断地切换
8.6 Predicate的使用
8.6.1 是什么
启动我们的gateway9527
8.6.2 Route Predicate Factories这个是什么东东?
Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分。
Spring Cloud Gateway包括许多内置的Route Predicate工厂。所有这些Predicate都与HTTP请求的不同属性匹配。多个Route Predicate工厂可以进行组合
Spring Cloud Gateway 创建 Route 对象时, 使用 RoutePredicateFactory 创建 Predicate 对象,Predicate 对象可以赋值给 Route。 Spring Cloud Gateway 包含许多内置的Route Predicate Factories。
所有这些谓词都匹配HTTP请求的不同属性。多种谓词工厂可以组合,并通过逻辑and。
8.6.3 常用的Route Predicate
- After Route Predicate
如何获得是时区时间串串
@Test public void test01(){ ZonedDateTime now = ZonedDateTime.now(); System.out.println(now); }
- Before Route Predicate
- Between Route Predicate
- Cookie Route Predicate
不带cookie访问: curl http://localhost:9527/payment/lb
带cookie访问:curl http://localhost:9527/payment/lb --cookie “username=xxyy”
- Header Route Predicate
不带请求头: curl http://localhost:9588/paymentInfo
携带请求头:curl http://localhost:9527/payment/lb -H “X-Request-Id:123”
- Host Route Predicate
- Method Route Predicate
- Path Route Predicate
- Query Route Predicate
- ALL小总结
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:8001 #匹配后提供服务的路由地址 uri: lb://cloud-payment-service #匹配后提供服务的路由地址 predicates: - Path=/payment/lb/** # 断言,路径相匹配的进行路由 - After=2020-02-05T15:10:03.685+08:00[Asia/Shanghai] # 断言,路径相匹配的进行路由 #- Before=2020-02-05T15:10:03.685+08:00[Asia/Shanghai] # 断言,路径相匹配的进行路由 #- Between=2020-02-02T17:45:06.206+08:00[Asia/Shanghai],2020-03-25T18:59:06.206+08:00[Asia/Shanghai] #- Cookie=username,zzyy #- Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式 #- Host=**.atguigu.com - Method=GET - Query=username, \d+ # 要有参数名username并且值还要是整数才能路由 eureka: instance: hostname: cloud-gateway-service client: #服务提供者provider注册进eureka服务列表内 service-url: register-with-eureka: true fetch-registry: true defaultZone: http://eureka7001.com:7001/eureka #id:我们自定义的路由 ID,保持唯一 ##uri:目标服务地址 ##predicates:路由条件,Predicate接受一个输入参数返回一个布尔值。 ## 该属性包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)
说白了,Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理。
8.7 Filter的使用
8.7.1 是什么?
路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。
Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生
8.7.2 Spring Cloud Gateway的Filter
生命周期,Only Two:
- pre
- post
种类,Only Two
- GatewayFilter
31种之多。。。。。
- GlobalFilter
8.7.3 常用的GatewayFilter
以AddRequestParameter为例
8.7.4 自定义过滤器
自定义全局GlobalFilter
- 实现两个接口
implements 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,非法用户,o(╥﹏╥)o"); exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);//设置状态码 return exchange.getResponse().setComplete(); } return chain.filter(exchange); } @Override public int getOrder() { return 0; } }
- 测试
携带uname时,http://localhost:9527/payment/lb?uname=lxy 正常访问
没有参数uname时,无法正常使用转发