當前位置:
首頁 > 科技 > Spring技術佈道師眼中的微服務:事件驅動型微服務詳解

Spring技術佈道師眼中的微服務:事件驅動型微服務詳解

對於開發人員來說,微服務是個既火爆又受追捧的話題,誰不想用上微服務架構呢。但是對於企業來說,微服務卻並非萬能葯,在團隊構建和交付軟體的過程中,其實微服務是面臨著很多挑戰的,比如軟體管理文化問題、系統一致性問題、分散式系統冗餘問題…

1

什麼是事件驅動型微服務?

什麼是事件驅動型微服務?Kenny Bastani 用一個大家每天都在用的事件驅動例子——前端 Web 應用程序來進行解釋。在每一個 Web 瀏覽器中,事件都是被用來捕獲用戶輸入的一種處理方式。通過顯式的映射函數處理連接到頁面元素的事件,通常我們稱之為動作或者命令,觸發時會調用用戶介面進行狀態改變。除此之外,事件也在一些後端系統中被廣泛使用,被用來使用領域驅動設計模式進行設計。但是最近一段時間,隨著微服務概念的廣泛採用,關於如何在分散式後端系統中利用事件驅動技術又重新點燃了大家的興趣。

在分散式系統中,計算打破了單一型應用程序的邊界,在單一型架構中,我們可以通過使用多線程並發方式調用計算資源。但是當我們演進到微服務架構時,應用程序架構被切分為很多個分離的服務,通過互相之間通信以滿足特定用例。事件提供了一種分散式計算方式,我們可以將事件作為消息在微服務架構內部傳輸。採用針對微服務的事件優先方式的一個主要原因是管理領域實體的連通性,這些實體之間通過外鍵關係橫跨不同應用程序和資料庫邊界。一個微服務可能需要觀察另一個微服務所產生的事件,這樣做是為了維持不同應用程序所管理的不同實體之間的外鍵關係。

在 Kenny Bastani 看來,微服務傾向於使用 HTTP 協議進行通信,通過不同應用程序提供的 REST API 介面進行通信。每一個微服務的業務邏輯可以使用協議進行交互和觸發動作。但是也存在非同步的非阻塞通信協議,例如 AMQP。這種通信方式是基於消息的,是多個服務之間消息交換的首選方式。多個 Spring 項目支持這種工作流方式,現在這種通信方式最流行的項目是 Spring Cloud Stream,它允許客戶在不用修改應用程序代碼的情況下交換消息中間件。例如我想要在 Apache Kafka 和 RabbitMQ 之間切換狀態,我可以在不修改核心代碼的情況下交換後端數據。

2

Spring Cloud:解決系統一致性問題

在一個出售 T-shirt 的在線商店,這個在線商店的 10 個微架構中,後端有 5 個,有目錄、賬戶、庫存、購物車等等不同服務,每個服務都是由獨立團隊管理,它們可以獨立地部署相應的變化。在底下是資料庫,資料庫用來存儲記錄,有時候可能會有一些問題,因為這不是系統中的一致性。

因為前端應用擔心如何與後端的服務進行聯繫,因此我們需要使用 API 決定需要聯繫的服務。一個服務可能會將你的請求和後端的服務聯繫在一起,而我們恰恰需要這樣一個後端服務的層面,便於管理。對此 Kenny Bastani 推薦 Spring Cloud:它可以解決剛才提到的問題——前端開發者不用擔心到底應該跟哪個服務接觸,後端的服務也不用擔心這個服務在哪裡。因此在線商店的網頁上,如果你想看客戶服務,直接將請求打上,後端便會自動地對你的服務做出反應,不用擔心後端的複雜性。但是,每一個底下的服務可以做獨立的變更,也不用擔心應用會對生產有什麼影響。應用可以按照名稱來找到不同服務。這樣之後,配置可以是中央化的管理,在線網站有了相關應用之後,可以有用戶的驗證。

3

從 Spring Cloud Stream 到 Spring Boot:痛點這樣解決

另外 Kenny Bastani 還表示:如果微服務沒有被使用恰當,會讓你淹沒在你從未知道的服務中。你有很多的變化,可是你不知道這些變化的歷史,便不知道哪兒好哪兒不好。

我們怎麼才能看到曾經的變化呢,怎麼去描述有什麼樣的變化呢?我們要對所有數據安全命令和查詢進行建模,之後擴大更新資料庫的狀態到最新版本。

首先需要有命令服務、有 Spring Boot,即提出命令可以更新賬戶;然後再做事件處理器,即查詢服務;然後再去觀察將這些服務寫到資料庫當中;最後是查詢服務。所有的關鍵內容都是無縫連接的,從 API 開始到分散式系統,再之後到無縫 API,我們可以觀察命令和查詢操作了解 API 的樣式。

Spring Cloud Stream 允許我們快速地創造針對輸入和輸出的消息通道,幫助提供一種生產和消費事件信息的手段。所有包含連接到不同服務的管道會自動完成配置,只需要通過使用默認的 Spring Cloud Stream 選項就能完成了。

而提及 Spring Boot,據 Kenny Bastani 介紹,這是一個構建在 Spring 生態環境上的本地雲應用框架。Spring Boot 出現之前,所有的應用程序都是在 Spring 框架上運行的。Spring Boot 跨出了一步,允許你通過指定組件形式快速提供生產環境所需的 Spring 應用。

例如,有用戶想利用微服務搭建一個 Web 應用程序,需要能夠連接到 MySQL 資料庫,也要能夠連接到 RabbitMQ 消息中間件。就可以使用 Spring 指定每一個組件的依賴關係,Spring Boot 會自動使用默認配置對所有組件進行配置。類似於 Spring Boot 這樣的工具,提供了默認的「做事方式」,也提供了自定義的入口。最後的結果是你不再需要擔心在生產環境下準備調優應用程序所需的一切。Spring Boot 提供的默認選項已經足夠你運行在生產環境了。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 InfoQ 的精彩文章:

三張通行證,為「高級工程師進階」加滿血量!
Yahoo開源實時大數據處理服務系統Vespa
那個瘋狂歲月里,蘋果公司的工程師文化
無人駕駛技術紛繁複雜,如何快速找到學習切入點?

TAG:InfoQ |