Spring Cloud Gateway 提供了一種默認轉發的能力,只要將 Spring Cloud Gateway 註冊到服務中心,Spring Cloud Gateway 默認就會代理服務中心的全部服務。html
1、服務網關注冊到註冊中心spring
這裏服務和註冊中心使用前面博客中的EurekaServer和EurekaClient。服務網關注冊到註冊中心只需引入依賴包和增長配置。瀏覽器
1.引入依賴包spring-cloud-starter-netflix-eureka-clientcookie
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
2.在application.yml中增長配置app
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 級別,以便排查問題socket
3.測試ide
依次啓動EurekaServer、EurekaClient、SpringCloudGatewayDemo。在瀏覽器輸入http://localhost:8088/,如圖一註冊中心有SPRING-CLOUD-PRODUCER、SPRINGCLOUDGATEWAYDEMO兩個應用。微服務
輸入http://localhost:9003/hello?name=cuiyw,EurekaClient顯示正常。post
將 Spring Cloud Gateway 註冊到服務中心以後,網關會自動代理全部的在註冊中心的服務,訪問這些服務的語法爲:http://網關地址:端口/服務中心註冊 serviceId/具體的url。測試
輸入http://localhost:8081/SPRING-CLOUD-PRODUCER/hello?name=cuiyw時頁面顯示EurekaClient的內容。
2、過濾器
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 能夠在請求中添加指定參數。
一、修改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
上面配置文件增長了add_request_parameter_route路由,該路由做用是在spring-cloud-producer服務的get請求url增長參數,相似在url的問號後面增長key=value鍵值對name=cuiyw.
3.測試
重啓EurekaClient和GateWay,在瀏覽器中輸入http://localhost:8081/hello,則交替出現以下兩個頁面的結果,實現了服務化路由轉發。