轉載請標明出處: www.fangzhipeng.com 本文出自方誌朋的部落格
在之前的文章介紹了Spring Cloud Gateway的Predict(斷言)、Filter(過濾器),大家對Spring Cloud Gateway有初步的認識,其中在對服務路由轉發的這一塊,在之前的文章是採用硬編碼的方式進行路由轉發。這篇文章以案例的形式來講解Spring Cloud Gateway如何配合服務註冊中心進行路由轉發。
工程介紹
本案例中使用spring boot的版本為2.0.3.RELEASE,spring cloud版本為Finchley.RELEASE。在中涉及到了三個工程, 分別為註冊中心eureka-server、服務提供者service-hi、 服務閘道器service-gateway,如下:
工程名 | 埠 | 作用 |
---|---|---|
eureka-server | 8761 | 註冊中心eureka server |
service-hi | 8762 | 服務提供者 eurka client |
service-gateway | 8081 | 路由閘道器 eureka client |
這三個工程中,其中service-hi、service-gateway向註冊中心eureka-server註冊。使用者的請求首先經過service-gateway,根據路徑由gateway的predict 去斷言進到哪一個 router, router經過各種過濾器處理後,最後路由到具體的業務服務,比如 service-hi。如圖:
eureka-server、service-hi這兩個工程直接複製於我的另外一篇文章https://blog.csdn.net/forezp/article/details/81040925 ,在這就不在重複,可以檢視原始碼,原始碼地址見文末連結。 其中,service-hi服務對外暴露了一個RESTFUL介面“/hi”介面。現在重點講解service-gateway。
gateway工程詳細介紹
在gateway工程中引入專案所需的依賴,包括eureka-client的起步依賴和gateway的起步依賴,程式碼如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
複製程式碼
在工程的配置檔案application.yml中 ,指定程式的啟動埠為8081,註冊地址、gateway的配置等資訊,配置資訊如下:
server:
port: 8081
spring:
application:
name: sc-gateway-service
cloud:
gateway:
discovery:
locator:
enabled: true
lowerCaseServiceId: true
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
複製程式碼
其中,spring.cloud.gateway.discovery.locator.enabled為true,表明gateway開啟服務註冊和發現的功能,並且spring cloud gateway自動根據服務發現為每一個服務建立了一個router,這個router將以服務名開頭的請求路徑轉發到對應的服務。spring.cloud.gateway.discovery.locator.lowerCaseServiceId是將請求路徑上的服務名配置為小寫(因為服務註冊的時候,向註冊中心註冊時將服務名轉成大寫的了),比如以/service-hi/*的請求路徑被路由轉發到服務名為service-hi的服務上。
在瀏覽器上請求輸入localhost:8081/service-hi/hi?name=1323,網頁獲取以下的響應:
hi 1323 ,i am from port:8762
複製程式碼
在上面的例子中,向gateway-service傳送的請求時,url必須帶上服務名service-hi這個字首,才能轉發到service-hi上,轉發之前會將service-hi去掉。 那麼我能不能自定義請求路徑呢,畢竟根據服務名有時過於太長,或者歷史的原因不能根據服務名去路由,需要由自定義路徑並轉發到具體的服務上。答案是肯定的是可以的,只需要修改工程的配置檔案application.yml,具體配置如下:
spring:
application:
name: sc-gateway-server
cloud:
gateway:
discovery:
locator:
enabled: false
lowerCaseServiceId: true
routes:
- id: service-hi
uri: lb://SERVICE-HI
predicates:
- Path=/demo/**
filters:
- StripPrefix=1
複製程式碼
在上面的配置中,配置了一個Path 的predict,將以/demo/**開頭的請求都會轉發到uri為lb://SERVICE-HI的地址上,lb://SERVICE-HI即service-hi服務的負載均衡地址,並用StripPrefix的filter 在轉發之前將/demo去掉。同時將spring.cloud.gateway.discovery.locator.enabled改為false,如果不改的話,之前的localhost:8081/service-hi/hi?name=1323這樣的請求地址也能正常訪問,因為這時為每個服務建立了2個router。
在瀏覽器上請求localhost:8081/demo/hi?name=1323,瀏覽器返回以下的響應:
hi 1323 ,i am from port:8762
複製程式碼
返回的結果跟我們預想的一樣。
原始碼下載
參考資料
掃一掃,支援下作者吧
(轉載本站文章請註明作者和出處 方誌朋的部落格)