spring cloud gateway之服務注冊與發現


在之前的文章介紹了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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM