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

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,則交替出現如下兩個頁面的結果,實現了服務化路由轉發。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章