1. 程式人生 > >關於微服務劃分的一些思考

關於微服務劃分的一些思考

我們公司落地微服務架構已多年,而我也接觸開發了一段時間了。恰好,最近又抽空把《微服務設計》一書隨手翻了一遍,便有了抒寫此文的念頭,雖然文中所述並非具有很強的普適性,倒也權當自己近來的總結和思考罷了。

我想對於許多初始接觸微服務開發的人員來說,都會或多或少有這樣的疑問

微服務應該如何劃分?
我的服務粒度應該如何評定?

在探討這些問題之前,我們不妨先問自己:什麼才算是好的服務?
坦率地講,這個問題與微服務無關,我們不妨抽象在一個更高層面去思考:什麼程式碼才算好的程式碼?我想很多人都會脫口而出:高內聚、低耦合。
沒錯,而這兩個原則也是微服務的根基,如果做不到這兩點,那麼微服務的價值也就無從體現了。
試想一下,服務提供者對於有多少服務消費者在使用是無感知的(雖然我們可以通過註冊中心得知,但是意義不大,我們也並不關心),假設服務提供者的某個服務要做調整導致所有的消費者都需要連帶調整,這是一件非常麻煩,也非常讓人難以接受的事情。

低耦合

在微服務架構中,很重要的一點就是,在設計的時候,應儘可能的少知道協作者的資訊,獨立修改和部署服務而不需要其他服務同步修改。

高內聚

把相關的行為都聚集在一個地方,不相關的放在別處。多處修改一方面比較麻煩,另一方面,多處修改多處部署風險也會相對更高。

在謹記兩條原則的基礎上,我們便可以帶著疑惑進入到我們的下一個問題中去,也就是前文所提到的,「微服務應該如何劃分」?

限定上下文

在《領域驅動設計》中,有一個比較重要的概念----限定上下文。
在初次看到這個概念時,覺得非常的晦澀,但是隨著在業務中的思考,這種概念變得清晰起來。我們不妨將限定上下文拆分成兩個單詞來看,「限定」+「上下文」。
限定指的是某個範圍或者環境中,比如在商品這個系統中。而上下文可以理解為語境。總結起來似乎可以這麼理解:針對共同定義的某個模型,在不同的系統中有不同範圍的屬性;或者這麼說,在對內和對外而言,雖然服務提供者需要暴露某些資料(共享模型),但是針對不同的業務,並非需要將所有的資料都暴露出去。

舉個更加清晰的例子而言,比如我們需要將商品作為一個服務劃分出去,那麼服務消費者所看到和我們內部系統所使用的是不同的,或者說,我們只會向外部共享他們所需要的,而我們內部表示並不共享,否則如果有朝一日內部有所調整,那麼就必然影響到了服務消費者。
因此,我們需要思考的點在於,共享特定模型,而不要共享內部表示,避免高耦合。
值得一提的是,當我們在劃分服務時,需要注意的是我們面臨的是什麼功能,而不是單純的只考慮共享資料出去,否則極容易陷入貧血的誤區。

粒度

當我們在劃分設計時,有時候也會陷入過早劃分的誤區。一開始就把微服務劃分的比較明細雖然並不是一件壞事,但是總會造成前期開發成本大的局面。
我們在設計時,我更傾向於由粗到細的過程,然而,在這個過程中也會出現兩種情況,比如巢狀式和完全分離的區別

這兩種劃分方式的選擇更多的取決於你公司的架構,如果說它們是不同團隊在維護,那麼完全分離更合適,如果是一個團隊維護,那麼巢狀式更為合適。

歡迎關注我的公眾號,每週至少一篇比較有深度的原創文章:

相關推薦

關於該不該使用服務一些思考

首先,不是所有的專案都適合微服務,微服務的開發部署和傳統的單體應用是完全兩套獨立的東西,主要表現為: 1.微服務的架構比單體應用更加複雜; 2.架構搭好後,微服務的開發比傳統的應用要簡單,每個服務的職責更加單一; 3.微服務主要依賴CI 、CD、Docker、K8s等工具進行部署及運維,更加穩定可靠;

Dubbo的一些踩坑經驗和對服務一些思考

利用一些RPC框架進行分散式計算已經不是什麼新鮮的話題,微服務在生產中的應用也變得越來越普及。但是,我們還是需要回到起點思考一下,微服務到底有什麼用呢,它解決了什麼問題又帶來了哪些問題呢?今天我結合Dubbo這個框架,講一下平時使用的一些心得。 首先是第一個問題

服務劃分,服務之間通信到程序員能力提高的一些思考

程序 問題 播放 外部 實現 數據庫的操作 有一個 對數 設計   這個問題是由工作中的一次需求的變動引起的。 1:為什麽會有這個思考   我們當前做的是一個視頻門戶系統,這個系統分為四個子系統:cms(內容系統),bms(訂購系統),tms(終端管理系統),ims(用戶系

關於服務劃分一些思考

我們公司落地微服務架構已多年,而我也接觸開發了一段時間了。恰好,最近又抽空把《微服務設計》一書隨手翻了一遍,便有了抒寫此文的念頭,雖然文中所述並非具有很強的普適性,倒也權當自己近來的總結和思考罷了。 我想對於許多初始接觸微服務開發的人員來說,都會或多或少有這樣的疑問 微服務應該如何劃分? 我的服務粒度應該如

如何用代理平臺解決服務一些痛點

協議 解決 不能 ima 前端開發 負載均衡 接口 lua腳本 服務架構 為什麽要做代理平臺 微服務架構越來越流行,在一個上百號人開發的項目中,使用微服務的方式,大量模塊之間通過接口調用,隨之也帶來了許多問題: 接口不能及時提供造成阻塞:往往客戶端需要等待後臺接口進

安全服務一些思考

安服總結一些安服遇到的問題及思考 (一)安全服務小組的主要工作 (1)應急響應和取證溯源。(2)對客戶中出現的網絡威脅進行分析和處置。(3)配合公司自有產品發現威脅和解決網絡安全問題。(4)關註重大威脅事件,跟蹤並能及時將解決方案同步到客戶側。 (二)安全服務小組在現實中的任務 1)網絡安保 :在國家重大活動

Atitit 服務一些理論 目錄 1. 服務的4個設計原則和19個解決方案 1 2. 服務應用4個設計原則 1 2.1. AKF拆分原則 2 2.2. 前後端分離 2 2.3. 無狀態服務

Atitit 微服務的一些理論   目錄 1. 微服務的4個設計原則和19個解決方案 1 2. 微服務應用4個設計原則 1 2.1. AKF拆分原則 2 2.2. 前後端分離 2 2.3. 無狀態服務 2 2.4. Restful通訊風格 2 3. 微服

服務一些概念

Spring cloud  netfix 包括:eureka服務註冊與發現機制   hystrix 斷路器 zuul archaius Spring cloud sleuth  日誌收集工具包 Spring cloud stream 資料流操作開發包

服務測試的思考與實踐

重構 是個 我們 can post 發現 pipeline 比較 dep 微服務架構是一種架構模式,它提倡將單一應用程序劃分成一組小的服務,每個服務運行在其獨立的進程中,服務間采用輕量級通信機制互相溝通(通常是基於HTTP協議的RESTful API)。每個服務都圍繞著具體

容器與服務關係的思考

容器(雲)可以實現服務發現 、負載均衡、分散式等特性,微服務與容器(雲)也具有同樣的特徵。 那麼在一個大系統中,二者的關係是怎樣的呢?可以相互替代嗎? 兩者的區別: 容器著眼於部署架構,或者說是微服務的宿主,負責提供所需的容器,具備彈性伸縮能力。 微服務著眼於應用架構,負載

關於dubbo+zookeeper服務一些認識記錄

奇數 配置文件 記錄 span 兩個 ice xxx 示意圖 zookeeper 借鑒架構示意圖: 實例介紹: 公司某項目架構 服務器A:nginx 服務器BC:tomcat1、tomcat2 服務器D:Dubbo+zookeeper 服務器EF:db1+z

服務劃分的姿勢

我們知道微服務是一種理念,沒有確切的定義和邊界,好比設計原則,是屬於抽象的概念。在定義不明確的情況下談劃分也是一種各說各話,具體問題需要具體分析,所以這篇文章談到的劃分也不是絕對標準,僅供參考。   有人說微幅不難,難的是服務的劃分,雖然我持保留意見。但是從側面也反應了劃分具有一定的困難。這裡的矛盾

關於服務測試的思考

相信在網際網路領域的公司,對於微服務應該一點不陌生,越來越多的公司會採取這樣的一種架構 微服務的特點:   &

服務學習與思考(03):服務總體架構圖解

前面微服務2篇文章: - [微服務學習與思考(01):什麼是微服務?微服務的優勢和劣勢](https://www.cnblogs.com/jiujuan/p/13280473.html) - [微服務學習與思考(02):微服務實施前有哪些問題需要思考?](https://www.cnblogs.com/jiu

服務學習與思考(04):服務技術體系

前面微服務3篇文章: - [微服務學習與思考(01):什麼是微服務?微服務的優勢和劣勢](https://www.cnblogs.com/jiujuan/p/13280473.html) - [微服務學習與思考(02):微服務實施前有哪些問題需要思考?](https://www.cnblogs.com/jiu

中小企業對Spring Cloud服務架構實踐經驗總結的一些思考

原文出處:微信公眾號 什麼是微服務 微服務的概念源於 2014 年 3 月 Martin Fowler 所寫的一篇文章“Microservices”。文中內容提到:微服務架構是一種架構模式,它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為使

關於web服務安全的一些思考

拼接 返回 上下文 關於 加密 密碼 ref 問題 shiro 一、問題:   在開發web項目是時,安全問題有以下幾種問題:   (1)用戶可以自己偽造一個URL請求來進行訪問嗎?   (2)用戶不在服務器登錄,可以自己封裝出用戶名、密碼進行訪問嗎?   (3

spring cloud實戰與思考(二) 服務之間通過fiegn上傳多個文件1

jar 多文件 上傳文件 ret nmap spa 不同 port 問題 需求場景: 微服務之間調用接口一次性上傳多個文件。 上傳文件的同時附帶其他參數。 多個文件能有效的區分開,以便進行不同處理。   Spring cloud的微服務之間接口調用使用Feign。原裝的

spring cloud實戰與思考(三) 服務之間通過fiegn上傳一組文件(下)

ets inf str ceo iter protected let pan ins 需求場景:   用戶調用微服務1的接口上傳一組圖片和對應的描述信息。微服務1處理後,再將這組圖片上傳給微服務2進行處理。各個微服務能區分開不同的圖片進行不同處理。   上一篇博客已經討

服務設計的幾點思考

接觸微服務也有幾個月時間了,平時斷斷續續的會有一些關於微服務設計的思考,現在做個小結,與大家分享。 先上一張簡單的示意圖 底部是用到的資料儲存設施,中間部分是今天的主角,微服務群,最上面是一個統一入口,閘道器。 微服務應該分為核心微服務和業務微服務 理想的系統應該是小