主頁 > 軟體設計 > 微服務想用好,先把分布式和微服務之間的關系搞清楚

微服務想用好,先把分布式和微服務之間的關系搞清楚

2021-04-01 21:50:11 軟體設計

一、分布式和微服務架構的定義

分布式應用場景涵蓋的面非常廣,我理解的部分:

  • 不同行程之間的互相通信,
  • 不同主機的分布式物件之間呼叫,
  • 用于大資料存盤的分布式檔案系統,
  • 用于網路之間相互識別的命名服務,
  • 集群中計算或存盤的無中心對等模型,
  • 分布式事務,
  • 資料副本在分布式環境中的復制,
  • 云計算服務,
  • 音視頻在網路中的點播和傳輸
  • ....

微服務架構的目的是對原來過于大而重的云應用服務進行解耦,手段是進行比較合理的業務模塊拆解,拆解的粒度往往由架構師掌握,實作細粒度的服務,服務在云端形成分布式狀態,

那么微服務就具有了分布式的一些應用場景,比如:不同主機的分布式物件之間呼叫,以前EJB用RMI(遠程方法呼叫),現在微服務常用RPC(遠程程序呼叫);再比如:用于網路之間相互識別的命名服務,以前EJB是JNDI命名服務,現在SpringCloud的Euraka用于微服務的注冊和發現,也是分布式是命名服務,

如何通俗地理解「分布式系統」,它解決了哪些問題,有什么優缺點?

理解「分布式系統」曾經發生的事情

上面是我另外一個回答,里面比較詳細地描述了歷史上過去EJB和Spring的比較,也是分布式與單體應用的比較,那時候EJB代表分布式服務,而spring代表單體服務,

file

上面的圖簡單的描繪了一種最簡單的單體服務向微服務拆解的程序,當然微服務面臨的挑戰不僅僅這么簡單,這只是微服務的一種比較初始的狀態,

二、分布式和微服務這兩者解決了什么問題

分布式是計算、服務、存盤在網路中互相交流與協作的形式和狀態

分布式到底解決了什么?

file

上圖就是典型的分布式計算,一個大檔案被切分成四份,MapReduce分成四個任務(行程),然后在同一主機不同行程,或不同主機上進行資料處理,最終再通過網路匯聚到一個合并任務,那么這個時候到分布式就是任務并行,解決了單任務的效率問題,

file

上圖是個典型的分布式狀態協調管理圖,是Hadoop HDFS集群的HA高可用架構,主副兩個Namonode節點,必須活著一個,當判斷主的掛了,必須讓副的頂上去,這個時候,三個ZK(zookeeper)組成的集群就是作為主副節點的協調者,通過ZKFC行程實作對Namoenode節點的心跳監控和切換命令下發,

另外三個Journalnode節點形成的集群又是namonode分布式狀態資料保存的地方,當主namonode掛了,所有的狀態必須快速的恢復到副namenode的上面,所以Journalnode必須持續同步狀態,滿足hdfs集群狀態的快速恢復

那么分布式中非常關鍵的一個應用場景——集群,上述的Hadoop hdfs集群,就需要有一個或幾個角色(zookeeper,Journalnode),作為集群狀態的協調者和管理者,有時候這種狀態管理是對等的(GlusterFS),有時候這種狀態管理是集中的(Hadoop就是這樣),

微服務又解決了什么問題呢?

如果這時候在提微服務的分布式優勢,就不是目的,而是手段了,微服務只是借助了分布式架構,達到了自己的目的,所以微服務不是基礎技術架構的問題,而是上層應用的架構問題,

file

上面的例子是個簡單的互聯網醫療服務單體應用,這時候問診、藥品、訂單、即時訊息都是互聯網醫療最核心的業務,資訊推送目的是將互聯網醫療平臺的各類資訊進行互聯網資訊服務平臺的推送、發布和交流,達到自我推廣的目的,

可恰恰資訊推送服務的更新程度很高,因為需要對外連接的互聯網服務平臺情況復雜,也會有新的服務平臺納入到模塊范圍,那么作為單體應用就存在這樣一個部署問題,每次更新一個新的資訊推送功能,就要整體服務重新部署一次,那么這種影響對于核心服務就造成了很大的困擾,這時候的患者、醫生、醫院的業務影響都是大規模的,

file

再看看微服務架構,如果將資訊推送服務作為單獨的微服務存在,其他微服務只是將需要推送到互聯網服務平臺的內容進行遠程呼叫即可,甚至用訊息中心的方式,打包成訊息,實作訊息事件驅動,讓對外發布服務的部署不會干預到其他核心服務,使得整體平臺因為部署發布而造成的影響降到最低,這種方式是不是看起來就舒服多了,非常利于部署、發布,甚至增強了整體系統的魯棒性,

當然微服務解決的問題還有很多,團隊分工的細粒度、迭代速度的提升、更易于小范圍重構,利于持續化集成(devops)等等,就不一一具體描述了,只把它很有特點的部分拿出來理解一下,

三、這些架構帶來的利弊

分布式對應的是就是單機,其優點上節描述了一些,就不贅述了,缺點也很大
部署不簡單,運維不簡單
網路瓶頸和故障會有重要的影響,
節點若失效,就要有察覺和熱替換機制,
一致性問題,例如分布式事務一直是世界性難題,
不僅要考慮均衡負載,更要考慮均衡負載的效果,
資料進行分布式存盤,在有些對等模式下還要考慮資料傾斜問題,
微服務除了分布式存盤缺點6之外,上述前5個缺點基本上都完美的繼承了,

四、利用不當所帶來的技術債務

說說微服務設計不當的麻煩問題吧

(1)微服務解耦后,會將一些業務程式從原來資料庫查詢的方式,轉變成遠程物件呼叫,這個程序我在原來的回答中提過,這是反人性的,形成復雜度和需要約定的介面都帶來了比SQL查詢更大的作業量,而且更反人性的方式就是資料庫也跟著微服務進行分庫,到底哪些資料需要冗余,哪些資料還能保持資料庫范式,基本都能把高程們煩死,

(2)經驗欠缺的微服務架構師,容易將微服務切得太細,假如一個單體若被切分成一千個微服務,而且微服務之間用到了遠程物件序列化和反序列化,那么這就成了死穴!因為一旦一個微服務的物體物件進行了調整,那么有多少個關聯的微服務被污染了,就要不斷定位其他微服務的依賴關系并重新發布,這種作業量已經超出了本該解決業務問題的作業量,

因此微服務的劃分一定要注意,而且RPC之間的物件傳遞盡量用簡單、松散的結構來做,微服務劃分的程度根據業務不同而粒度不同,有種約定是一個微服務進行大的重構,需要一周的時間,做為微服務粒度標準,

五、專案直接使用微服務架構, 是基于對未來的考慮?

微服務架構的考慮,不應該是對未來的考慮,而是對過去單體式應用出現問題后的一種架構重構,從第一節中的圖可以看到其重構程序,在互聯網醫療的例子中微服務的重構進一步趨向于訊息驅動、事件驅動,

從以往實施微服務的經驗教訓中,我總結出來的經驗,如果是新專案的架構師,可以先選擇單體應用,然后根據業務發展一點點迭代重構到微服務上來,即便程序中微服務的架構不那么純粹,甚至單體應用和微服務很長一段時間共存,也要慎重從新的專案上直接去設計微服務,

因為誰也不是算命先生,能估算到自己業務系統會在哪一天,哪個層面,哪個范圍就一定需要微服務化解耦,只有系統運行快到那個階段了,才能讓架構師更容易做到合理的微服務化決策,當然了,也有人會有疑惑,系統設計成單體,誰還有心思繼續重構微服務,不如直接做成微服務架構多省事,而我想說的是,若無重構之力行,切勿有微服務之念想,

六、K8s和Spring Cloud有什么區別和聯系?

Spring Cloud是貫徹微服務架構的一種具體實作框架,包括了springboot作為微服務的獨立運行容器,Euraka作為微服務的注冊和發現,zuul服務網關,其他的沒怎么用,就不提,其實網關我更喜歡用Openresty,

k8s只是容器的一種編排框架,管理者大量的docker容器,但是現在k8s又不集成docker了,暈得很!

docker作為微服務的容器,為每一個微服務都提供了單獨的網路、檔案系統、行程管理等基礎設施,這樣每個微服務的狀態、運行日志可以更好的被監控和管理,另外容器讓部署程序變得簡單,促進了現在流行的devops開發、發布、部署一體的管理模式,微服務的容器化其實是天生一對,

七、結尾

當我們理解清楚分布式下的各種場景是什么的一種存在形式的時候,當我們理解微服務又是一種什么分布式場景的時候,我們就更能清楚的去做好微服務的設計決策,

前往讀位元組的知乎——了解更多關于大資料的知識

公眾號 "讀位元組" 大資料(技術、架構、應用)的深度,專業解讀

file

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/270926.html

標籤:架構設計

上一篇:多執行緒

下一篇:Java資料持久層

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more