spring cloud gateway之服務註冊與發現

方誌朋發表於2019-03-04

轉載請標明出處:
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。如圖:

微信截圖_20181206163700.png

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

複製程式碼

返回的結果跟我們預想的一樣。

原始碼下載

github.com/forezp/Spri…

參考資料

juejin.im/post/5aa4ea…

www.jianshu.com/p/1c942a8ab…

juejin.im/post/5ba8da…

spring cloud gateway之服務註冊與發現

掃一掃,支援下作者吧

(轉載本站文章請註明作者和出處 方誌朋的部落格

相關文章