文章已收录到我的Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary介绍服务网关要认识一样东西,最好的方法是从为什么需要他开始说起 。
按照现在主流使用微服务架构的特点,假设现在有A、B、C三个服务,假如这三个服务都需要做一些请求过滤和权限校验,请问怎么实现?
- 每个服务自己实现一遍 。
- 写在一个公共的服务,然后让A、B、C服务引入公共服务的Maven依赖 。
- 使用服务网关,所有客户端请求服务网关进行请求过滤和权限校验,然后再路由转发到A、B、C服务 。
所以显而易见,使用服务网关则解决了以上的问题,其他服务不需要加入什么依赖,只需要在网关配置一些参数,然后就能路由转发到对应的后端服务,如果需要请求过滤和权限检验的话,都可以在网关层实现,如果需要更新权限校验的逻辑,只需要网关层修改就可以,其他后端服务不需要修改 。
接下来再介绍一下服务网关的功能,主要有:
- 路由转发
- API监控
- 权限控制
- 限流
GateWay入门首先第一步需要创建一个作为网关的项目,这里使用的SpringBoot版本是2.0.1,引入依赖:
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
我们需要使用网关转发请求,那么首先需要有个后端服务,这里我简单地创建了一个user项目 。然后启动user项目,写个获取所有用户信息的接口:文章插图
那么我们现在配置网关的Application.yml实现请求转发 。
server:port: 9201spring:application:name: api-gatewaycloud:gateway:routes:- id: user_getList #路由的IDuri: http://localhost:8080/user/getList #最终目标的请求地址predicates: #断言- Path=/user/getList #路径相匹配的进行路由
也就是说我请求http://localhost:9201/user/getList后,9201端口是网关服务,会匹配/user/getList的路由,最终转发到目标地址http://localhost:8080/user/getList 。文章插图
这就算是gateway网关的简单使用了 。
继续深入在上面入门的例子中,我们注意到有个predicates的配置,有点对其似懂非懂的感觉 。中文翻译过来叫做断言,有点类似于JAVA8的Stream流里的Predicate函数的意思 。如果断言是真的,则匹配路由 。
除此之外,gateway的另一个核心是Filter(过滤器),Filter有全局和局部两种 。那么整个gateway的流程是怎么样的呢?请看下图:
文章插图
从图中可以看出,gateway的两大核心就是断言(Predicate)和过滤(Filter),接下来我们重点讲讲这两者的使用 。
Route Predicate 的使用Spring Cloud Gateway包括许多内置的Route Predicate工厂,所以可以直接通过配置直接使用各种内置的Predicate 。
After Route Predicate在指定的时间之后请求匹配该路由 。
spring:cloud:gateway:routes:- id: user_getListuri: http://localhost:8080/user/getListpredicates:- After=2021-10-30T01:00:00+08:00[Asia/Shanghai]
Before Route Predicate在指定时间之前的请求会匹配该路由 。spring:cloud:gateway:routes:- id: user_getListuri: http://localhost:8080/user/getListpredicates:- Before=2021-10-30T02:00:00+08:00[Asia/Shanghai]
Between Route Predicate在指定时间区间内的请求会匹配该路由 。spring:cloud:gateway:routes:- id: user_getListuri: http://localhost:8080/user/getListpredicates:- Between=2021-10-30T01:00:00+08:00[Asia/Shanghai],2021-10-30T02:00:00+08:00[Asia/Shanghai]
Cookie Route Predicate带有指定Cookie的请求会匹配该路由 。
推荐阅读
- 记一次 .NET 某招聘网后端服务 内存暴涨分析
- 中考志愿服务的四大技巧
- 网关就是路由器?错了,区别很多
- 使用MobaXterm管理远程Linux服务器
- 服务器搭建网站时,是选http还是https?
- Django项目部署到服务器
- 想要管理Linux服务器,先搞清楚它的目录结构
- 为什么微服务要有独立数据库
- 95598水费查询网?95598水费网上查询自来水服务热线
- 三星空调售后服务维修中心河西区在哪-,西安三星冰箱售后维修电话-