摘要:協議轉換微服務架構允許使用不同的協議以便于獲得使用不同技術的優勢。過于龐大的在實現時,應當避免將非通用邏輯如領域特定數據轉換放入其中。服務應始終對其數據域擁有完全的所有權。構建一個過于龐大的,從服務團隊爭奪控制權,這違反了微服務的理念。
我們團隊的后端服務中,一開始只有一個大服務,所有的東西都往里面寫,可以想象下,當這個服務變得不斷的龐大,將會變得多么難以維護。后來逐漸把一些數據服務抽離成多帶帶的 API 服務,在原有的服務里,就還剩一些模板渲染,數據聚合還有一些耦合的業務邏輯。目前來說拆的還不夠干凈,我們的目標其實是希望這個舊的服務充當一個 API Gateway,或者說一個給前端用的中間層。單一職責原則,其實是一個很重要的解耦方式,一個服務干好一件事就好了。偶然間看到下面的文章,雖然只是一些很簡單的介紹,也讓我了解到很多東西。也分享給 大家看看。
閱讀原文
客戶端一般都需要經過一些認證以及滿足在數據傳輸時的安全要求,才能獲得訪問微服務架構中的服務的權利。不同的服務在認證上都會或多或少存在一些差異,API Gateway 就像一個集線器,用它來抹平各種服務協議之間的差異,并滿足對特定客戶端的特殊處理。他的存在,方便了客戶端對各類服務的享用。
微服務和消費者微服務適合用在團隊可以獨立設計、開發、運行服務的架構體系中。它允許系統中的各個服務存在技術多樣性,團隊可以在適合的場景使用合適的開發語言、數據庫和網絡協議。例如,一個團隊中使用 JSON 和 HTTP REST,而另一個團隊則可能使用 gRPC 和 HTTP/2 或者像 RabbitMQ 這樣的消息代理。
有些場景中使用不同的數據序列化方式和協議可能收益巨大,但是需要使用我們服務的客戶端可能會有不同的需求。由于存在各種各樣的客戶端,需要我們支持的數據格式也是多種多樣,比如一個客戶端可能希望拿到的數據是 XML 格式的,而另一個客戶端則希望數據是 JSON。另一個你可能需要面對的問題是,可能不同服務之間存在著一些公共的邏輯(比如權限認證之類),總不能在每個服務里都實現一遍吧?
總結:我們不想把一些支持多個客戶端等相關的公用邏輯重復實現在微服務中,我們需要一個 API Gateway 來提供一個中間層來處理服務協議之間的差異,并滿足特定客戶端的需求。
什么是 API GatewayAPI 網關是微服務架構中的一種服務,它為客戶端提供共享層和 API,以便與內部服務進行通信。 API 網關可以路由請求,轉換協議,聚合數據,并實現一些共享邏輯,如身份驗證和速率限制器等。
你可以將 API Gateway 看做是一個享用各種微服務的入口。
我們的系統可以有一個或多個 API Gateway,這具體取決于客戶端的需求。例如,我們可以為桌面瀏覽器,移動應用程序和公共API提供多帶帶的網關。
前端團隊的Node.js API Gateway由于 API Gateway 為客戶端應用程序(如瀏覽器)提供了支持,它可以由負責前端應用程序的團隊來實現和管理。
這也意味著 API Gateway 的實現語言應由負責客戶端的團隊選擇。由于 JavaScript 是開發瀏覽器應用程序的主要語言,即使你的微服務架構用不同的語言開發,Node.js 也可以成為實現 API Gateway 的絕佳選擇。
Netflix 成功地使用 Node.js API Gateway 及其 Java 后端來支持廣泛的客戶端, 了解更多。
我們之前討論過,可以將通用共享邏輯放入 API Gateway,本節將介紹其常見用法。
路由和版本控制我們將 API Gateway 定義為微服務的入口。 在你的 API Gateway 中,你可以將請求從客戶端路由到指定的服務。 你甚至可以在路由期間對服務程序的版本進行選擇或更改后端接口,而公開的接口可以保持不變。你還可以在你的 API Gateway 中集合多個微服務到一點。
迭代設計API Gateway 可以幫助你分解臃腫的應用程序。由于業務的不斷迭代,從頭開始把整個應用重寫成一個微服務架構的系統似乎不太可行。
在這種情況下,我們可以將代理或 API Gateway 置于我們的整體應用之前,并將新功能作為微服務實現,只需要保證 API Gateway 能將新接口路由到新服務,同時保證舊接口依然能夠訪問。慢慢的我們要把這些舊的服務遷移成微服務以達到分解臃腫應用程序的目的。
通過小步迭代設計,我們能夠平滑的從龐大的整體過渡到微服務架構。
大多數微服務是需要通過認證才可以使用的。將類似身份驗證的共享邏輯放在 API Gateway 上可以讓你的微服務更加專注。
在微服務架構中,您可以通過網絡配置將服務放置于 DMZ(非軍事區域)中,并通過API Gateway 將其暴露給客戶端。該網關還可以處理多個身份驗證方法,例如,可以支持基于cookie和基于 token 的身份驗證。
數據聚合在微服務架構中,客戶端可能會需要不同聚合程度的數據。 在這種情況下,我們可以使用 API Gateway 來解決這些依賴關系并從多個服務收集數據。
序列化格式轉換這種問題發生在不同客戶端需要不同格式數據的需求中。
想象一下,在微服務中如果我們使用了 JSON,但是在某個客戶端中只支持 XML 的 API,這個時候怎么辦?我們完全可以把 JSON 轉換 XML 這一過程放在 API Gateway 中,而不是在每個微服務中實現。
協議轉換微服務架構允許使用不同的協議以便于獲得使用不同技術的優勢。然而,大多數客戶端只支持一種協議。在這種情況下,我們需要轉換客戶端的服務協議。
API Gateway 也可以成為介于客戶端和微服務之間的一個協議轉換層。
下面的圖片中你可以看到,客戶端只使用 HTTP REST 來和各種服務交換信息,而實際上我們內部的各種微服務可以基于不同的規范、協議來進行信息傳遞。
速率控制和緩存除了身份驗證之外,你還可以在 API Gateway 中實現速率限制,緩存和各種可靠性相關的功能。
過于龐大的 API Gateway在實現 API Gateway 時,應當避免將非通用邏輯(如領域特定數據轉換)放入其中。
服務應始終對其數據域擁有完全的所有權。 構建一個過于龐大的 API Gateway,從服務團隊爭奪控制權,這違反了微服務的理念。
這就是為什么你應該注意你的API網關中的數據聚合 —— 如果你明確它的職責,它可以是很強大的,應當避免在 API Gateway 中處理業務邏輯,是誰的事情就交給誰干,一定要明確其在整個架構中的角色。
Node.js Gateways如果你希望在 API Gateway 中執行一些簡單的操作,例如將請求路由到特定的服務,你可以使用像nginx這樣的反向代理。 但在某些時候,你可能需要實現一般代理不支持的邏輯。 在這種情況下,你可以在 Node.js 中實現自己的 API Gateway。
在 Node.js 中,你可以使用 http-proxy 完成一些簡單的代理請求的服務,當然也可以使用具有更多功能的 express-gateway。
在第一個 API Gateway 示例中,我們在其代理請求到真實的服務之前,先進行權限認證。
const express = require("express") const httpProxy = require("express-http-proxy") const app = express() const userServiceProxy = httpProxy("https://user-service") // Authentication app.use((req, res, next) => { // TODO: my authentication logic next() }) // Proxy request app.get("/users/:userId", (req, res, next) => { userServiceProxy(req, res, next) })
另一種方式是由 API Gateway 向微服務發送請求,再將響應回饋給客戶端:
const express = require("express") const request = require("request-promise-native") const app = express() // Resolve: GET /users/me app.get("/users/me", async (req, res) => { const userId = req.session.userId const uri = `https://user-service/users/${userId}` const user = await request(uri) res.json(user) })總結:
API Gateway 提供了一個中間層來協調客戶端和微服務架構。它有助于幫助我們完成單一職責原則,讓我們的應用或者服務持續的關注一件事。你可以將通用邏輯放入 API Gateway 中,但是也應該注意不要過度的使用 API Gateway。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87145.html
摘要:前端日報精選譯用搭建探索生命周期中的匿名遞歸瀏覽器端機器智能框架深入理解筆記和屬性中文上海線下活動前端工程化架構實踐滬江技術沙龍掘金周二放送追加視頻知乎專欄第期聊一聊前端自動化測試上雙關語來自前端的小段子,你看得懂嗎眾成翻 2017-08-10 前端日報 精選 [譯] 用 Node.js 搭建 API Gateway探索 Service Worker 「生命周期」JavaScript ...
摘要:前端日報精選浮點數精度之謎前端面試必備基本排序算法從賀老微博引出的遍歷器加速那些奧秘進階之深入理解數據雙向綁定全棧天中文深入理解筆記用模塊封裝代碼前端架構經驗分享周二放送自制知乎專欄譯在大型應用中使用的五個技巧掘金開發指南眾成 2017-08-02 前端日報 精選 JavaScript 浮點數精度之謎前端面試必備——基本排序算法從賀老微博引出的遍歷器(Iterators)加速那些奧秘J...
摘要:個推針對服務場景,基于和搭建了微服務框架,提高了開發效率。三容器化在微服務落地實踐時我們選擇了,下面將詳細介紹個推基于的實踐。 2016年伊始Docker無比興盛,如今Kubernetes萬人矚目。在這個無比需要創新與速度的時代,由容器、微服務、DevOps構成的云原生席卷整個IT界。個推針對Web服務場景,基于OpenResty和Node.js搭建了微服務框架,提高了開發效率。在微服...
摘要:個推針對服務場景,基于和搭建了微服務框架,提高了開發效率。三容器化在微服務落地實踐時我們選擇了,下面將詳細介紹個推基于的實踐。 2016年伊始Docker無比興盛,如今Kubernetes萬人矚目。在這個無比需要創新與速度的時代,由容器、微服務、DevOps構成的云原生席卷整個IT界。個推針對Web服務場景,基于OpenResty和Node.js搭建了微服務框架,提高了開發效率。在微服...
摘要:前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點分為新聞熱點開發教程工程實踐深度閱讀開源項目巔峰人生等欄目。對該漏洞的綜合評級為高危。目前,相關利用方式已經在互聯網上公開,近期出現攻擊嘗試爆發的可能。 前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點;分為新聞熱點、開發教程、工程實踐、深度閱讀、開源項目、巔峰人生等欄目。歡...
閱讀 1074·2021-11-19 09:40
閱讀 2213·2021-11-15 18:00
閱讀 1267·2021-10-18 13:34
閱讀 2248·2021-09-02 15:40
閱讀 1533·2019-08-30 14:01
閱讀 1113·2019-08-30 11:11
閱讀 2482·2019-08-29 15:26
閱讀 722·2019-08-29 14:15