1. 程式人生 > 程式設計 >SpringCloud (GreenwichR2) 第三章 Gateway 入門 附原始碼

SpringCloud (GreenwichR2) 第三章 Gateway 入門 附原始碼

官方檔案

cloud.spring.io/spring-clou…

為什麼需要它???

如果讓客戶端直接與各個微服務通訊,會有以下的問題:

  1. 客戶端會多次請求不同的微服務,增加了客戶端的複雜性。
  2. 存在跨域請求,在一定場景下處理相對複雜。
  3. 認證複雜,每個服務都需要獨立認證。
  4. 難以重構,隨著專案的迭代,可能需要重新劃分微服務。例如,可能將多個服務合併成一個或者將一個服務拆分成多個。如果客戶端直接與微服務通訊,那麼重構將會很難實施。
  5. 某些微服務可能使用了防火牆 / 瀏覽器不友好的協議,直接訪問會有一定的困難。

  so 我們需要一個閘道器能統一處理這些問題,包括授權、限流、日誌、安全等系統常用功能。

Gateway必須掌握的

  • 路由:路由閘道器的基本構建塊。它由ID,目標URI,謂詞集合和過濾器集合定義。如果聚合謂詞為真,則匹配路由。
  • 謂詞:這允許開發人員匹配來自HTTP請求的任何內容,例如標頭或引數。
  • 過濾器:這些是使用特定工廠構建的Spring FrameworkGatewayFilter例項。這裡,可以在傳送下游請求之前或之後修改請求和響應。

     gateway在微服務中扮演角色就是一個優秀的"皇宮護衛"吧

摘抄下網路的的原理圖吧


接著我們建立一個Gateway模組

這邊還是接著第二章的Demo開始,選中scloud專案,右擊 New - Module - Spring Initializr


next


選擇兩個依賴包Gateway 和 Euraka Discovery Client



接著 我們還是和上一章建立服務消費者一樣 修改pom.xml 和 application.yml(這邊我把預設的.properties修改成.yml檔案)

application.yml 內容如下


在啟動類加入註解

@SpringBootApplication
@EnableEurekaClient
public class EurekaGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaGatewayApplication.class,args);
    }

}複製程式碼

好了到此為止閘道器應該搭建結束了

我們以此啟動eureka_server模組,eureka_client模組,eureka_consumer_openfeign 模組,eureka_gateway模組。

問題來了,當啟動eureka_gateway模組的時候報錯了!

一個警告:

********************************************************** 
 Spring MVC found on classpath,which is incompatible with Spring Cloud Gateway at this time. Please remove spring-boot-starter-web dependency.
 **********************************************************
複製程式碼

報錯部分截圖:


經過搜尋各大論壇,說是spring-cloud-starter-gateway 和 spring-boot-starter-web 都用了webflux架包產生衝突!

解決方法:對我這個專案,就是把 spring-boot-starter-web 不放入主pom.xml引用,各個模組自己依賴spring-boot-starter-web,主pom.xml修改如下


最終gateway 的 pom.xml 包如下


我們在啟動eureka_gateway 模組,OK,現在全部啟動起來了


訪問下 http://localhost:8666 看下注冊的服務,都有了。


現在我們從瀏覽器閘道器埠訪問服務 http://localhost:8671/test/sayHello/world (8671 後面的路徑也就是服務消費者提供的Restful api)


至此,閘道器已經通了,就這麼簡單???

當然不是!!!現在只是走通請求,還有...

Predicate Factory (表明在哪種條件下,該路由配置生效)

GatewayFilter Factory (用於過濾請求,比較複雜)

除了本身的一些特性學習外,閘道器這個模組還需要整合斷路器Hystrix、Security(認證、授權)、token 等,內容還是比較多且豐富的,為了條例清晰些節約每個內容的篇幅,下一節在記錄下Predicate Factory的使用。

原始碼地址:gitee.com/dolan/sclou…

切換到分支 f_gateway !!!