一:微服務概念
1春锋、微服務的產(chǎn)生
隨著領域驅(qū)動開發(fā)、持續(xù)交付差凹、按需虛擬化期奔、基礎設施自動化、容器技術(shù)危尿、小型自治團隊呐萌、大型集群系統(tǒng)等等實踐的過程中,發(fā)現(xiàn)細粒度的服務架構(gòu)可用提交交付速度谊娇,并且有更多的機會嘗試新技術(shù)肺孤。微服務在技術(shù)決策上給予更大的自由度,更快遞響應未知或者不可避免的變化济欢。
2赠堵、微服務的概念
微服務是小而自治的服務。小是只專注做好一件事法褥,粒度和業(yè)務邊界匹配茫叭。自治是自我治理,服務方和消費方解耦半等。修改一個微服務并且對其進行部署揍愁,并不影響其他的服務呐萨。
3、微服務的優(yōu)點
1)技術(shù)的異構(gòu)性:一個公司系統(tǒng)可能用不同的技術(shù)棧解決不同的應用場景吗垮,服務提供的API的支持不同的技術(shù)調(diào)用就很重要
2)彈性:服務邊界就是艙壁垛吗。單塊系統(tǒng)中,如果服務不可用烁登,那么所有功能都不可用怯屉。微服務中一個組件不可用,并不導致級連故障饵沧。微服務善于處理不可用和功能降級問題锨络。
3)擴展:單塊系統(tǒng)只能一個整體進行擴展,一小部分存在性能問題狼牺,也需要整體驚醒擴張羡儿。微服務因為是細粒度的,所以容易擴展是钥。
4)簡化部署:單塊系統(tǒng)修改小部分代碼掠归、也需要整體應用程序發(fā)布變更,導致風險很高悄泥。微服務架構(gòu)中虏冻,各個服務部署都是獨立的。
5)與組織結(jié)構(gòu)相匹配:微服務架構(gòu)可以的與組織結(jié)構(gòu)匹配弹囚,從而提高團隊的生產(chǎn)力厨相。
6)可組合性:單純的PC時代已過去,微服務架構(gòu)中鸥鹉,提供接口給各個端使用蛮穿,可組合成各個服務想要的功能。
7)可替代性風險低:在單體遺留系統(tǒng)中毁渗,需要替換工作量大践磅,風險很高。微服務因為小而自治灸异,可以簡單并且小風險的替換或重寫音诈。
4、微服務與SOA的關系
微服務架架構(gòu)師面向服務架構(gòu)(SOA)的一種特定實現(xiàn)
5绎狭、微服務不是銀彈
微服務需要面對所有分布式系統(tǒng)所面對復雜性细溅,比如面對部署、測試儡嘶、監(jiān)控和擴展等工作喇聊。微服務是否適合你,需與公司的組織蹦狂、系統(tǒng)等很多因素有關誓篱。如果組織是中心化朋贬、集中化管理的可能不適合使用微服務。
二:微服務建模
1窜骄、什么樣的服務是好服務
1)低耦合:一個修改不影響另一個服務锦募,一個服務盡可能少的知道與之協(xié)作的相關服務的信息2)高內(nèi)聚:相關的行為聚集在一起,找到問題域的邊界確保相關行為聚集邻遏。
2糠亩、限界上下文
限界上下文包括兩部分內(nèi)容,一部分需要與外部通訊准验,另一部分不需要和外部通訊赎线。上下文必須都要有明確的接口,接口決定暴露哪些模型給其他的上下文糊饱。想要從一個限界上下文中獲取信息垂寥,需使用模型和他的對外通訊的邊界進行通訊。
1)共享的隱藏模型
同一個名字在不同的上下文中有完全不同的含義另锋。比如退貨滞项,在客戶上下文中,意味著寄送包裹夭坪,退款等文判、在倉庫上下文中,退貨是一個即將到來的包裹台舱,重新入庫等律杠。所以庫存是共享的模型潭流,不能完全暴露或者盲目的暴露出去竞惋。
2)模塊和服務
模塊:同一進程內(nèi)可以使用模塊減少彼此之間的耦合。發(fā)現(xiàn)領域內(nèi)部的限界上下文灰嫉,一定要對模塊對其進行建模拆宛,同時使用共享和隱藏模型。服務:模塊成為轉(zhuǎn)為微服務的候選讼撒。模塊上下文越清晰浑厚,轉(zhuǎn)為微服務成了可能,最終服務邊界和領域上下文保持一致根盒。
3)過早的劃分
過早的進行服務劃分钳幅,發(fā)展一段時間后,服務的邊界上下文可能和之前有所不同炎滞,導致很多跨服務的修改代價高敢艰,導致合并成單塊系統(tǒng)的風險。面度新的領域時册赛,很多時候?qū)⒁粋€已有的系統(tǒng)劃分成微服務钠导,要比從頭開始構(gòu)建微服務簡單的多震嫉。
4、業(yè)務建模
1)方法:當你在思考業(yè)務的上下文時牡属,不應該從數(shù)據(jù)共享的角度考慮票堵,而應該從這些上下文提供的功能來考慮。這些功能操作提供給其他業(yè)務逮栅。
2)溝通:在組織內(nèi)悴势,不僅僅共享上下文的概念,還應該統(tǒng)一和共享術(shù)語和想法证芭。
5瞳浦、劃分上下文
1)劃分方法:一開始識別粗粒度的限界上下文、這些粗粒度的上下文可能包括一些套嵌的限界上下文废士,這些套嵌的上下文不直接對外可見叫潦。
2)暴露原則:使用粗粒度上下文還是套嵌上下文暴露服務,哪個更合理官硝,應該有組織結(jié)構(gòu)來決定的矗蕊。
6)技術(shù)邊界
技術(shù)邊界有顯示層、業(yè)務層和數(shù)據(jù)層氢架,微服務可以按照技術(shù)邊界搭建技術(shù)架構(gòu)傻咖。搭建這個架構(gòu)之前需按照業(yè)務進行垂直劃分。
三岖研、微服務集成
微服務的集成做到好卿操,可以保持自治性、可以獨立發(fā)布修改和發(fā)布孙援。
1害淤、集成原則
1)避免破壞性修改
服務的一些修改不能導致該服務的消費方發(fā)生改變。
2)保證API與技術(shù)的無關性
3)保證API的易用性
4)隱藏內(nèi)部實現(xiàn)細節(jié)
2拓售、同步與異步
同步:調(diào)用方發(fā)起遠程服務調(diào)用后窥摄,調(diào)用方阻塞自己并且等待服務方的返回。
異步:調(diào)用方不需要等待服務方返回础淤,甚至可能不關心這個操作完成與否崭放。
3、編排與協(xié)同
編排:同步調(diào)用一組服務鸽凶,等待各個服務的返回結(jié)果币砂。優(yōu)點知道業(yè)務流程中每一步跨服務調(diào)用結(jié)果,缺點容易承擔太多的調(diào)用玻侥,太耗時决摧,導致調(diào)用方的不穩(wěn)定性。
協(xié)同:異步調(diào)用一組服務或服務調(diào)用加入隊列中,降低服務之間的耦合度蜜徽,帶來的額外工作業(yè)務流程跨服務的監(jiān)控祝懂,不過可通過消費方處理完成后,回調(diào)服務方告知處理結(jié)果拘鞋。
4砚蓬、版本管理
1)盡可能推遲破壞性修改
寬進嚴出的原則
2)盡早發(fā)現(xiàn)破壞性的修改
按照契約,通過測試及早發(fā)現(xiàn)是服務方還是消費方破壞性的修改
3)不同的接口版本共存
最好共存兩個版本
四盆色、微服務規(guī)幕彝埽化
1、故障無所不在
網(wǎng)絡是不可靠隔躲,只能盡力限制引起故障的因數(shù)摩梧,達到一定規(guī)模后,故障不可避免宣旱。
2仅父、跨功能需求
服務吞吐量、可用性和數(shù)據(jù)持久性等這些需求需要持續(xù)測量浑吟,并保證服務滿足可接受的目標笙纤。
3、功能降級
構(gòu)建彈性系統(tǒng)组力,因微服務功能分散省容,在有可能down機的微服務上,能夠安全的降級以保證彈性
4燎字、反服務脆弱
為了不會引起嚴重級聯(lián)影響腥椒,需要正確的設置超時、實現(xiàn)艙壁隔離或斷路層等以避免在第一時間調(diào)用一個不健康的服務候衍。
1)超時
設置超時時間對于調(diào)用下游服務十分重要笼蛛,超時時間設置太長有可能把下游系統(tǒng)拖慢,設置太短可能下游服務未處理完成脱柱。最好設置一個默認的超時時間伐弹,當超時發(fā)生時后拉馋,記錄到日志里看看發(fā)生了什么榨为,并且做響應的調(diào)整。
2)斷路器
使用斷路器煌茴,當請求下游服務發(fā)生一定數(shù)量的失敗后随闺,短路器打開,接下來的請求快速失敗蔓腐。一斷時間后矩乐,查看下游服務是否已服務,重置斷路器。
3)艙壁
未每個下游服務建立單獨的連接池散罕。超時和斷路器資源受限時釋放資源分歇,艙壁第一時間確保它不成為限制。還有一個拒絕請求的艙壁欧漱,用以避免資源飽和职抡,稱之為減載。
4)隔離
當下游服務離線误甚,上游服務不受影響缚甩。設置成為服務間隔離。
5窑邦、冪等
冪等操作擅威,多次執(zhí)行所產(chǎn)生的影響,均與一次執(zhí)行影響相同冈钦〗即裕可以把某些特定業(yè)務操作設計成冪等的,比如客戶下單送積分瞧筛。
6宾袜、擴展
增加負載、減少延遲驾窟。
1)更強大的主機:垂直擴展庆猫,更好的機器。
2)拆分負載:按業(yè)務拆分成不同的微服務
3)分散風險:數(shù)據(jù)跨機房绅络,異地備份等
4)負載均衡:避免服務單點故障
5)作業(yè)分離:Job獨立服務執(zhí)行
6)重新設計:一般設計系統(tǒng)需要考慮10倍容量增長月培。重新設計系統(tǒng)應對規(guī)模化恩急,是成功的標志杉畜。
7、擴展數(shù)據(jù)庫
1)服務的可用性
2)服務的持久性:多副本
3)讀取數(shù)據(jù)擴展:讀寫分離
4)寫操作擴展:分表分庫
5)共享數(shù)據(jù)庫設施:容易形成單點故障
6)CQRS:命令查詢職責分離
8衷恭、緩存
通過存儲之前的操作結(jié)果此叠,以便后續(xù)請求使用這個結(jié)果,而無需花重新計算或查詢随珠。
1)客戶端緩存
客戶端緩存獲取的結(jié)果灭袁,客戶端決定何時獲取新副本。一般是有下游服務提供緩沖的過期時間窗看∪灼纾客戶端緩存可以減少網(wǎng)絡調(diào)用次數(shù),并且減少下游服務負載的最快方法之一显沈,客戶端緩存數(shù)據(jù)软瞎,讓數(shù)據(jù)失效需要做額外的工作逢唤。
2)服務端緩存
服務端來負責處理緩存,容易跟蹤和優(yōu)化緩存的命中率涤浇。
3)代理服務器緩存
緩存在服務的和客戶端之間鳖藕,比如方向代理或CDN等。對一切客戶端和服務端不透明
4)HTTP緩存
5)為寫使用緩存
先寫入本地緩存只锭,之后某個時刻將數(shù)據(jù)寫入下游的吊奢,可能更規(guī)范化的數(shù)據(jù)源中。
6)為彈性使用緩存
下游服務不可用纹烹,客戶端可以緩存可能失效的數(shù)據(jù)页滚。
7)隱藏源服務
保護源服務,不直接暴露源服務铺呵。如果緩存不命中裹驰,立即失敗,異步重建緩存片挂。
8)保持簡單
避免太多地方使用緩存幻林,緩存越多,數(shù)據(jù)越可能失效音念,就越難保證數(shù)據(jù)的新鮮程度沪饺。
9、自動伸縮
響應型伸縮闷愤、預測型伸縮
10整葡、CAP定理
在分布式系統(tǒng)中有三方面需要彼此權(quán)衡:一致性、可用性和分區(qū)容忍性讥脐。這個定理告之我們最多只能能保證三個中的兩個遭居。CA系統(tǒng)在分布式系統(tǒng)中根本不存在。
11旬渠、服務發(fā)現(xiàn)
1)DNS
2)動態(tài)服務注冊:zookeeper俱萍、redis、consul
12告丢、文檔
接口文檔的重要性
五枪蘑、微服務總結(jié)
什么時候你不應該使用微服務
越不了解一個領域,為服務找到合適的限界上下文就越難岖免,邊界清晰穩(wěn)定后岳颇,再進行拆分。