微服務之間的協作方式
原文地址: , 歡迎大家訪問。
前面幾篇文章大概寫了什麼是微服務以及我們應該如何去劃分微服務,那麼本篇文章我們就來看下如果整合微服務,其實就是微服務之間如何溝通並且進行資料交換。
整合的幾點原則
保證API的技術無關性
為什麼要保證這一點呢,之前在一文中提到過微服務有一個優點我們稱為技術異構性
。也就是我們可以在不同的服務中選擇適合該服務具體業務的技術棧而不受其他服務的影響。那麼如果我們的API和技術強關聯性,也就意味著我們可能不能夠隨心所欲的去選擇技術棧。使服務易於消費者使用
這點就很好理解了,如果我們提供的服務消費者使用起來非常的困難或者複雜,那麼消費者為啥不去自己單獨實現一套呢而非要使用你的服務呢。隱藏內部實現的細節
過多的內部實現細節暴露給消費方,將會極大的增加微服務之間的耦合度。
整合方式
-
共享資料庫
首先說明一下,雖然這種方式的整合速度最快,但是非常不推薦使用共享資料庫的方式來整合微服務,下面我們就一起來看下共享資料庫會帶來的問題。增加修改表結構的成本,因為幾乎所有的服務都會和資料庫打交道,哪怕是其中的一張表的修改也會牽扯到很多的服務。
資料庫會限制我們的技術選型
資料的修改點可能會分佈在各個服務,會導致資料庫極難維護,也很難去定位bug。
-
同步與非同步
這個主要說的是服務之間的協作方式。同步
客戶端發起一個遠端服務呼叫後,呼叫方會阻塞自己並等待整個操作的完成。通常情況下同步的方式是基於請求/響應機制的,客戶端發起一個請求,然後等待服務端響應,我們最常用的兩種呼叫方式就是RPC呼叫和REST呼叫。非同步
呼叫方不用等待操作完成就可以返回,甚至不需要關係操作是否執行成功。非同步方式是基於事件的,客戶端釋出一個事件,其他的協作者收到事件後就知道該去做什麼事情,無需客戶端說明,可能不同的協作者收到同一個個事件後的執行的業務邏輯並不是一樣的。一般來講我們使用RabbitMQ等類似的訊息中介軟體就可以實現非同步呼叫。
-
編排與協同
這裡我們透過一個例子來說明編排與協同,我們有一個系統,當使用者註冊一個賬號後我們會分別透過簡訊和郵件的方式通知使用者註冊成功,系統中存在三個服務分別是賬號服務、簡訊服務、郵件服務。下面我們分別來看一下在這個業務場景下編排和協同分別是一個什麼樣的表現形式。透過編排處理註冊
可以顯著的解耦,只需要釋出一個一個的事件即可。如果其他服務關係某個事件的話,只需要簡單的訂閱即可。(優)
完整的業務流程很難從程式碼中看出來,最好維護一份完整的文件。(缺)
需要做一些額外的工作來監控流程是否正常的執行。(缺)
-
可以降低耦合度,靈活性高。(優)
透過協同處理註冊
協同:告知各個服務的職責,服務透過監控事件或者訊息訂閱來觸發對應的操作。在上述例子中,賬號服務完成賬號的註冊之後可能只需要向訊息中介軟體傳送一條註冊成功的訊息,當訂閱了這類訊息的服務(郵件服務和簡訊服務)就可以執行已經定義好的業務邏輯了。
中心服務承擔了太多職責。(缺)
這種架構風格容易產生少量的“上帝”服務,而與其打交道的服務則通常淪為營養不良的、基於CRUD的服務。(缺)
編排:有一個總指揮的大腦去告驅動各個服務。在這個例子中賬號服務就是一個大腦,當使用者註冊成功之後,賬號服務會取呼叫簡訊服務和郵件服務給使用者傳送簡訊和郵件通知。
服務間的DRY和程式碼重用
在微服務內部不要違反DRY
但是在跨服務的情況下可以適當違反DRY,服務之間的大量共享程式碼可能會帶來大量的耦合,這比重複程式碼帶來的問題更大。
如果要開發客戶端庫,儘量保證SDK是由服務端API開發人員之外的人來開發。理由是,如果是同一團隊開發SDK和服務端API的話很容易將服務端的邏輯洩露到SDK中,也就會降低內聚性。
作者:名字想好沒
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2041/viewspace-2819767/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 微服務之間的呼叫方式哪種最佳?微服務
- 難住了,微服務之間的呼叫方式哪種更優?微服務
- Eureka的微服務之間呼叫微服務
- 微服務之間的相互呼叫微服務
- Eureka微服務之間呼叫-feign微服務
- 微服務之間如何共享DTO?微服務
- Spring Cloud之微服務之間相互呼叫、如何讓一個微服務呼叫另外一個微服務SpringCloud微服務
- 微服務之間通過RabbitMQ通訊微服務MQ
- goroutine間的同步&協作Go
- SpringCloud微服務系列- 服務間通訊之負載均衡SpringGCCloud微服務負載
- context裡的超時時間是怎麼在微服務之間傳遞的Context微服務
- Java併發程式設計——深入理解執行緒間的協作方式Java程式設計執行緒
- 如何解決微服務之間的資料依賴問題?微服務
- 通俗地理解面向服務的架構(SOA)以及微服務之間的關係架構微服務
- 微服務的程式間通訊(IPC)微服務
- 執行緒間協作執行緒
- 『高階篇』docker之微服務間如何通訊(六)Docker微服務
- 微服務的服務間通訊與服務治理微服務
- 微服務之間的資料依賴問題,該如何解決?微服務
- 執行緒間的協作機制執行緒
- 使用 caddy 作為微服務的 API gateway微服務APIGateway
- gateway(二)微服務之間傳遞使用者資訊Gateway微服務
- 手撕Java多執行緒(四)執行緒之間的協作Java執行緒
- DDD與團隊拓撲以及微服務之間的關係圖 - aleixmorgadas微服務
- 微服務17:微服務治理之異常驅逐微服務
- Vue - 元件之間的傳值方式Vue元件
- GRIT:eBay基於微服務的分散式事務協議微服務分散式協議
- 使用 Consul 作為 Python 微服務的配置中心Python微服務
- Java併發程式設計,互斥同步和執行緒之間的協作Java程式設計執行緒
- 微服務實戰系列(三)-springcloud、springboot及maven之間關係微服務GCCloudSpring BootMaven
- SpringBoot+Eureka註冊中心+Feign進行微服務之間呼叫Spring Boot微服務
- 微服務開發攻略之淺析微服務架構微服務架構
- Spring Cloud中如何保證各個微服務之間呼叫的安全性SpringCloud微服務
- 聊聊叢集、分散式和微服務之間的聯絡和異同點分散式微服務
- 微服務之Eureka服務發現微服務
- PHP 微服務之 [分散式事務]PHP微服務分散式
- PHP 微服務之【分散式事務】PHP微服務分散式
- React中元件之間通訊的方式React元件