領先一步
VMware 提供培訓和認證,助力你的職業發展。
瞭解更多微服務架構很棒,但隨著應用程式介面(API)的增長,維護相關的挑戰也隨之增加。
例如,當現有 API 成熟並新增新功能時,它需要帶著其客戶端一同前進。當 API 的細節發生變化時,客戶端需要進行調整以適應這些變化。這個過程需要時間,這會大大減緩 API 的演進,並影響你快速迭代的能力。
提供多個 API 本身也帶來了一系列挑戰。如何將請求和響應路由到正確的 API?如何管理任何訊息差異?當你的端點可能移動時,如何支援客戶端?
此外,還有與遺留系統整合的挑戰。並非所有人都幸運地可以將應用和服務構建到全新的生態系統中,他們往往需要與現有的系統良好協作,例如進行身份驗證和其他後端服務。
API 閘道器可以幫助你解決這些問題及更多。它是一個強大的架構工具,你可以用來在微服務架構中管理訊息路由、過濾和代理。許多 API 管理閘道器可以追溯到 SOA,它們通常被實現為集中式伺服器。但隨著微服務變得越來越流行,現代的輕量級、獨立和去中心化的微閘道器應用程式應運而生——例如 Spring Cloud Gateway。
在本系列關於 Spring Cloud Gateway 的第一篇文章中,我們將從一個非常簡單的事情開始——重新路由進入閘道器的請求,並將它們轉發到其他地方的另一個服務。我們還將向請求中插入一個簡單的 HTTP Header,以此來展示使用閘道器可以實現的一種可能。
在一個新資料夾中,使用 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://:8080/actuator/health。你應該會收到一個 JSON 格式的訊息,顯示 {"status":"UP"}
,這表示一切正常。現在停止伺服器(ctrl+c),然後繼續下一節。
在你的 IDE 中,開啟 src/main/java/com/example/demo/DemoApplication.java
類,並新增以下方法,同時修正匯入語句。如果你遇到困難,請檢視此處的程式碼示例。
@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://:8080/get
的請求都將匹配此路由指令,並會進行我們對請求所做的兩項更改。filters()
方法處理新增或更改 header 等事情,在本例中,它將 Hello
header 設定為值 World
。此外,uri()
方法將請求轉發到新的 host。值得注意的是,在轉發訊息時,/get
路徑被保留了。
現在編譯你的新程式碼並再次啟動應用程式伺服器,如下所示...
./mvnw package spring-boot:run
在下一節中,我們將測試我們構建的內容。
為了測試我們構建的內容,我們可以再次使用 HTTPie。向 https://:8080/get 傳送一個 HTTP 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://:8080/get"
}
此輸出中有幾點值得注意:
"Host"
header 所示。"X-Forwarded-Host"
是 "localhost:8080"
(我們本地執行的閘道器應用程式)"Hello"
已被插入,並被賦予了值 "World"
。"url"
是 "https://:8080/get"
(我們一起構建的閘道器服務)。執行路徑是:客戶端 (HTTPie) -> DemoApplication.java (我們的閘道器) -> httpbin.org (我們的回顯服務),然後再返回。
就是這樣。現在你應該有一個 Spring Cloud Gateway 應用程式正在執行,並且已經學會了如何將它接收到的請求轉發到另一個端點。你可以使用這種技術將來自閘道器應用程式的請求自動轉發到任何其他服務。
本文 accompanying 的程式碼可以在這裡找到。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 可以節省你的門票費用。我們希望在那裡見到你!