一、路由断言工厂
Spring Cloud Gateway matches routes as part of the Spring WebFlux
HandlerMapping
infrastructure. Spring Cloud Gateway includes many built-in route predicate factories. All of these predicates match on different attributes of the HTTP request. You can combine multiple route predicate factories with logicaland
statements.
Spring Cloud Gateway 断言工厂正如它官网的介绍,Gateway 包含许多内置的路由断言工厂,这些断言可以匹配到 http 请求不同的属性,可以说是在我们日常开发是绝对够用,而且我们还可以将不同的断言组合起来进行使用。
二、基础环境搭建
这里我们需要再搭建一个基础环境,不再去使用之前的商品、订单模块(因为还得启动 Eureka Server 集群)。
项目名称:microservice-service-normal-3000
pom
<!-- Web 支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
我们只需要添加 web 支持即可,其他的不需要了。
application.yml
server:
port: 3000
servlet:
context-path: /
tomcat:
uri-encoding: UTF-8
启动类
@SpringBootApplication
public class NormalApplication {
public static void main(String[] args) {
SpringApplication.run(NormalApplication.class, args);
}
}
业务代码
@RestController
@RequestMapping("/normal")
public class NormalController {
@GetMapping("/test/{id}")
public Map<String, Object> test(@PathVariable(value = "id") String id) throws Exception {
Map<String, Object> result = new HashMap<String, Object>();
result.put("code", 200);
result.put("id", id);
return result;
}
}
创建好之后,我们来测试一下。
三、After 路由断言规则
After 路由断言规则:匹配在指定日期时间之后发生的请求。
参数:参数很简单,就是一个时间参数,后面还有一个时区。(ps:中国所在的地方是东八区,所以是 +08:00)
gateway application.yml
spring:
cloud:
gateway:
routes:
- id: after_route
uri: http://localhost:3000/
predicates:
- After=2021-09-30T16:36:00.000+08:00[Asia/Shanghai]
启动 gateway 服务,来测试一下服务是否可以正常使用。(我当前写博客的时间是 2021年 9 月 30 日)
可以看到,这个服务是可以正常访问的,如果我们将 gateway 配置改成 2021-10-01 再试试看。
可以看到,直接 404 报错了。(这里出现 trace 报错是因为我们 Gateway 没有配置全局异常处理,默认的话是一个 HTML 页面,后面博客我们会说如何去配置全局异常处理)
四、Before 路由断言规则
Before 路由断言规则:匹配在指定日期时间之前发生的请求。
参数:参数和上面的 After 类似。
gateway application.yml
spring:
cloud:
gateway:
routes:
- id: before_route
uri: http://localhost:3000/
predicates:
- Before=2021-10-09T00:00:00.000+08:00[Asia/Shanghai]
重新启动 Gateway 网关,再来测试一下(我当前写博客的时间为 2021年10月8号)
现在我们将配置时间改成 2021-10-08 之前的一个日期(我这里改成 7 号,也就是昨天)
可以看到,将配置文件改成 10-07 后,我们的服务就没有办法进行正常访问了。(这里的访问显示可能不一样,我这里是因为配置了 Gateway 的全局异常,后面我们会去说)
五、Between 路由断言规则
Between 路由断言规则:匹配指定日期时间之间的请求。两个日期用 “,” 隔开
参数:日期开始,日期结束(这里千万要写对了,前面的日期一定要小于后面的日期!!!)
gateway application.yml
spring:
cloud:
gateway:
routes:
- id: between_route
uri: http://localhost:3000/
predicates:
- Between=2021-10-07T00:00:00.000+08:00[Asia/Shanghai], 2021-10-09T00:00:00.000+08:00[Asia/Shanghai]
我这里配置的是从 7 号开始到 9 号。重新启动 Gateway。
测试是可以通过的,如果我们将日期改成 6 - 7 号,再来看一下
服务是没有办法使用的。
六、Cookie 路由断言规则
Cookie 路由断言规则:匹配 Cookie 中是否存在对应的 name 和 regexp,regexp 可以是正则表达式。
参数:参数有两个,一个是 name,一个是 regexp,逗号隔开。
gateway application.yml
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: http://localhost:3000/
predicates:
- Cookie=chocolate, ch.p
配置说明:当 Cookie 中有 name 是 chocolate 的,value 可以匹配 “ch.p” 的请求,才可以请求进来。
ch.p:这个正则中的点是可以匹配一个字符,也就是 ch 啥 p,只要符合这个规则的都可以。这里的话提供一个正则表达式在线检测网站,自己去测试一下:正则表达式在线测试 | 菜鸟工具
这里我们在 postman 中添加一个 Cookie,domain 的话我们用的是 localhost。不会的可以去看一下我的另外一篇博客:接口调试工具 Postman 中使用 Cookie_胖子胖子大胖子的博客-CSDN博客我们在使用 Postman 的时候,难免会有使用到 Cookie 的时候。这里主要说一下,Postman 中如何添加 Cookie。首先是 Cookies,我们通过这个地方进行添加 Cookie。接着,我们需要添加一个 domain 的 name,了解 Cookie 的可能知道,这个 domain 就是域。一般情况下,我们这里都是添加的 localhost。添加好域之后,我们可以在域下面进行添加 Cookie,现在这个上面显示的 cookie_15 就是 cooki.https://blog.csdn.net/weixin_45908370/article/details/120652223
添加好之后,我们再来测试。
同样是可以的。自己去试试将 Cookie 中的 chocolate 的 value 值修改一下。
七、Header 路由断言规则
Header 路由断言规则:该匹配规则和 Cookie 类似,该路由规则也是由 name 和 regexp 组成,同样可以使用正则表达式。
参数:参数有两个,一个是 name,一个是 regexp,逗号隔开。
gateway application.yml
spring:
cloud:
gateway:
routes:
- id: header_route
uri: http://localhost:3000/
predicates:
- Header=token, \d+
这里的话是要匹配 Header 中的 token,如果有 token,并且 token 的值是一位或者是多位数字,即可以匹配到,其他的都不会匹配。
八、Host 路由断言规则
Host 路由断言规则:该规则是匹配请求时所使用的主机名,只有符合条件的主机名才可以进行请求。
参数:host 主机列表 patterns,这里的这个列表可以是一个数组,用逗号隔开即可。
gateway application.yml
spring:
cloud:
gateway:
routes:
- id: host_route
uri: http://localhost:3000/
predicates:
- Host=eureka2000.lemon1234.**,eureka2001.lemon1234.**
这里路由规则是匹配,当请求的 Host 以 eureka2000.lemon1234.**,或者是 eureka2001.lemon1234.** 开头的请求都可以进行匹配( ** 代表任意)。我们在之前学习搭建 Eureka 集群的时候配置过一次这个 hosts,这里就将就用它了,没有配过的自己去修改一下电脑的 hosts 文件。
当我们使用 eureka2000 这个域名访问的时候,就可以访问,再来看普通访问
直接 404,原因就是 Host 地址是不对的。
这一讲就讲到这里,有问题可以联系我:QQ 2100363119,欢迎大家访问我的个人网站:https://www.lemon1234.com
最近网站已经做好,并且已经上线,欢迎各位留言~~