网关出现的背景
微服务中,服务的粒度被细分,以往的一整大块服务可以被拆分成类似订单服务,支付服务等。拆分后的服务一般都是通过网络来进行通讯的,如果让客户端一个个来调用服务,未免过于复杂。这个时候大家可能会想到nginx来进行反向代理,不过nginx的配置稍有麻烦。于是乎Gateway就出现了,Gateway比nginx更加契合Spring Cloud系统。
网关的作用
网关是处于应用程序或服务之前的系统,用来管理授权、访问控制和流量限制等。通俗来讲就是对其他服务请求的集中管理,请求先到网关,再由网关请求到真实的服务。
Gateway中主要的几个配置
- Route路由:网关的基本,由ID、URI、断言(Predicate)、过滤器(filter)组成。断言相当于条件判断,判断为真,则由路由匹配。
- 断言(Predicate):可以使用这个匹配来自HTTP请求的任何内容
- 过滤器(filter):对请求和响应进行修改处理
断言可以匹配的项
- ZonedDateTime:根据时间来进行匹配
- Cookie:根据cookie来进行匹配
- Header:根据请求头来进行匹配
- Host:根据请求域名来进行匹配
- Method:根据请求方法来进行匹配
- Path:根据请求路径来进行匹配
- Query:根据请求参数来进行匹配
- RemoteAddr:根据远程IP进行谓词的校验匹配
举例
spring:
cloud:
gateway:
routes:
- id: test_route
uri: http://ip:port //真正跳转的路径
predicates:
- Host=**.com
- Path=/headers
- Method=POST
- Header=X-Request-Id, \d+
- Query=name
- Cookie=chocolate, ch.p
- After=2020-01-25T06:06:06+08:00```
注:
1. 如果一个路由中存在多个断言,那么请求必须满足所有断言,才能匹配。
2. 一个请求如果满足多个路由的断言,只会被第一个路由所匹配。
### **过滤器(filter)**
过滤器也有许多设置,这里只提及其中两项:
StripPrefix:去掉部分url路径
```bash
spring:
cloud:
gateway:
routes:
# 集成eureka注册中心的配置示例
- id: hello_ribbon_route
uri: lb://spring-cloud-producer
predicates:
- Path=/producerInEureka/**
filters:
- StripPrefix=1```
假设我们的请求是 http://localhost:8080/producerInEureka/hello ,经过过滤器(StripPrefix=1)后发送到spring-cloud-producer的请求就为[http://spring-cloud-producer/hello](http://spring-cloud-producer/hello)
集成eureka注册中心的配置示例
- id: hello_ribbon_route
- uri: lb://spring-cloud-producerpredicates:
- Path=/producerInEureka/**filters:
- PrefixPath=/test
我们的请求是 http://localhost:8080/producerInEureka/hello ,经过过滤器(StripPrefix=1)后发送到spring-cloud-producer的请求就为http://spring-cloud-producer/test/producerInEureka/hello
gateway配置示例
spring:
cloud:
gateway:
globalcors:
cors-configurations: #网关跨域的配置
'[/**]':
allowedOrigins: "*"
allowedHeaders: "*"
allowCredentials: true
allowedMethods:
- GET
- POST
- PUT
- OPTIONS
routes:
# 集成eureka注册中心的配置示例
- id: hello_ribbon_route
uri: lb://spring-cloud-producer
predicates:
- Path=/producerInEureka/**
filters:
- PrefixPath=/test