微服務(wù)設(shè)計(jì)開發(fā)實(shí)踐與原則

1.好的微服務(wù)是什么樣的堕虹?

1.1.特點(diǎn)分析

首先看一下微服務(wù)架構(gòu)的定義:微服務(wù)(MSA)是一種架構(gòu)風(fēng)格趁冈,旨在通過將功能分解到各個(gè)離散的服務(wù)中以實(shí)現(xiàn)對(duì)解決方案的解耦。它有如下幾個(gè)特征:

小,且只干一件事情赊锚。

獨(dú)立部署和生命周期管理。

異構(gòu)性輕量級(jí)通信,RPC或者Restful骗灶。

1.2.設(shè)計(jì)原則

針對(duì)以上特點(diǎn)華為實(shí)踐經(jīng)驗(yàn)的微服務(wù)設(shè)計(jì)原則如下:

(1)功能完整性耙旦、職責(zé)單一性免都。

(2)粒度適中,團(tuán)隊(duì)可接受脓规。

(3)迭代演進(jìn)侨舆,非一蹴而就绢陌。

(4)API的版本兼容性優(yōu)先考慮脐湾。

1.3.落地實(shí)踐建議

(1)接口隔離,如管理接口和生產(chǎn)接口隔離愁铺,低性能接口隔離帜讲,大報(bào)文接口隔離椒拗;

(2)建議每服務(wù)應(yīng)用約2~5個(gè)微服務(wù)蚀苛,每個(gè)微服務(wù)10個(gè)以內(nèi)接口堵未;

(3)迭代設(shè)計(jì)和實(shí)現(xiàn)微服務(wù)接口渗蟹,每輪迭代都需要業(yè)務(wù)側(cè)實(shí)際使用微服務(wù),并及時(shí)反饋微服務(wù)接口問題授艰,以驗(yàn)證微服務(wù)接口設(shè)計(jì)世落。

(4)查詢服務(wù)(query)屉佳、驗(yàn)證服務(wù)(check)、管理服務(wù)(update,add,delete)和業(yè)務(wù)服務(wù)分類劃分服務(wù)圆凰,約定服務(wù)命名等規(guī)范专钉;

(5)減少不必要的數(shù)據(jù)返回干旁,批量接口争群,考慮限制分批條數(shù)。

(6)API版本兼容玉雾,考慮隱式傳參(框架層面使用通用參數(shù))复旬、業(yè)務(wù)擴(kuò)充使用BaseRequest 請(qǐng)求基類屬性Map expandAttribute

1.4.討論問題

1.4.1 接口設(shè)計(jì)遵循異常還是返回碼驹碍?

微服務(wù)接口設(shè)計(jì)是否借用java語言特性凡恍,接口拋異常還是使用返回碼機(jī)制嚼酝,需要結(jié)合實(shí)際情況分析。

下面是采用異常定義:

publicBindWoAccountResponse bindWoAccount(BindWoAccountRequest request) throwsForbiddenException, ParamNullException, ?BizException;

采用返回定義钧舌,則響應(yīng)response需要添加異常嗎描述

publicBindWoAccountResponse bindWoAccount(BindWoAccountRequest request)

結(jié)論:采用異常碼洼冻,原因

1).異常帶有語言特性,異構(gòu)語言無法處理?

2).加上異常之后驾荣,業(yè)務(wù)異常和通信異常播掷,客戶端捕獲容易混亂麻煩?

1.4.2 服務(wù)要不要版本號(hào)version撼班,如何管理砰嘁?

微服務(wù)的版本號(hào)有眾多好處,此處不再贅述斟冕,但是實(shí)際使用過程中磕蛇,很多團(tuán)隊(duì)為了方便并不設(shè)置版本號(hào)十办,這個(gè)需要討論向族,后期服務(wù)眾多的時(shí)候,再引入版本號(hào)再扭,問題如何處理霍衫?

2.同步、異步澄干、并行調(diào)用服務(wù)柠傍?

2.1.調(diào)用方式

客戶端調(diào)用服務(wù)端惧笛,存在分為同步患整、異步和并行調(diào)用各谚,不同的調(diào)用方式到千,框架的處理方式不一樣憔四,服務(wù)化的性能也不一樣,什么樣場(chǎng)景用什么調(diào)用方式潜支,需要具體分析冗酿。



2.2.同步調(diào)用

同步調(diào)用是最簡(jiǎn)單已烤,也是最常用的調(diào)用方式妓羊,客戶端發(fā)送請(qǐng)求等待,響應(yīng)通知裕循。

1.請(qǐng)求和響應(yīng)剥哑,服務(wù)處理短,實(shí)時(shí)要求高的場(chǎng)景

2.請(qǐng)求和響應(yīng)株婴,服務(wù)處長(zhǎng)困介,業(yè)務(wù)上同步轉(zhuǎn)異步的場(chǎng)景

比如,批量接口調(diào)用徒扶,服務(wù)接收請(qǐng)求后直接返回批次處理中(processing)姜骡,處理完后續(xù)主動(dòng)通知上層服務(wù)屿良。

2.3.異步調(diào)用

采用異步調(diào)用管引,可以避免線程阻塞,提升系統(tǒng)的吞吐量和可靠性谅将。但是在實(shí)際項(xiàng)目中異步調(diào)用也有一些缺點(diǎn)重慢,導(dǎo)致使用不是特別廣泛:需要寫異步回調(diào)邏輯似踱,與傳統(tǒng)的接口調(diào)用使用方式不一致,開發(fā)難度大一些囚戚。一些場(chǎng)景下需要緩存上下文信息驰坊,引入可靠性問題哮独。

使用場(chǎng)景:

1.單服務(wù)調(diào)用,主線程除了服務(wù)調(diào)用之外舟扎,本身還有大量耗時(shí)的業(yè)務(wù)操作而且業(yè)務(wù)操作與服務(wù)響應(yīng)無關(guān)睹限。

2.多服務(wù)調(diào)用,主線程調(diào)用服務(wù)之間不存在業(yè)務(wù)關(guān)聯(lián)删窒,而且服務(wù)處理時(shí)間不同顺囊,服務(wù)時(shí)間大的可以采用異步調(diào)用特碳。

下圖為實(shí)際例子:

2.4.并行調(diào)用

并行調(diào)用適用于多個(gè)服務(wù)調(diào)用沒有上下文依賴,邏輯上可以并行處理闸准,類似JDK的Fork/Join, 并行服務(wù)調(diào)用涉及到同步轉(zhuǎn)異步、異步轉(zhuǎn)同步蒸其、結(jié)果匯聚等摸袁,技術(shù)實(shí)現(xiàn)難度較大义屏,目前多數(shù)服務(wù)框架并不支持。采用并行服務(wù)調(diào)用蝶怔,可以把傳統(tǒng)串行的服務(wù)調(diào)用優(yōu)化成并行處理踢星,能夠極大的縮短服務(wù)調(diào)用時(shí)延察迟。

使用場(chǎng)景:多服務(wù)調(diào)用,主線程調(diào)用服務(wù)之間不存在業(yè)務(wù)關(guān)聯(lián)所踊,業(yè)務(wù)上使用并行調(diào)用優(yōu)化調(diào)用時(shí)間概荷。下面為業(yè)務(wù)使用多線程實(shí)現(xiàn)簡(jiǎn)單場(chǎng)景的并行調(diào)用。

備注:并行要求JAVA并發(fā)技術(shù):1.線程池 2.CountDownLatch 3.Future

3.如何做服務(wù)調(diào)優(yōu)修壕?

3.1.發(fā)現(xiàn)問題

(1)Load Runner 測(cè)試

(2)業(yè)務(wù)日志(業(yè)務(wù)日志慈鸠、aop切片日志查看方法灌具、sql執(zhí)行時(shí)間)咖楣、調(diào)用鏈日志

(3)緩存查看工具诱贿,性能指標(biāo)優(yōu)化

(4)服務(wù)治理頁面查看服務(wù)性能

3.2.調(diào)優(yōu)策略

(1)串行調(diào)用改為異步調(diào)用和并行調(diào)用

(2)引入緩存,消息隊(duì)列

(3)服務(wù)參數(shù)配置調(diào)優(yōu)料扰,線程池大小记罚,通道鏈個(gè)數(shù)壳嚎、JVM堆大小烟馅、日志級(jí)別郑趁、服務(wù)治理等

(4)同步轉(zhuǎn)異步

4.如何服務(wù)化共享緩存寡润?

服務(wù)化之后必須要面臨的問題一定包括共享緩存問題,目前主流共享緩存使用中間件redis躲惰。但是各個(gè)微服務(wù)應(yīng)用如何使用共享緩存础拨,分為集中化管理對(duì)外提供微服務(wù)和各個(gè)微服務(wù)獨(dú)立連接緩存。下圖做了簡(jiǎn)單的比較滔蝉,歡迎大家討論蝠引。

5.分布式事務(wù)建議芳悲?

分布式事務(wù)就是指事務(wù)的參與者、支持事務(wù)的服務(wù)器、資源服務(wù)器以及事務(wù)管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點(diǎn)之上肮韧。

1.如果業(yè)務(wù)場(chǎng)景需要強(qiáng)一致性, 那么盡量避免將它們放在不同服務(wù)中, 也就是盡量使用本地事務(wù), 避免使用強(qiáng)一致性的分布式事務(wù).

2.如果業(yè)務(wù)場(chǎng)景能夠接受最終一致性, 那么最好是使用基于消息的最終一致性的方案(異步確保型)來解決.

3.如果業(yè)務(wù)場(chǎng)景需要強(qiáng)一致性, 并且只能夠進(jìn)行分布式服務(wù)部署, 那么最好是使用TCC方案而不是2PC方案來解決.

Q&A

對(duì)上述問題如果有好的建議和方案弄企,歡迎隨時(shí)留言.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市约素,隨后出現(xiàn)的幾起案子圣猎,更是在濱河造成了極大的恐慌送悔,老刑警劉巖爪模,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屋灌,死亡現(xiàn)場(chǎng)離奇詭異声滥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纽疟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門散吵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矾睦,“玉大人枚冗,你說我怎么就攤上這事赁温」赡遥” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵更啄,是天一觀的道長(zhǎng)稚疹。 經(jīng)常有香客問我,道長(zhǎng)祭务,這世上最難降的妖魔是什么内狗? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮待牵,結(jié)果婚禮上其屏,老公的妹妹穿的比我還像新娘。我一直安慰自己缨该,他們只是感情好偎行,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贰拿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妙真。 梳的紋絲不亂的頭發(fā)上练般,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天摄职,我揣著相機(jī)與錄音击孩,去河邊找鬼及皂。 笑死板驳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播此熬,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼阴汇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咕宿,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤试浙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后壹哺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攀甚,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埠居,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年捏浊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怨咪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情峡懈,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布冻河,位于F島的核電站堪澎,受9級(jí)特大地震影響钮呀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦称簿、人聲如沸士嚎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春繁疤,著一層夾襖步出監(jiān)牢的瞬間褐啡,已是汗流浹背糕档。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工吱七, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓谋币,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 摘要:本文中泼返,我們將進(jìn)一步理解微服務(wù)架構(gòu)的核心要點(diǎn)和實(shí)現(xiàn)原理拱绑,為讀者的實(shí)踐提供微服務(wù)的設(shè)計(jì)模式屠阻,以期讓微服務(wù)在讀者...
    Java架構(gòu)師Carl閱讀 5,750評(píng)論 0 20
  • 轉(zhuǎn)載本文需注明出處:微信公眾號(hào)EAWorld吧恃,違者必究蝇闭。 微服務(wù)架構(gòu)現(xiàn)在是談到企業(yè)應(yīng)用架構(gòu)時(shí)必聊的話題逻悠,微服務(wù)之所...
    72a1f772fe47閱讀 3,476評(píng)論 0 38
  • 一融柬、微服務(wù)將變得輕量級(jí) 架構(gòu)需要由人去設(shè)計(jì),這些人被稱為架構(gòu)師狼渊∠浒荆或許很多人并未授予架構(gòu)師的頭銜,但自己卻從事著架構(gòu)...
    justmilkrain閱讀 5,415評(píng)論 10 109
  • 1. 微服務(wù)架構(gòu)介紹 1.1 什么是微服務(wù)架構(gòu)狈邑? 形像一點(diǎn)來說城须,微服務(wù)架構(gòu)就像搭積木,每個(gè)微服務(wù)都是一個(gè)零件米苹,并使...
    靜修佛緣閱讀 6,630評(píng)論 0 39
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理糕伐,服務(wù)發(fā)現(xiàn),斷路器蘸嘶,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139