Spring Cloud Gateway 入門

工程 | Ben Wilcock | 2019 年 6 月 18 日 | ...

微服務架構非常棒,但隨著您的應用程式介面 (API) 開始成長,與其維護相關的挑戰也會隨之增加。

例如,當現有的 API 成熟並新增功能時,它需要帶領其客戶一同前進。當 API 的細節變更時,客戶需要調整以配合這些變更。此過程需要時間,並且可能會真正減緩您 API 的演進,並干擾您快速迭代的能力。

提供多個 API 會帶來自身的一系列挑戰。您如何將請求和回應路由到正確的 API?您如何管理任何訊息差異?當您的端點可能移動時,您如何支援客戶?

然後還有與舊系統整合的問題。並非每個人都如此幸運,能夠將應用程式和服務建置到全新的生態系統中,而是需要與現有的系統良好協作,以處理身份驗證和其他後端服務等事項。

API 閘道有助於您解決這些問題以及更多問題。它是一個強大的架構工具,您可以使用它來管理微服務架構中的訊息路由、篩選和代理。許多 API 管理閘道可以追溯到 SOA,這些閘道通常以集中式伺服器的形式實作。但隨著微服務變得越來越流行,現代輕量級、獨立且分散式的微閘道應用程式應運而生——例如 Spring Cloud Gateway

在本系列關於 Spring Cloud Gateway 的第一篇文章中,我們將從做一些非常簡單的事情開始——重新路由進入閘道的請求,並將它們轉發到其他地方的另一個服務。我們還將在請求中插入一個簡單的 HTTP 標頭,以展示閘道可以實現的另一個範例。

您需要的工具

  • 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 -

我們可以立即透過建置和執行程式碼,並檢查 Spring Boot Actuator 健康狀態端點來確認此專案是否正常運作,如下所示...

./mvnw package spring-boot:run

現在您的 Spring Boot 應用程式已啟動並執行,請將您的瀏覽器指向 https://127.0.0.1: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();
    }

在這裡,我們為閘道建立新的路由。對 https://127.0.0.1:8080/get 的任何請求都將與此路由指示相符,並且將對請求進行兩項變更。filters() 方法處理諸如新增或變更標頭之類的事情,在我們的案例中,將 Hello 標頭設定為值 World。此外,uri() 方法將我們的請求轉發到新的主機。重要的是要注意,轉發訊息時會保留 /get 路徑。

現在編譯您的新程式碼並再次啟動應用程式伺服器,如下所示...

./mvnw package spring-boot:run

在下一節中,我們將測試我們建置的內容。

步驟 3:測試您的新閘道

為了測試我們建置的內容,我們可以再次使用 HTTPie。將 HTTP GET 請求傳送到 https://127.0.0.1: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: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://127.0.0.1:8080/get"
}

此輸出中有一些值得注意的地方

  1. 回應源自 httpbin.org"Host" 標頭證明了這一點。
  2. "X-Forwarded-Host""localhost:8080"(我們在本機執行的閘道應用程式)
  3. Http 標頭 "Hello" 已插入並給定值 "World"
  4. 在 Json 回應中,原始請求的完整 "url""https://127.0.0.1:8080/get"(我們一起建置的閘道服務)。

執行路徑是從用戶端 (HTTPie) -> DemoApplication.java(我們的閘道)-> httpbin.org(我們的回音服務)然後再返回。

最終想法。

就這樣。您現在應該有一個 Spring Cloud Gateway 應用程式正在運作,並且已經學會如何將其接收到的請求轉發到另一個端點。您可以使用此技術將來自閘道應用程式的請求自動轉發到任何其他服務。

本文隨附的程式碼可以在 此處 找到。Spring Cloud Gateway 目前 GA 版本的完整文件(撰寫本文時為 2.1.0)可以在 此處 找到。

下次。

我們只是淺嚐 Spring Cloud Gateway 可以做什麼,但希望這是一個好的初次了解。在我們的下一篇文章中,我們將看看如何建立動態閘道——一種可以在執行時發現服務位置的閘道。在那之前,如果您想了解更多資訊,請務必查看 spring.io 上的 Spring Cloud Gateway 頁面官方指南,或在 Pivotal Web Services 上設定您自己的服務和閘道!

最後,請務必查看 SpringOne Platform,這是建置人們喜愛的、可擴展應用程式的首要會議。與您的同儕一起在 10 月 7 日至 10 日於德州奧斯汀舉行的規模最大、最棒的展覽中學習、分享和享受樂趣。更棒的是,註冊時使用代碼 S1P_Save200 即可節省您的票券費用。我們希望在那裡見到您!


作者

取得 Spring 電子報

隨時關注 Spring 電子報

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進展。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部