category
学习思考
date
Jul 26, 2022
icon
Origin
password
slug
gateWay
status
Published
summary
关于服务网关的一些理解
tags
Tags
type
Post
URL
简介:
gateway是zuul1.x版本的替代
SpringCloud GateWay使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯组件。
Gateway是基于异步非阻塞模型上进行开发的,性能方面不需要担心,综合很多方面考虑,Gateway是十分理想的网关选择。
SpringCloud Gateway具有以下特性:
基于springFramework 5 、project reactor和Springboot2.0进行构建
动态路由:能够匹配任何请求属性;
可以对路由指定 Predicate(断言)和Filter(过滤器)
继承Hystrix的断路器功能
继承SpringCloud服务发现功能
易于编写的Predicate(断言)和Filter(过滤器)
请求限流功能
支持路径重写
三大核心概念:
Route(路由):
路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
Predicate(断言):
参考的是 java8 的java.util.function.Predicate
开发人员可以匹配 HTTP 请求中的所有内容(例如请求头或者请求参数),如果请求与断言匹配则进行路由
Filter(过滤器):
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求在路由前和之后对请求进行修改。
核心逻辑:
路由转发+执行过滤链
配置:
yml文件配置:
spring: application: name: cloud-gateway-service cloud: gateway: routes: - id: payment_routh#payment_route路由id,没有固定的规则,但是要求id唯一,建议配合服务名 uri: http://localhost:8001#匹配后提供路由的地址 predicates: - Path=/payment/get/** - id: payment_routh2 uri: http://localhost:8001 predicates: - Path=/payment/lb/**
代码中注入LoadLocator的Bean
以转发百度国内新闻为例,代码如下:
@Configuration public class GateWayConfig { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){ RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes(); routes.route("path_route_atliujixue1",r -> r.path("/guonei").uri("https://news.baidu.com/guonei")).build(); return routes.build(); } }
GateWay配置动态路由:
默认情况下GateWay会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由并进行转发,从而实现动态路由的功能。
新增yml配置如下:
cloud: gateway: discovery: locator: enabled: true#开启注册中心动态配置路由的功能,利用微服务名进行路由 routes: - id: payment_routh#payment_route路由id,没有固定的规则,但是要求id唯一,建议配合服务名 #uri: http://localhost:8001 #匹配后提供路由的地址 uri: lb://cloud-payment-service predicates: - Path=/payment/get/** - id: payment_routh2 #uri: http://localhost:8001 uri: lb://cloud-payment-service predicates: - Path=/payment/lb/**
开启注册中心动态配置路由功能,更改uri,lb是负载均衡的意思,cloud-payment-service是在Eureka注册中心的服务名称。
Predicate的使用:
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包含许多内置的RoutePredicateFactory。
常用的RoutePredicate:
After Route Predicate:
在predicate配置下新增:
- After=2022-07-27T15:47:01.216+08:00[Asia/Shanghai]这样的时间格式配置,如下routes: - id: payment_routh#payment_route路由id,没有固定的规则,但是要求id唯一,建议配合服务名 #uri: http://localhost:8001 #匹配后提供路由的地址 uri: lb://cloud-payment-service predicates: - Path=/payment/get/** - After=2022-07-27T15:47:01.216+08:00[Asia/Shanghai]
Before Route Predicate:
在predicate配置下新增:
- Before=2022-07-27T15:47:01.216+08:00[Asia/Shanghai]这样的时间格式配置Between Route Predicate:
两个时间之间使用” , ”进行隔离
Cookie Route Predicate:
需要两个参数,一个是Cookie name 一个是 正则表达式。路由规则会根据对应的Cookie name和正则表达式去匹配,如果匹配上就会执行路由,如果没匹配上则不执行
predicates: - Path=/payment/get/** - After=2022-07-27T15:47:01.216+08:00[Asia/Shanghai] - Cookie=username,liujixue
Header Route Predicate:
和cookie差不多,一个是名字,一个是正则表达式
- Header=X-Request-Id,\d+ #请求头要有X-Request-Id属性并且是整数GateWay的filter:
路由过滤器可以用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。Spring Cloud Gateway内置了多种路由过滤器,他们都由GatewayFilter的工厂类进行产生。
生命周期:
pre、post
种类:
GatewayFilter(单一的)、GlobalFilter(全局的)
自定义过滤器:
两个主要接口:
GlobalFilter,Order新建配置类,实现上述接口,代码如下:
@Component @Slf4j public class MylLogGateWayFilter implements GlobalFilter,Order { @Override public Class<? extends Annotation> annotationType() { return null; } @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 value() { return 0; } }
- 作者:LiuJixue
- 链接:https://liujixue.cn/article/gateWay
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。





