简介
gateway的简单介绍和使用。
gateway
网关,系统的统一入口,为微服务架构提供一种简单且有效api路由的管理方式
gateway的功能:
- 动态路由,能够匹配任何请求属性,如请求头,主体,url
- 对路由指定断言和过滤器
- 支持路径重写
- 权限校验
- 限流
基本概念
路由:根据请求的url和配置的服务进行匹配,然后路由到对应的服务上
断言:断言函数,请求(请求头,cookie,参数)匹配的话就进行路由
过滤器:可以对请求和响应进行处理
简单使用
pom.xml添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
application.yml的配置
server:
port: 8088
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: order_route
uri: http://localhost:8020
predicates:
- Path=/order-server/**
filters:
- StripPrefix=1
routes:路由规则
id:是路由的唯一标识
uri:会路由转发到的位置
predicates:断言规则,不是所有的请求都会路由转发到uri中的位置,只有匹配断言规则的才会被转发
path:请求中带有这个order-service前缀的才会路由
filter:过滤器
stripPrexfix:内置的一种过滤器,转发之前会去掉第一层的路径
例子:
有一个请求:http://localhost:8088/order-server/order/add
由于order_route的配置,gateway会先去除order-server这部分路径,然后将剩下的/order/add部分转发给http://localhost:8020,即后端处理订单的服务。
整合nacos
在上面的例子中,uri是写死的,后期不好维护,服务的管理应该交给nacos的。
修改pom.xml
添加nacos依赖
<!-- nacos服务注册与发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
修改yml文件
server:
port: 8088
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: order_route
uri: lb://order-server
predicates:
- Path=/order-server/**
filters:
- StripPrefix=1
nacos:
discovery:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
uri: lb://order-server
lb标识使用nacos的本地负载均衡策略
order-server是服务名
断言
作用:请求gateway的时使用断言对请求进行匹配,匹配成功就路由转发。
分为:内置断言和自定义断言
常用的内置断言:
- 基于datetime类型的断言工厂
- 基于远程地址的断言工厂
- 基于cookie的断言工厂
- 基于header的断言工厂
- 基于host的断言工厂
- 基于method请求方法的断言工厂
- 基于query请求参数的断言工厂
其实就是对各种不同的条件加判断
例如基于datetime类型的断言工厂,就是对请求的时间去进行判断,是否早于/晚于/位于 哪个时间段
其他也类似,如地址,cookie,header,host,method中是否包含某个字段,某个key的值是否是指定字段等。
过滤器
作用:可以通过过滤器对请求和响应进行一些业务逻辑的处理。
分为:局部过滤器和全局过滤器。
局部过滤器是针对其中的一个路由,全局过滤器会对所有的路由起作用。
常见的内置局部过滤器工厂:
- AddRequestHeader:为原始请求添加header
- AddRequestParameter:为原始请求添加请求参数
- AddResponseHeader:为原始响应添加header
- DedupeResponseHeader:剔除响应头中重复的值
- PrefixPath:为原始请求路径提交前缀
- FallbackHeaders:为fallbackuri的请求头中添加具体的异常信息
- RedirectTo:重定向
全局过滤器工厂
- LoadBalancerClientFilter :负载均衡客户端相关过滤器
- forwardPathFilter:路径转发相关过滤器
例如之前的配置中的uri: lb://order-server,
Spring Cloud Gateway会识别lb://前缀并自动调用Spring CloudLoadBalancer来处理负载均衡逻辑,而Spring CloudLoadBalancer内部会使用LoadBalancerClientFilter或相应的负载均衡逻辑。
gateway跨域的处理
跨域:跨源资源共享,cors,是一种浏览器的安全策略,在浏览器中,出于安全考虑,存在一种被称为“同源策略”的限制,来自不同源的资源不能相互访问
同源策略:协议、域名和端口号三者共同组成,只要其中任意一项不同,就认为是不同的源。
修改application.yml文件
server:
port: 8088
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: order_route
uri: lb://order-server
predicates:
- Path=/order-server/**
filters:
- StripPrefix=1
nacos:
discovery:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods:
- GET
- POST
allowedOrigins: “*” :允许跨域访问的资源
allowedMethods: 允许跨域访问的方法的请求方式
gateway整合sentinel流控降级
修改pom.xml文件
添加sentinel的相关依赖
<!--sentinel整合gateway>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<!--sentinel的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
修改application.yml文件
添加配置
sentinel:
transport:
dashboard: 127.0.0.1:8858
sentinel控制台进行流控
新增之后,就会对这个order_route资源进行流控了。
设置流控规则
参数属性有点类似于断言,只有符合规则的才会进行流控
比如指定client IP,在匹配串中输入条件,只有请求ip是等于输入条件的进行流控。
通过api分组的方式流控
先设定好api分组的规则
然后在流控规则中设置
这样,就会对api分组中设置的url进行流控了。
gateway高可用
运行多个gateway的实例,使用nginx来负载均衡去反向代理。