INDEX
- §1 官网与简介
- §2 简单使用(路由)
- §3 常用断言
- §3.1 path
- §3.2 query
- §3.3 method
- §3.4 header
- §3.5 cookie
- §3.6 时间
- §4 过滤器
- §4.1 预设过滤器(TODO)
- §4.2 自定义过滤器(TODO)
§1 官网与简介
Zuul
Gateway
This project provides a library for building an API Gateway on top of Spring WebFlux. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as: security, monitoring/metrics, and resiliency.
特性:
- Built on Spring Framework 5, Project Reactor and Spring Boot 2.0
- Able to match routes on any request attribute
- Predicates and filters are specific to routes
- Circuit Breaker integration
- Spring Cloud DiscoveryClient integration
- Easy to write Predicates and Filters
- Request Rate Limiting
- Path Rewriting
对比:
- 由 Springcloud 团队打造,天然亲和 Springcloud 生态,更新和社区更友好
- 底层使用 webflux(相比web mvc 非阻塞) 的 reactor-netty 响应式编程组件,zuul 底层是基于 servlet 的阻塞式 I/O,高并发上有优势
- 整合 Spring5 / project reactor / springboot / websocket 等
网关在微服务架构中的位置
组成、工作流程和作用:
网关由路由、断言、过滤器构成:
- 断言:起比较作用,可以比较请求的所有部分,比较后匹配的由路由处理
- 路由:由 ID 、url、断言、过滤器组成,最终由它决定请求交给哪个服务接口处理
- 过滤:由 spring gateway filter 实例实现,可以在请求前后进行一些操作,比如请求重写
通过上述组件可以实现:
- 反向代理
- 鉴权
- 流量控制
- 熔断
- 日志监控
- 重写
§2 简单使用(路由)
依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId></dependency>
注意,网关的使用需要 排除 下面两个依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency>
配置
YML 方式
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 uri: lb://cloud-payment-service #配置 spring.cloud.gateway.discovery.locator.enabled = true后,可以使用服务名作为服务地址 predicates: - Path=/payment/lb/**
Configuration 方式
@Configurationpublic class GatewayRoutelocatorConfig { @Bean RouteLocator routeLocator(RouteLocatorBuilder builder){ RouteLocatorBuilder.Builder routes = builder.routes(); routes.route("n", r->r.path("/").uri("http://www.gamersky.com/")); return routes.build(); }}
§3 常用断言
由 RoutePredicateFactory 实现
§3.1 path
Path 路由断言工厂接收一个参数,根据 Path 定义好的规则来判断访问的 URI 是否匹配。
spring: cloud: gateway: routes: - id: host_route uri: http://c.biancheng.net predicates: - Path=/blog/detail/{segment}
如果请求路径为 /blog/detail/xxx,则此路由将匹配。也可以使用正则,例如 /blog/detail/** 来匹配 /blog/detail/ 开头的多级 URI。
path 断言匹配成功后会将断言部分拼接上 uri 作为实际请求路径
即,若断言为 /a,那实际路径一定是 http://…/a
示例
http://localhost:9527/blog/detail/36185 –>
http://c.biancheng.net/blog/detail/36185
§3.2 query
Query 路由断言工厂接收两个参数
- 一个必需的参数,用于匹配请求中的 query 字段
- 一个可选的正则表达式,用于匹配请求中的 query 字段的值
spring: cloud: gateway: routes: - id: query_route uri: http://c.biancheng.net predicates: - Query=foo, ba.
示例
http://localhost:2001/?foo=baz
§3.3 method
Method 路由断言工厂接收一个参数,匹配的是 http 的 method
spring: cloud: gateway: routes: - id: method_route uri: http://baidu.com predicates: - Method=GET
§3.4 header
Header 路由断言工厂接收两个参数
- 一个必需的参数,用于匹配请求中的请求头名称
- 一个可选的正则表达式,用于匹配请求中的请求头的值
spring: cloud: gateway: routes: - id: header_route uri: http://example.org predicates: - Header=X-Request-Id, \d+
§3.5 cookie
cookie 路由断言工厂接收两个参数
- 一个必需的参数,用于匹配请求中的 cookie 名
- 一个可选的正则表达式,用于匹配请求中的 cookie 的值
spring: cloud: gateway: routes: - id: query_route uri: http://c.biancheng.net predicates: - Cookie=chocolate, ch.p
§3.6 时间
时间匹配规定路由路由规则生效的时间范围,有三种模式
- Before
- After
- Between
时间格式要求为带有时区的时间戳,对应 ZoneDateTime
spring: cloud: gateway: routes: - id: query_route uri: http://c.biancheng.net predicates: - Between=2022-01-20T17:42:47.789-07:00[Asia/Shanghai],2023-01-20T17:42:47.789-07:00[Asia/Shanghai]
§4 过滤器
由 GatewayFilterFactroies 实现,原理和 servlet 的 filter 类似。
filter 分为两类
- gateway filter
- global filter
§4.1 预设过滤器(TODO)
§4.2 自定义过滤器(TODO)
加入类扫描,实现默认接口
- GlobalFilter 全局过滤接口
- Order 用于指定优先级
注意 Gateway 的 filter 可以实现拦截器的功能
@Component@Slf4jpublic class TestGlobalFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("<<>> start"); String name = exchange.getRequest().getQueryParams().getFirst("name"); if(StringUtils.isEmpty(name)){ log.info("<<>> no-name"); exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); exchange.getResponse().setComplete(); } return chain.filter(exchange); } @Override public int getOrder() { return 0; }}
本文部分内容来自 Spring Cloud Gateway的常用路由断言工厂
传送门:
微服务架构 | 组件目录