文章目录
- 前言
- 1.gateway API 网关
- 2.gateway网关的关键词汇
- 1)Route 路由
- 2)Predicate 断言
- 3)Filter 过滤器
- 4.项目搭建
- 5.gateway网关详细使用说明
- 5.1初次体验使用
- 5.2路由(uri)使用
- 固定路由:
- 动态路由:
- 5.3断言(predicates)使用
- 1)After:配置在某个时间之后转发路由
- 2)Before:配置在某个时间之前转发路由
- 3)Between:配置在时间范围内转发路由
- 4)Cookie:cookie值判断转发路由
- 5)Header:Header值判断转发路由
- 6)Host: 配置Host值转发路由
- 7)Method:配置请求方式转发路由
- 8)Path:配置请求路径转发路由
- 9)Query:配置请求参数转发路由
- 10)RemoteAddr:配置远程地址转发路由
- 11)Weight:权重转发路由
- 12)断言的组合使用
- 5.4过滤器(Filters)使用
- GatewayFilter网关过滤器
- 1)RewritePath:重写请求路径
- 2)PrefixPath:追加路径前缀
- 3)StripPrefix:切割路径
- 全局网关过滤器
前言
学习总结都是在gateway官网的api文件学习:
https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#configuration-properties 什么是网关?网关有什么用?有什么好处?可以做什么?处理什么问题?这些我不说了,我这里主要说是怎么使用。
1.gateway API 网关
简单理解:API网关是一个服务器,是系统的唯一入口
2.gateway网关的关键词汇
1)Route 路由
网关的基本构建块。它由ID,目标URI,断言集合(predicates)和过滤器集合(filters)定义。如果聚合断言为true,则匹配路由。
2)Predicate 断言
输入类型是Spring FrameworkServerWebExchange
。这使您可以匹配HTTP请求中的所有内容,例如标头或参数。
3)Filter 过滤器
这些是使用特定工厂构造的Spring FrameworkGatewayFilter
实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。
4.项目搭建
看文章:微服务-创建springcloud项目框架
5.gateway网关详细使用说明
5.1初次体验使用
1)在gateway服务配置写上这个,然后直接启动服务
spring:
cloud:
gateway:
routes:
- id: test
uri: https://example.org/
predicates:
- Path=/test
2)打开浏览器输入:http://127.0.0.1:8180/test 就会转发到:https://example.org/test
5.2路由(uri)使用
uri就是网关要代理地址
固定路由:
固定路由就是直接配置转发地址,就是那些请求转发到这个服务器地址,只能是单一
动态路由:
动态路由是针对注册中心使用的,网关服务注册到注册中心,然后使用微服务的名字来转发,当服务有多个的时候,就可以达到负载均衡的作用
例如:
uri: lb://server1
5.3断言(predicates)使用
1)After:配置在某个时间之后转发路由
所述After
路由,只有一个参数datetime
(类型是Java 的ZonedDateTime
对象)。predicates匹配在指定日期时间之后发生的请求。
中国的时区是:Asia/Shanghai
下面的示例配置路由:
意思是在2020年10月20号之后就会转发,时间没到就不会转发到https://example.org
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- After=2020-10-20T00:00:00.000+08:00[Asia/Shanghai]
2)Before:配置在某个时间之前转发路由
所述Before
路由,只有一个参数datetime
(类型是Java 的ZonedDateTime
对象)。predicates匹配在指定日期时间之前发生的请求。
中国的时区是:Asia/Shanghai
下面的示例配置路由:
意思是在2020年10月20号之前就会转发,时间过了就不会转发到https://example.org
spring:
cloud:
gateway:
routes:
- id: before_route
uri: https://example.org
predicates:
- Before=2020-10-20T00:00:00.000+08:00[Asia/Shanghai]
3)Between:配置在时间范围内转发路由
所述Between
路由,有两个参数,datetime1
并且datetime2
(类型是Java的ZonedDateTime
对象)。predicates匹配是指时间datetime1
和时间datetime2
之间。
下面的示例配置路由:
意思是在2020年10月20号和2020年10月21号之间才会转发,时间不在范围之内就不会转发到https://example.org
spring:
cloud:
gateway:
routes:
- id: between_route
uri: https://example.org
predicates:
- Between=2020-10-20T00:00:00.000+08:00[Asia/Shanghai],2020-10-21T00:00:00.000+08:00[Asia/Shanghai]
4)Cookie:cookie值判断转发路由
所述Cookie
路由,有两个参数,该cookie的name
和regexp
(regexp
就是value,支持Java正则表达式),predicates匹配是指cookie的值是不是匹配。
下面的示例配置路由:
意思是cookie值的token等于123才会转发到https://example.org
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: https://example.org
predicates:
- Cookie=token, 123
注:想要多个cookie值匹配,就多配几个:- Cookie=token, 123,如下
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: https://example.org
predicates:
- Cookie=token, 0
- Cookie=token1, 1
- Cookie=token2, 2
5)Header:Header值判断转发路由
所述Header
路由,有两个参数,该Header的name
和regexp
(regexp
就是value,支持Java正则表达式),predicates匹配是指Header的值是不是匹配。
下面的示例配置路由:
意思是Header头X-Request-Id等于数字(一个或者多个)才会转发到https://example.org
spring:
cloud:
gateway:
routes:
- id: header_route
uri: https://example.org
predicates:
- Header=X-Request-Id, \d+
注:想要多个Header值匹配,就多配几个:- Header=X-Request-Id, \d+
6)Host: 配置Host值转发路由
所述Host
路由,有一个参数,主机名的列表patterns(多个列名用逗号隔开),predicates匹配是指与Host匹配模式的标头匹配。
下面的示例配置路由:
spring:
cloud:
gateway:
routes:
- id: host_route
uri: https://example.org
predicates:
- Host=**.somehost.org,**.anotherhost.org
7)Method:配置请求方式转发路由
所述Method
路由,有一个参数,断言需要methods的参数(POST,GET),它是一个或多个参数:predicates匹配是指HTTP方法来匹配。
下面的示例配置路由:
意思是请求方式是POST或者是GET才会转发到https://example.org
spring:
cloud:
gateway:
routes:
- id: method_route
uri: https://example.org
predicates:
- Method=GET,POST
8)Path:配置请求路径转发路由
所述Path
路由,有一个参数(多个path用逗号分隔)
下面的示例配置路由:
意思是请求路径是/a/xx和/b/xx,(例如/a/test,/b/test/123)才会转发到https://example.org ,并把路径追加到后面(https://example.org/a/test 或者 https://example.org/b/test/123)
spring:
cloud:
gateway:
routes:
- id: path_route
uri: https://example.org
predicates:
- Path=/a/**,/b/**
9)Query:配置请求参数转发路由
所述Query
路由,有两个参数,该Query的name
和regexp
(regexp
就是value,支持Java正则表达式),predicates匹配是指请求的参数的值是不是匹配。
下面的示例配置路由:
意思是请求参数值的green等于数字才会转发到https://example.org
spring:
cloud:
gateway:
routes:
- id: Query_route
uri: https://example.org
predicates:
- Query=green,\d+
注:多个参数就写多个- Query=green,\d+
如果不想出参数值有限制,可以不写:- Query=green
10)RemoteAddr:配置远程地址转发路由
所述RemoteAddr
路由,有一个参数
如192.168.0.1/16(其中192.168.0.1是一个IP地址和16一个子网掩码)
下面的示例配置路由:
spring:
cloud:
gateway:
routes:
- id: RemoteAddr_route
uri: https://example.org
predicates:
- RemoteAddr=127.0.0.1
11)Weight:权重转发路由
下面的示例配置路由:
这条路线会将大约80%的流量转发到weighthigh.org,将大约20%的流量转发到weightlow.org。
spring:
cloud:
gateway:
routes:
- id: weight_high
uri: https://weighthigh.org
predicates:
- Weight=group1, 8
- id: weight_low
uri: https://weightlow.org
predicates:
- Weight=group1, 2
12)断言的组合使用
请求需要满足,请求方式是POST,路径是/a/xx,带参数green,参数是数字,cookie值是token-1,才会路由到https://example.org
spring:
cloud:
gateway:
routes:
- id: all_route
uri: https://example.org
predicates:
- Method=POST
- Path=/a/**
- Query=green,\d+
- Cookie=token, 1
5.4过滤器(Filters)使用
spring cloud gateway的过滤器作用范围划分为GatewayFilter
和GlobalFilter
,二者区别:
- GatewayFilter:网关过滤器
通过spring.cloud.routes.filters
配置在具体路由下,只作用在当前路由
通过spring.cloud.default-filters
配置在全局,只作用在所有路由上 - GlobalFilter:全局过滤器
不需要在配置文件中配置,作用在所用的路由上,最终通过GatewayFilterAdapter
包装成GatewayFilterChain
可识别的过滤器,它为请求业务以及路由的URI转换成真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上。
过滤器太多了,我这边选出几个常用的
GatewayFilter网关过滤器
1)RewritePath:重写请求路径
对于的请求路径/red/blue
,这会将路径设置为/blue
发出下游请求之前的路径
spring:
cloud:
gateway:
routes:
- id: rewritepath_route
uri: https://example.org
predicates:
- Path=/red/**
filters:
- RewritePath=/red(?<segment>/?.*), $\{segment}
2)PrefixPath:追加路径前缀
这将/mypath
作为所有匹配请求的路径的前缀。因此,/hello
将向发送请求/mypath/hello
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: https://example.org
filters:
- PrefixPath=/mypath
3)StripPrefix:切割路径
通过网关/name/blue/red
发出请求时,发出的请求nameservice
看起来像nameservice/red
spring:
cloud:
gateway:
routes:
- id: nameRoot
uri: https://nameservice
predicates:
- Path=/name/**
filters:
- StripPrefix=2
全局网关过滤器
第一步:实现接口GlobalFilter, Ordered
第二步:@Component
添加到组件里,就是注入到bean
也可以在启动类上加:
@Bean
public GlobalFilter customFilter() {
return new CustomGlobalFilter();
}
样例实现:
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {
/**
* 过滤器业务逻辑
*
* @param exchange
* @param chain
* @return
*/
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("custom global filter");
return chain.filter(exchange);
}
/**
* 过滤器执行顺序,数值越小,优先级越高
* @return
*/
@Override
public int getOrder() {
return 0;
}
}