微服務SpringCloud之GateWay服務化和過濾器

  • 2019 年 11 月 10 日
  • 筆記

Spring Cloud Gateway 提供了一種默認轉發的能力,只要將 Spring Cloud Gateway 註冊到服務中心,Spring Cloud Gateway 默認就會代理服務中心的所有服務。

一、服務網關註冊到註冊中心

這裡服務和註冊中心使用前面博客中的EurekaServer和EurekaClient。服務網關註冊到註冊中心只需引入依賴包和增加配置。

1.引入依賴包spring-cloud-starter-netflix-eureka-client

        <dependency>              <groupId>org.springframework.cloud</groupId>              <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>          </dependency>

2.在application.yml中增加配置

server:    port: 8081  eureka:    client:      service-url:        defaultZone: http://localhost:8088/eureka/  logging:    level:      org.springframework.cloud.gateway: debug  spring:    application:      name: SpringCloudGatewayDemo    cloud:      gateway:        discovery:          locator:            enabled: true        routes:  #       - id: method_route  #         uri: http://www.cnblogs.com  #         predicates:  #          - Method=GET  #          - Path=/5ishare/{segment}        - id: query_route          uri: http://www.cnblogs.com

spring.cloud.gateway.discovery.locator.enabled:是否與服務註冊於發現組件進行結合,通過 serviceId 轉發到具體的服務實例。默認為 false,設為 true 便開啟通過服務中心的自動根據 serviceId 創建路由的功能。
eureka.client.service-url.defaultZone指定註冊中心的地址,以便使用服務發現功能
logging.level.org.springframework.cloud.gateway 調整相 gateway 包的 log 級別,以便排查問題

3.測試

依次啟動EurekaServer、EurekaClient、SpringCloudGatewayDemo。在瀏覽器輸入http://localhost:8088/,如圖一註冊中心有SPRING-CLOUD-PRODUCER、SPRINGCLOUDGATEWAYDEMO兩個應用。

輸入http://localhost:9003/hello?name=cuiyw,EurekaClient顯示正常。

 

 將 Spring Cloud Gateway 註冊到服務中心之後,網關會自動代理所有的在註冊中心的服務,訪問這些服務的語法為:http://網關地址:端口/服務中心註冊 serviceId/具體的url。

輸入http://localhost:8081/SPRING-CLOUD-PRODUCER/hello?name=cuiyw時頁面顯示EurekaClient的內容。

 二、過濾器

Spring Cloud Gateway 的 Filter 的生命周期不像 Zuul 的那麼豐富,它只有兩個:“pre” 和 “post”。
PRE: 這種過濾器在請求被路由之前調用。我們可利用這種過濾器實現身份驗證、在集群中選擇請求的微服務、記錄調試信息等。
POST:這種過濾器在路由到微服務以後執行。這種過濾器可用來為響應添加標準的 HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等。

Spring Cloud Gateway 的 Filter 分為兩種:GatewayFilter 與 GlobalFilter。GlobalFilter 會應用到所有的路由上,而 GatewayFilter 將應用到單個路由或者一個分組的路由上。
Spring Cloud Gateway 內置了9種 GlobalFilter,比如 Netty Routing Filter、LoadBalancerClient Filter、Websocket Routing Filter 等,根據名字即可猜測出這些 Filter 的作用,具體大家可以參考官網內容:Global Filters
利用 GatewayFilter 可以修改請求的 Http 的請求或者響應,或者根據請求或者響應做一些特殊的限制。 更多時候我們會利用 GatewayFilter 做一些具體的路由配置,下面我們做一些簡單的介紹。

我們以 AddRequestParameter GatewayFilter 來演示一下,如何在項目中使用 GatewayFilter,AddRequestParameter GatewayFilter 可以在請求中添加指定參數。

1、修改EurekaClient

如下圖所示,啟動了兩個EurekaClient客戶端,為了區分,在一個客戶端實例增加了兩個!!。

 

 

 

2.增加Filter配置

server:    port: 8081  eureka:    client:      service-url:        defaultZone: http://localhost:8088/eureka/  logging:    level:      org.springframework.cloud.gateway: debug  spring:    application:      name: SpringCloudGatewayDemo    cloud:      gateway:        discovery:          locator:            enabled: true        routes:         - id: add_request_parameter_route           uri: lb://spring-cloud-producer           filters:           - AddRequestParameter=name, cuiyw           predicates:              - Method=GET  #       - id: method_route  #         uri: http://www.cnblogs.com  #         predicates:  #          - Method=GET  #          - Path=/5ishare/{segment}         - id: query_route           uri: http://www.cnblogs.com           predicates:            - Query=name,cuiyw            - RemoteAddr=192.168.0.1/16  #       - id: cookie_route  #         uri: http://www.cnblogs.com  #         predicates:  #           - Cookie=name,cuiyw  #           - Header=X-Request-Id, d+  #       - id: time_route  #         uri: http://www.cnblogs.com  #         predicates:  #          -After=2019-11-03T10:20:06+08:00[Asia/Shanghai]  #          - Before=2019-11-03T10:55:06+08:00[Asia/Shanghai]  #          - Between=2019-11-03T11:01:06+08:00[Asia/Shanghai], 2019-11-03T11:05:06+08:00[Asia/Shanghai]  #      - id: neo_route  #        uri: http://www.cnblogs.com  #        predicates:  #          - Path=/5ishare    #      - id: header_route  #        uri: http://ityouknow.com  #        predicates:  #        - Header=X-Request-Id, d+  #      - id: host_route  #        uri: http://ityouknow.com  #        predicates:  #        - Host=**.ityouknow.com    #      - id: host_route  #        uri: http://ityouknow.com  #        predicates:  #        - Path=/foo/{segment}  #      - id: query_route  #        uri: http://ityouknow.com  #        predicates:  #         - Query=keep, pu.  #      - id: remoteaddr_route  #        uri: http://ityouknow.com  #        predicates:  #        - RemoteAddr=192.168.126.218/24

View Code

上面配置文件增加了add_request_parameter_route路由,該路由作用是在spring-cloud-producer服務的get請求url增加參數,類似在url的問號後面增加key=value鍵值對name=cuiyw.

3.測試

重啟EurekaClient和GateWay,在瀏覽器中輸入http://localhost:8081/hello,則交替出現如下兩個頁面的結果,實現了服務化路由轉發。