Spring Cloud Gateway入門 - spring.io

banq發表於2019-06-22

微服務架構很棒,但隨著應用程式程式設計介面(API)的開始增長,與維護相關的挑戰也隨之增加。
例如,隨著現有API的成熟和新增新功能,當API的詳細資訊發生變化時,客戶端需要進行調整才能使用這些更改。這個過程需要時間,會真正降低您的API演變效率,並干擾您快速迭代的能力。
提供多個API也會帶來了一系列挑戰。如何將請求和響應路由到正確的API?你如何管理任何訊息差異?當終端發生變化遷移時,您如何為變化的客戶端提供支援?
還有與遺留系統整合的問題。並非所有人都如此幸運,以至於他們可以將應用程式和服務構建到一個全新的生態系統中。

API閘道器可幫助您解決這些問題等。它是一個功能強大的架構工具,可用於管理微服務架構中的訊息路由,過濾和代理。許多API管理閘道器可以追溯到SOA,這些閘道器往往是作為集中式伺服器實現的。但隨著微服務變得越來越流行,現代輕量級獨立和分散式微閘道器應用程式已經出現 - 例如Spring Cloud Gateway

下面展示使用Spring Cloud Gateway進行開發的步驟

需要的工具:
  • HTTPie - http呼叫的命令列客戶端
  • 您最喜歡的Java IDE(如果您沒有,請檢視Spring Tools
  • 您最喜歡的命令列(例如zsh,bash,DOS命令或PowerShell)
  • Httpbin.org - 一個網站和診斷工具,可將Http GET請求資料轉換為JSON響應


第1步:建立一個專案
在新資料夾中,使用start.spring.io(和HTTPie)下載並提取新的Spring Cloud Gateway專案,如下所示......

http https://start.spring.io/starter.zip dependencies==cloud-gateway,actuator baseDir==spring-cloud-gateway-demo | tar -xzvf -


執行:

./mvnw package spring-boot:run


現在您的Spring Boot應用程式已啟動並執行,請將瀏覽器指向http:// localhost:8080 / actuator / health。您應該收到一條JSON格式的訊息{"status":"UP"},說明一切正常。現在停止伺服器(ctrl + c)並繼續下一部分。

步驟2:向閘道器新增重新路由指令
在IDE中,開啟該類src/main/java/com/example/demo/DemoApplication.java並新增以下方法,隨時更正import語句。如果您遇到問題,請檢視此處的程式碼示例。

 @Bean
    public RouteLocator myRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            // Add a simple re-route from: /get to: http://httpbin.org:80
            // Add a simple "Hello:World" HTTP Header
            .route(p -> p
            .path("/get") // intercept calls to the /get path
            .filters(f -> f.addRequestHeader("Hello", "World")) // add header
            .uri("http://httpbin.org:80")) // forward to httpbin
            .build();
    }


在這裡,我們建立了一條新路由:任何請求http://localhost:8080/get都將與此路由指令匹配,並且我們將對請求進行兩次更改:filters()方法處理諸如新增或更改標題之類的事情,在我們的示例中將Hello標題設定為值World。此外,該uri()方法將我們的請求轉發給新主機。請務必注意/get轉發郵件時保留路徑。
現在編譯新程式碼並再次啟動應用程式伺服器,如下所示......
./mvnw package spring-boot:run

第3步:測試新閘道器
為了測試我們構建的內容,我們可以再次使用HTTPie。將HTTP GET請求傳送到http:// localhost:8080 / get並觀察返回的內容,如下所示...

http localhost:8080/get --print=HhBb

應該看到與下面顯示的響應非常相似的響應:

GET /get HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: localhost:8080
User-Agent: HTTPie/1.0.2

HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Content-Encoding: gzip
Content-Length: 256
Content-Type: application/json
Date: Mon, 10 Jun 2019 13:13:36 GMT
Referrer-Policy: no-referrer-when-downgrade
Server: nginx
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

{
    "args": {},
    "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip, deflate",
        "Forwarded": "proto=http;host=\"localhost:8080\"for=\Ŕ:0:0:0:0:0:0:1:52144\"",
        "Hello": "World",
        "Host": "httpbin.org",
        "User-Agent": "HTTPie/1.0.2",
        "X-Forwarded-Host": "localhost:8080"
    },
    "origin": "0:0:0:0:0:0:0:1, 2.102.147.153, ::1",
    "url": "https://localhost:8080/get"
}


輸出中有一些注意事項:
  1. 響應源自httpbin.org,如"Host"標題所示。
  2. "X-Forwarded-Host"是"localhost:8080"(我們本地執行的應用閘道器)
  3. "Hello"已插入Http標頭並給出值"World"。
  4. 在Json響應中,完整"url"的原始請求是"https://localhost:8080/get"(我們一起構建的閘道器服務)。

執行路徑:來自客戶端(HTTPie) - > DemoApplication.java(我們的閘道器) - > httpbin.org(我們的echo服務),然後再返回。

最後的想法
您現在應該啟動並執行Spring Cloud Gateway應用程式,並學習如何將收到的請求轉發到另一個端點。您可以使用此技術自動將請求從Gateway應用程式轉發到任何其他服務。
可以在此處找到本文附帶的程式碼。可在此處找到當前GA版本的Spring Cloud Gateway(撰寫本文時為2.1.0)的完整文件。

相關文章