都在說(shuō)微服務(wù),那么微服務(wù)的反模式和陷阱是什么(二)

都在說(shuō)微服務(wù),那么微服務(wù)的反模式和陷井是什么(一)
http://www.lxweimin.com/p/3986239138fe

六、無(wú)因的開(kāi)發(fā)者陷阱

名字來(lái)自詹姆斯·迪恩演的電影《無(wú)因的反叛》(Rebel Without a Cause),一個(gè)問(wèn)題青年因?yàn)殄e(cuò)誤的原因做了錯(cuò)誤的決定。

很多架構(gòu)師和開(kāi)發(fā)者在微服務(wù)的開(kāi)發(fā)中權(quán)衡利弊, 比如服務(wù)粒度和運(yùn)維工具,但是基于錯(cuò)誤的原因,做了錯(cuò)誤的決定。

6.1 做出錯(cuò)誤的決定

圖6-1說(shuō)明了一種情況是通過(guò)測(cè)試發(fā)現(xiàn)服務(wù)劃分的太細(xì)了,因此非常影響性能,主要是由于服務(wù)劃分的太細(xì)導(dǎo)致增加了通信工作量也在一定程度上對(duì)穩(wěn)定性造成一定影響。在這種情況下,開(kāi)發(fā)人員或架構(gòu)師決定將這些服務(wù)整合到一個(gè)更粗粒度的服務(wù)中,以解決性能和可靠性問(wèn)題。

圖6-1

這個(gè)方案看起來(lái)似乎合情合理,但是之后的布署、更改控制和測(cè)試都會(huì)受到影響。

再看圖6-2,這種場(chǎng)景是左邊的服務(wù)太粗了,影響了服務(wù)的測(cè)試和布署,于是進(jìn)行了拆分,減少了每個(gè)服務(wù)的范圍。

圖6-2

通過(guò)以上二個(gè)場(chǎng)景我們可以看出,如果服務(wù)太細(xì)我們就需要考慮將服務(wù)合并,如果服務(wù)太粗,我們又會(huì)考慮將服務(wù)進(jìn)行拆分。太細(xì)的話會(huì)增加通信成本和容易造成可靠性不穩(wěn)定,太粗的話又容易導(dǎo)致不容易測(cè)試和上線布署,所以這就要看我們?nèi)绾蝸?lái)權(quán)衡利弊。

6.2 了解業(yè)務(wù)驅(qū)動(dòng)

了解業(yè)務(wù)驅(qū)動(dòng)對(duì)于合理設(shè)計(jì)微服務(wù)至關(guān)重要,每一個(gè)架構(gòu)師或者開(kāi)發(fā)者都應(yīng)該先回答以下三個(gè)問(wèn)題:

  • 我們?yōu)槭裁匆O(shè)計(jì)微服務(wù)架構(gòu)?
  • 主要的業(yè)務(wù)驅(qū)動(dòng)是什么?
  • 最重要的架構(gòu)特點(diǎn)是什么?

使用可布署、性能、健壯性和可擴(kuò)展作為主要的架構(gòu)特性,我們其實(shí)最先需要考慮的是如何利用業(yè)務(wù)來(lái)進(jìn)行服務(wù)的整合和拆分。

場(chǎng)景一:遷移到微服務(wù)主要是想達(dá)到快速上線和布署

在這種場(chǎng)景下服務(wù)的可布署能力相對(duì)要大于性能、穩(wěn)定性因素,所以要拆分服務(wù)的時(shí)候可以考慮稍微細(xì)粒度一些。

場(chǎng)景二:遷移到微服務(wù)主要是想提高系統(tǒng)的性能和健壯性

這種場(chǎng)景是從單一應(yīng)用程序遷移到微服務(wù)架構(gòu)的一個(gè)常見(jiàn)因素,很多公司都是業(yè)務(wù)驅(qū)動(dòng),那么就需要考慮服務(wù)的可靠性和健壯性,因此傾向于更粗粒度的服務(wù),而不是細(xì)粒度的服務(wù)。

我經(jīng)常使用的一種方式借助白板和團(tuán)隊(duì)成員一起討論,如圖6-3所示,每當(dāng)有服務(wù)粒度的劃分問(wèn)題的時(shí)候,我們經(jīng)常在白板上做草稿討論清楚。

圖6-3

七、趕潮流陷阱

你必須擁抱微服務(wù),因?yàn)檫@是目前的趨勢(shì),而且其他人和公司目前都已經(jīng)這么做了。

我們盲目的使用微服務(wù),卻還沒(méi)有仔細(xì)分析業(yè)務(wù)需求、組織架構(gòu)和技術(shù)環(huán)境,這就是隨大流陷阱。

避免這個(gè)陷阱的方式充分理解微服務(wù)的好處和短處,俗話說(shuō),知己知彼,百戰(zhàn)不殆。

7.1 微服務(wù)的優(yōu)點(diǎn)和缺點(diǎn)

優(yōu)點(diǎn):

  • 發(fā)布:易于發(fā)布
  • 測(cè)試:易于測(cè)試
  • 改變控制:更容易的改變一個(gè)服務(wù)的功能
  • 模塊
  • 規(guī)模可擴(kuò)展

缺點(diǎn):

  • Team組織改變
  • 性能
  • 可靠性降低
  • 運(yùn)維難度加大
7.2 其他架構(gòu)模型

微服務(wù)的架構(gòu)很好,但是不是唯一的架構(gòu)模式,比如下面還有一些其它的架構(gòu)模式:

  • Service-Based Architecture
  • Service-Oriented Architecture
  • Layered Architecture
  • Microkernel Architecture
  • Space-Based Architecture
  • Event-Driven Architecture
  • Pipeline Architecture

當(dāng)然你并不一定只使用唯一的一種架構(gòu)模式,你可能在系統(tǒng)中混用這些架構(gòu)模式。

下面有一些架構(gòu)的參考資料:
Software Architecture Fundamentals: Understanding the Basics
Software Architecture Fundamentals: Beyond the Basics
Software Architecture Fundamentals: Service-Based Architecture
Software Architecture Patterns
Microservices vs. Service-Oriented Architecture

八、靜態(tài)契約陷阱

在微服務(wù)的消費(fèi)者和提供者之間提供了一種契約,契約主要包括輸入和輸出數(shù)據(jù)、以及操作的名稱,契約通常是以XML、JSON或者JAVA對(duì)象等來(lái)表示。但是這些契約永遠(yuǎn)不會(huì)改變嗎?

這里舉個(gè)例子來(lái)說(shuō)明因?yàn)榉?wù)契約版本控制而發(fā)生的問(wèn)題:
假如你有一個(gè)服務(wù)是由三個(gè)不同的客戶端訪問(wèn)(client1、client2和client3),這時(shí)client1想更改服務(wù)契約,你要檢查client2和client3能否適應(yīng)這個(gè)改變,并且client2和client3告訴我適應(yīng)不了這個(gè)改變,需要數(shù)周時(shí)間才能調(diào)整完成。這時(shí)候我需要告訴client1,client2和client3需要數(shù)周時(shí)間才能適應(yīng)調(diào)整完成,但是client1卻不能等待這么長(zhǎng)時(shí)間。

可以在你的服務(wù)契約中提供版本控制,實(shí)現(xiàn)向后兼容。現(xiàn)在我們可以根據(jù)client1的請(qǐng)求做一些靈活的控制,我們可以創(chuàng)建一個(gè)新版本的契約,比如v1.1,client2和client3依然使用v1版本,這樣client1就可以立刻作為契約更改,而不必糾結(jié)于client2和client3需要適應(yīng)調(diào)整的時(shí)間。

有兩種實(shí)現(xiàn)方式:在header中加入版本號(hào),或者在契約自身scheme中加入版本號(hào)。

8.1 header版本控制

契約版本的第一種辦法是把版本號(hào)放在遠(yuǎn)程訪問(wèn)協(xié)議頭,如圖8-1所示,遠(yuǎn)程訪問(wèn)協(xié)議包括REST, SOAP, AMQP, JMS, MSMQ等等。

圖8-1

例如在使用REST的時(shí)候,可以使用MIME類型來(lái)指定協(xié)議版本,如下代碼:

POST /trade/buy
Accept: application/vnd.svc.trade.v2+json

通過(guò)在header的MIME類型中指定契約版本號(hào),服務(wù)端就可以通過(guò)header的MINE類型解析得到相應(yīng)的版本號(hào)。

8.2 Schema版本控制

第二種版本控制方式是在契約自身中進(jìn)行,不需要在header中指定版本號(hào),如圖8-2所示。

圖8-2

請(qǐng)先看如下json格式數(shù)據(jù):

{
        "$schema": "http://json-schema.org/draft-04/schema#",
        "properties": {
          "version": {"type": "integer"},
          "acct": {"type": "number"},
          "cusip": {"type": "string"},
          "sedol": {"type": "string"},
          "shares": {"type": "number", "minimum": 100}
       },
        "required": ["version", "acct", "shares"]
}

該模式直接將版本號(hào)定義在契約的輸入數(shù)據(jù)中,這種模式最大的優(yōu)點(diǎn)是與協(xié)議無(wú)關(guān),只與數(shù)據(jù)格式有關(guān)。

POST /trade/buy
    Accept: application/json
    { "version": "2",
      "acct": "12345",
      "sedol": "2046251",
      "shares": "1000" }

    String msg = createJSON(
      "version","2",
      "acct","12345",
      "sedol","2046251",
      "shares","1000")};
    jmsContext.createProducer().send(queue, msg);

這種方式也有一些不足就是每一次都需要對(duì)消息數(shù)據(jù)進(jìn)行解析,提取出版本號(hào)進(jìn)行校驗(yàn),而且數(shù)據(jù)格式也有可能會(huì)改變也不太容易做到自動(dòng)映射到JAVA對(duì)象中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,615評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 176,606評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 63,044評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,826評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,227評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,447評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,992評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,807評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,001評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評(píng)論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,243評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,667評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,930評(píng)論 1 287
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,709評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,996評(píng)論 2 374

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