网关出现的背景
微服务中,服务的粒度被细分,以往的一整大块服务可以被拆分成类似订单服务,支付服务等。拆分后的服务一般都是通过网络来进行通讯的,如果让客户端一个个来调用服务,未免过于复杂。这个时候大家可能会想到nginx来进行反向代理,不过nginx的配置稍有麻烦。于是乎Gateway就出现了,Gateway比nginx更加契合Spring Cloud系统。

网关的作用
网关是处于应用程序或服务之前的系统,用来管理授权、访问控制和流量限制等。通俗来讲就是对其他服务请求的集中管理,请求先到网关,再由网关请求到真实的服务。

Gateway中主要的几个配置

  1. Route路由:网关的基本,由ID、URI、断言(Predicate)、过滤器(filter)组成。断言相当于条件判断,判断为真,则由路由匹配。
  2. 断言(Predicate):可以使用这个匹配来自HTTP请求的任何内容
  3. 过滤器(filter):对请求和响应进行修改处理

断言可以匹配的项

  1. ZonedDateTime:根据时间来进行匹配
  2. Cookie:根据cookie来进行匹配
  3. Header:根据请求头来进行匹配
  4. Host:根据请求域名来进行匹配
  5. Method:根据请求方法来进行匹配
  6. Path:根据请求路径来进行匹配
  7. Query:根据请求参数来进行匹配
  8. 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