目录
服务网关Gateway_三大核心概念
服务网关Gateway_入门案例
服务网关Gateway_路由规则
服务网关Gateway_Java API构建路由
服务网关Gateway_动态路由
服务网关Gateway_断言功能详解
路由(Route)
这是网关的基本构建块。它由一个ID,一个目标URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
断言(predicate)
输入类型是一个ServerWebExchange。我们可以使用它来匹配来自 HTTP请求的任何内容,例如headers或参数。
过滤(filter)
可以在请求被路由前或者之后对请求进行修改。
举个例子: 你想去动物园游玩,那么你买了一张熊猫馆的门票,只能进入熊猫馆的区域,而不能去犀牛管瞎转。因为没有犀牛馆的门票,进不去,就算走到门口,机器也不能识别。这里门票就相当于请求URL,熊猫馆相当于路由,而门口识别门卡的机器就是断言。然后我进入熊猫馆里面看到工作人员我想很有可能是过滤器,结果还真是,他在我进入馆之前拿手持设备对我全身扫描看看有没有危险品(请求前改代码),并且在我出熊猫馆之后要求再次检察看看我是否携带熊猫出馆(请求后改动代码)。这个工作人员相当于过滤器。
总结
首先任何请求进来,网关都会把它们拦住。根据请求的URL把它们分配到不同的路由上,路由上面会有断言,来判断请求能不能进来。进来之后会有一系列的过滤器对请求被转发前或转发后进行改动。 具体怎么个改动法,那就根据业务不同而自定义了。一般就是监控,限流,日志输出等等。
实时效果反馈
1.服务网关Gateway中路由作用是____。
A 路径匹配
B 匹配请求内容
C 被路由前或者之后对请求进行修改
D 以上都是错误
2.服务网关Gateway中断言作用是____。
A 路径匹配
B 匹配请求内容
C 被路由前或者之后对请求进行修改
D 以上都是错误
创建cloud-gateway-gateway9527工程
pom文件引入依赖
org.springframework.cloud
spring-cloud-starter-gateway
org.projectlombok
lombok
1.18.22
新增application.yml
server:
port: 9527
spring:
cloud:
gateway:
routes:
# 路由ID,没有固定规则但要求唯一,建议配合服务名
- id: payment_provider
# 匹配后提供服务的路由地址
uri: http://localhost:8001
# 断言
predicates:
# 路径相匹配的进行路由
- Path=/payment/get/**
主启动类
@Slf4j
@EnableEurekaClient
@SpringBootApplication
public class GatewayMain {
public static void main(String[] args) {
SpringApplication.run(GatewayMain.class,args);
log.info("********** GatewayMain 服务启动成功 *********");
}
}
测试
启动注册中心 7001,7002
启动服务提供者8001
启动网关服务9527
请求http://localhost:9527/payment/index
Gateway 的路由规则主要有三个部分,分别是路由、断言(谓词)和过滤器。
路由
路由是 Gateway 的⼀个基本单元。
断言
也称谓词,实际上是路由的判断规则。一个路由中可以添加多个谓词的组合。
提示: 打个比方,你可以为某个路由设置⼀条谓词规则,约定访问路径的匹配规则为 Path=/bingo/*,在这种情况下只有以 /bingo 打头的请求才会 被当前路由选中。
过滤器
Gateway 组件使用了⼀种 FilterChain的模式对请求进行处理,每⼀个服务请求(Request)在发送到目标标服务之前都要被⼀串 FilterChain处理。同理,在 Gateway接收服务响应(Response) 的过程中也会被 FilterChain 处理⼀把。
实时效果反馈
1.Spring Cloud Gateway 中断言主要作用_____。
A 判断规则
B 注册发现服务
C 过滤请求
D 以上都不是
代码注入RouteLocator
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
//设置路由
routes.route("path_rote",r -> r.path("/guonei").uri("http://news.baidu.com
/guonei")).build();
return routes.build();
}
}
测试
实时效果反馈
1.服务网关Gateway通过Java API构建时需要实现__接口构建路由规则。
A Route
B RouteLocator
C RouteLocatorBuilder
D Builder
默认情况下Gateway会根据注册中心的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能。
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
添加yml配置
spring:
cloud:
gateway:
routes:
# 路由ID,没有固定规则但要求唯一,建议配合服务名
- id: payment_provider
# 匹配后提供服务的路由地址 lb后跟提供服务的微服务的名
uri: lb://CLOUD-PAYMENT-PROVIDER
# 断言
predicates:
# 路径相匹配的进行路由
- Path=/payment/**
注意: 需要注意的是uri的协议lb,表示启用Gateway的负载均衡的功能。
服务提供者payemt8001和payment8002工程controller添加方法
@Value("${server.port}")
private String port;
/**
* 测试动态负载均衡
* @return
*/
@GetMapping("lb")
public String lb() {
return port;
}
测试
1、启动eureka服务注册发现 7001,7002
2、启动服务提供者payment8001,8002
3、启动网关服务测试
实时效果反馈
1.服务网关Gateway配置中lb指__。
A 过滤器
B 路由
C 目标地址
D 提供服务的微服务的名
一个请求在抵达网关层后,首先就要进行断言匹配,在满足所有断言之后才会进入Filter阶段。说白了Predicate就是一种路由规则, 通过Gateway中丰富的内置断言的组合,我们就能让一个请求找到对应的Route来处理。
After路由断言 Factory
After Route Predicate Factory采用一个参数——日期时间。在该日期时间之后发生的请求都将被匹配。
YML文件添加配置
predicates:
# 路径相匹配的进行路由
- Path=/payment/**
- After=2030-02-15T14:54:23.317+08:00[Asia/Shanghai]
注意: UTC时间格式的时间参数。
UTC时间格式的时间参数时间生成方法
public static void main(String[] args) {
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now);
}
Before路由断言 Factory
Before Route Predicate Factory采用一个参数——日期时间。在该日期时间之前发生的请求都将被匹配。
YML文件添加配置
predicates:
- Before=2030-02-15T14:54:23.317+08:00[Asia/Shanghai]
Between 路由断言 Factory
Between 路由断言 Factory有两个参数,datetime1和datetime2。 在datetime1和datetime2之间的请求将被匹配。datetime2参数的实际时间必须在datetime1之后。
predicates:
- Between=2030-02-15T14:54:23.317+08:00[Asia/Shanghai],2030-02-15T14:54:23.317+08:00[Asia/Shanghai]
Cookie路由断言 Factory
顾名思义,Cookie验证的是Cookie中保存的信息,Cookie断言和上面介绍的两种断言使用方式大同小异,唯一的不同是它必须连同属性值一同验证,不能单独只验证属性是否存在。
YML文件添加配置
predicates:
# 路径相匹配的进行路由
- Cookie=username,zzyy
使用postman测试
Header路由断言 Factory
这个断言会检查Header中是否包含了响应的属性,通常可以用来验证请求是否携带了访问令牌。
YML文件添加配置
# 请求头要有X-Request-Id属性并且值为整数的正则表达
式
predicates:
- Header=X-Request-Id, \d+
测试
Host路由断言 Factory
Host 路由断言 Factory包括一个参数:host name列表。使用Ant 路径匹配规则, . 作为分隔符。访问的主机匹配http或者https, baidu.com 默认80端口, 就可以通过路由。 多个 , 号隔开。
YML文件添加配置
predicates:
- Host=tong
Host文件新增配置
127.0.0.1 tong
Method路由断言 Factory
这个断言是专门验证HTTP Method的,在下面的例子中,我们把 Method断言和Path断言通过一个and连接符合并起来,共同作用于路由判断,当我们访问“/gateway/sample”并且HTTP Method是 GET的时候,将适配下面的路由。
YML文件添加配置
spring:
cloud:
gateway:
routes:
# 路由ID,没有固定规则但要求唯一,建议配合服务名
- id: payment_provider
# 匹配后提供服务的路由地址
uri: lb://CLOUD-PAYMENT-PROVIDER
# 断言
predicates:
# 路径相匹配的进行路由
- Path=/payment/**
- Method=GET
Query路由断言 Factory
请求断言也是在业务中经常使用的,它会从ServerHttpRequest中的Parameters列表中查询指定的属性,有如下两种不同的使用方式。
YML文件添加配置
spring:
cloud:
gateway:
routes:
# 路由ID,没有固定规则但要求唯一,建议配合服务名
- id: payment_provider
# 匹配后提供服务的路由地址
uri: lb://CLOUD-PAYMENT-PROVIDER
# 断言
predicates:
# 路径相匹配的进行路由
- Path=/payment/**
# 要有参数名称并且是正整数才能路由
- Query=username,\d+
测试
实时效果反馈
1.服务网关Gateway中在该日期时间之后发生的请求都将被匹配, 使用路由断言。
A After
B Before
C Cookie
D Header
2.服务网关Gateway中检查Header中是否包含了响应的属性,使用路由断言。
A After
B Before
C Cookie
D Header