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