前言:
目前咱们对“java怎么引用gatway里面的类”大概比较珍视,看官们都需要剖析一些“java怎么引用gatway里面的类”的相关内容。那么小编也在网摘上收集了一些对于“java怎么引用gatway里面的类””的相关文章,希望大家能喜欢,朋友们一起来学习一下吧!欢迎关注头条号:老顾聊技术
精品原创技术分享,知识的组装工
目录前言项目依赖配置代码实现路由规则总结前言
前篇我们介绍了Gateway的由来,这一篇我们介绍一下Gateway的使用,希望能够帮到小伙伴们。
Gateway网关路由有两种配置方式:
1、在配置文件yml中配置
2、代码中注入RouteLocator的Bean
这两种方式是等价的,建议使用yml配置方式
项目依赖
我们采用最新的版本
因为Gateway使用的是Netty + webflux,所以不需要引入web模块;只要引入spring-cloud-starter-gateway就行了,里面包含了spring-boot-starter-webflux
注:什么是webflux,老顾以后介绍
配置
属性含义如下:
id:我们自定义的路由 ID,保持唯一
uri:目标服务地址
predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该属性包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)
请求效果
上面这段配置的意思是,配置了一个id为route-name的路由规则,当访问地址 时会自动转发到地址:
代码实现
效果和配置方式是一样的。
上面我们简单的用两个案例演示了Gateway的路由转发,下面我们详细介绍一下路由规则。
路由规则
Spring Cloud Gateway 的功能很强大,前面我们只是使用了 predicates 进行了简单Path的条件匹配,其实Gataway帮我们内置了很多 Predicates功能。
在项目启动日志中,我们就能发现有很多PredicateFactory。Gateway 是通过Spring WebFlux的HandlerMapping做为底层支持来匹配到转发路由,这些 Predicates 工厂通过不同的HTTP请求参数来匹配,多个 Predicates 工厂可以组合使用。
Predicate 介绍
Predicate 来源于 Java 8,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
在 Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则,有通过 Header、请求参数等不同的条件来进行作为条件匹配到对应的路由。
网上有一张图总结了 Spring Cloud 内置的几种 Predicate 的实现。
上图中,很清晰的说明了各个工厂的规则,说到底Predicate就是为了实现一组匹配规则,方便让请求过来找到对应的 Route 进行处理。
时间匹配
Gateway支持设置一个时间,在请求进行转发的时候,可以通过判断在这个时间之前或者之后进行转发。比如我们现在设置只有在2019年9月10日才会路由转发,在这之前不进行转发,我就可以这样配置:
上面的配置After属性,设置时间,代表在这时间之后才能匹配;我们设置的是2019-9-10,这里的时间通过ZonedDateTime来对时间进行的对比,ZonedDateTime 是 Java 8 中日期时间功能里,用于表示带时区的日期与时间信息的类,ZonedDateTime 支持通过时区来设置时间,中国的时区是:Asia/Shanghai。
上面的示例是指,请求路径为/get,且请求时间在 2019年9月10日0点0分0秒之后的所有请求都转发到地址。+08:00是指时间和UTC时间相差八个小时,时间地区为Asia/Shanghai。
添加完路由规则之后,如果当地时间为9月4日访问地址不会转发,如果是9月10日会自动转发到。
Before Route Predicate 刚好相反,在某个时间之前的请求都进行转发。
我们把上面路由规则中的 After 改为 Before,如下:
就表示在这个时间之前可以进行路由,在这时间之后停止路由。
有了时间前与时间后,当然就会有时间之间Between,如下:
意思一看就能看出,在两时间之间即可路由,不在不可路由。
Cookie 匹配
Cookie Route Predicate 可以接收两个参数,一个是 Cookie name ,一个是正则表达式,路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。
不带cookies访问
curl //不带cookies
返回404
{"timestamp":"2019-09-04T09:28:45.726+0000","path":"/get","status":404,"error":"Not Found","message":null}
带上cookies访问,且userId为1
curl --cookie "userId=1"
返回正常
Header 匹配
Header Predicate 和 Cookie Predicate 一样,也是接收 2 个参数,一个 header 中属性名称和一个正则表达式,这个属性值和正则表达式匹配则执行。
上面的意思,就是请求头要有token属性,并且值为整数的正则表达式
curl -H "token:12"
返回正常,将参数-H "token:12"改为-H "token:hello"再次执行时返回404证明没有匹配。
下面老顾就介绍快点,因为比较简单,一通百通
Host 匹配
Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板,用.号作为分隔符。它通过参数中的主机地址作为匹配规则。
predicates: - Host=**.toutiao.com
请求匹配上的
curl -H "Host: " curl -H "Host: md.toutiao.com"请求方式匹配
通过请求的方式是 POST、GET、PUT、DELETE 等进行路由。
predicates: - Method=GET //或者POST,PUT请求路径匹配
Path Route Predicate 接收一个匹配路径的参数来判断是否走路由。
predicates: - Path=/get/{segment}
如果请求路径符合要求,则此路由将匹配,例如:/get/1 或者 /get/bar。
请求参数匹配
Query Route Predicate 支持传入两个参数,一个是属性名,一个为属性值,属性值可以是正则表达式。
predicates: - Query=token
只有属性名token,表示只要有token参数就行,不管值为多少,即可路由
predicates: - Query=token, \d+
表示不但要有参数名token,值还要是整数才能路由
请求 ip 地址匹配
通过设置某个 ip 区间号段的请求才会路由,RemoteAddr Route Predicate 接受 cidr 符号(IPv4 或 IPv6 )字符串的列表(最小大小为1),例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是子网掩码)。
predicates: - RemoteAddr=192.168.1.1/24
如果请求的远程地址是 192.168.1.10,则此路由将匹配。
组合使用
predicates: - Host=**.toutiao.com - Path=/get - Method=GET - Query=token - After=2019-01-20T06:06:06+08:00[Asia/Shanghai]
各种 Predicates 同时存在于同一个路由时,请求必须同时满足所有的条件才被这个路由匹配
总结
老顾今天主要聊了Gateway的基础路由规则,当然我们也可以自定义predicates。下一篇我们就进入高级篇,主要介绍Gateway的filter、熔断以及限流等。
---End---
最近老顾上传了微服务网关的分享课程,请大家多多支持
推荐阅读
1、Gateway网关系列开篇:SpringCloud的官方网关Gateway介绍
2、API网关在微服务架构中的应用,这一篇就够了
3、学习Lambda表达式看这篇就够了,不会让你失望的哦(续篇)
4、Lambda用在哪里?几种场景?
5、为什么会出现Lambda表达式,你知道吗?
6、不说“分布式事务”理论,直接上大厂阿里的解决方案,绝对实用
7、女程序员问到这个问题,让我思考了半天,Mysql的“三高”架构
8、大厂二面:CAP原则为什么只能满足其中两项?而不能同时满足
9、阿里P7二面:聊聊零拷贝的原理
10、秒杀系统的核心点都在这里,快来取
11、你了解如何利用token方式实现分布式Session吗?
12、Mysql索引结构演变,为什么最终会是那个结构呢?让你一看就懂
13、一场比赛涉及到的知识,用通俗易通的方式介绍并发协调
14、企业实战Redis全方面思考,你思考了吗?
15、面试题:Thread的start和run的区别
16、面试题:什么是CAS?CAS的作用以及缺点
17、如何访问redis中的海量数据?避免事故产生
18、如何解决Redis热点问题?以及如何发现热点?
19、如何设计API接口,实现统一格式返回?
20、你真的知道在生产环境下如何部署tomcat吗?
21、分享一线互联网大厂分布式唯一ID设计 之 snowflake方案
22、分享大厂分布式唯一ID设计方案,快来围观
23、你想了解一线大厂的分布式唯一ID生成方案吗?
24、你知道如何处理大数据量吗?(数据拆分篇)
25、如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇)
26、你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?
27、你了解大型网站的页面静态化吗?
28、你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?
29、你知道怎么解决DB读写分离,导致数据不一致问题吗?
30、DB读写分离情况下,如何解决缓存和数据库不一致性问题?
31、你真的知道怎么使用缓存吗?
32、如何利用锁,防止缓存击穿?重构思想的重要性
33、海量订单产生的业务高峰期,如何避免消息的重复消费?
34、你知道如何保障生产端100%消息投递成功吗?
35、微服务下的分布式session该如何管理?
36、阿里二面:filter、interceptor、aspect应如何选择?很多人中招
37、互联网架构重要组员CDN,很多高级开发都没有实操过,来看这里
38、阿里二面:CDN缓存控制原理,看看能不能难住你
标签: #java怎么引用gatway里面的类