從零打造聚合支付系統(tǒng):三吞杭、應(yīng)用微服務(wù)架構(gòu)

從零打造聚合支付系統(tǒng) 系列文章鏈接如下

從零打造聚合支付系統(tǒng):一龟虎、淺談聚合支付的核心價值
從零打造聚合支付系統(tǒng):二、建立領(lǐng)域模型
從零打造聚合支付系統(tǒng):三匠璧、應(yīng)用微服務(wù)架構(gòu)

上一篇建立了聚合支付的領(lǐng)域模型桐款,本篇將討論聚合支付系統(tǒng)的具體實現(xiàn)方案。

設(shè)計策略

在決定采用什么樣的架構(gòu)之前夷恍,不妨先回顧一下聚合支付的功能魔眨。

  • 為商戶提供支付的一站式接入,由商戶發(fā)起支付酿雪,在支付機構(gòu)和銀行落地遏暴。
  • 將商戶的支付、查詢指黎、退款信息朋凉,通過系統(tǒng)調(diào)用的方式傳遞給支付機構(gòu)和銀行。
  • 提供一些輔助功能醋安,如對賬杂彭、結(jié)算墓毒、商戶注冊、交易管理等亲怠。

實現(xiàn)這些功能可以采取如下的設(shè)計策略:

  1. 對外提供HTTP(或HTTPS)接口:首先所计,沒有比這個更通用的協(xié)議;其次团秽,這是由落地方?jīng)Q定的主胧,聚合支付系統(tǒng)只是商戶與支付機構(gòu)間的中介,不破壞兩者之間原有的協(xié)議是最省事的习勤;
  2. 第一要務(wù)是信息傳遞:作為一個中介踪栋,聚合支付既不管理資金賬戶,也不持有商品訂購的數(shù)據(jù)图毕,這與許多業(yè)務(wù)系統(tǒng)是有區(qū)別的己英。設(shè)計重心要放在為商戶與支付機構(gòu)之間提供穩(wěn)定的信道與準確的信息傳遞。而數(shù)據(jù)的管理吴旋,可以放在第二位考慮。
  3. 摒棄有狀態(tài)的設(shè)計:既然數(shù)據(jù)不在第一位考慮厢破,那么也就意味著荣瑟,數(shù)據(jù)的一致性要求可以適當降低,參考CAP的約束摩泪,可以讓我們在保證可用性和分區(qū)容錯性上有更多的發(fā)揮空間笆焰。

微服務(wù)架構(gòu)

無論是追捧還是質(zhì)疑,微服務(wù)架構(gòu)擁有巨大優(yōu)勢见坑,尤其是它讓敏捷開發(fā)和復雜的企業(yè)應(yīng)用交付成為可能嚷掠。———— 引用自「Chris Richardson 微服務(wù)系列」《微服務(wù)架構(gòu)概念解析》

Chris Richardson 如何理解微服務(wù)架構(gòu)荞驴?微服務(wù)架構(gòu)有什么優(yōu)缺點不皆?請參考文末附錄的的文章。

我認為熊楼,微服務(wù)架構(gòu)與聚合支付的契合度頗高霹娄,列舉幾點:

  • RESTful API是微服務(wù)中進程間通信標配:為什么選用HTTP做信道?不僅因為HTTP協(xié)議足夠靈活鲫骗,更因為不需要處理在引入特定的通信組件(如Thrift)帶來的復雜性犬耻。
  • 微服務(wù)架構(gòu)擅長于消息的可靠傳遞:在微服務(wù)特點的論述中,有大量篇幅用于探討如何傳遞息执泰,包括外部通信枕磁、進程間通信、容錯處理等术吝。同時计济,為了適應(yīng)眾多的場景茸苇,微服務(wù)架構(gòu)也發(fā)展出了各式各樣的通信組件可供使用。
  • 聚合支付免去微服務(wù)中關(guān)于數(shù)據(jù)分區(qū)的挑戰(zhàn):微服務(wù)會導致數(shù)擾分區(qū)峭咒,即相關(guān)數(shù)據(jù)被分在不同的數(shù)據(jù)庫中税弃,這讓保持多個服務(wù)數(shù)據(jù)的一致性成為挑戰(zhàn)。所幸聚合支付對數(shù)據(jù)一致性的要求不高凑队,這就讓我們實現(xiàn)微服務(wù)變的簡單则果,采用對賬來保證最終一致性即可;

另外一個關(guān)于微服務(wù)的挑戰(zhàn)來自于分區(qū)的數(shù)據(jù)庫架構(gòu)漩氨。同時更新多個業(yè)務(wù)主體的事務(wù)很普遍西壮。這種事務(wù)對于單體式應(yīng)用來說很容易,因為只有一個數(shù)據(jù)庫叫惊。在微服務(wù)架構(gòu)應(yīng)用中款青,需要更新不同服務(wù)所使用的不同的數(shù)據(jù)庫。使用分布式事務(wù)并不一定是好的選擇霍狰,不僅僅是因為 CAP 理論抡草,還因為當前高擴展性的 NoSQL 數(shù)據(jù)庫和消息傳遞中間件并不支持這一需求。最終你不得不使用一個最終一致性的方法蔗坯,從而對開發(fā)者提出了更高的要求和挑戰(zhàn)康震。———— 引用自「Chris Richardson 微服務(wù)系列」《微服務(wù)架構(gòu)概念解析》

  • 優(yōu)秀的橫向擴展能力滿足未來的性能要求:應(yīng)用微服務(wù)架構(gòu)的一個要點就是將服務(wù)設(shè)計為無狀態(tài)宾濒,使得每個服務(wù)都能簡單地橫向擴展腿短,規(guī)模化部署绘梦。這樣橘忱,即便單個服務(wù)實例的處理性能不夠強,也可以通過部署更多的實例來迅速滿足業(yè)務(wù)增長的需求卸奉。

微服務(wù)架構(gòu)模式使得每個服務(wù)獨立擴展钝诚。你可以根據(jù)每個服務(wù)的規(guī)模來部署滿足需求的實利。甚至于择卦,你可以使用更適合于服務(wù)資源需求的硬件敲长。 ———— 引用自「Chris Richardson 微服務(wù)系列」《微服務(wù)架構(gòu)概念解析》

  • 優(yōu)秀的解耦能力滿足未來分工的要求

這種架構(gòu)使得每個服務(wù)都可以有專門開發(fā)團隊來開發(fā)。開發(fā)者可以自由選擇開發(fā)技術(shù)秉继,提供 API 服務(wù)祈噪。……甚至于尚辑,因為服務(wù)都是相對簡單辑鲤,即使用現(xiàn)在技術(shù)重寫以前代碼也不是很困難的事情「懿纾———— 引用自「Chris Richardson 微服務(wù)系列」《微服務(wù)架構(gòu)概念解析》

構(gòu)建最小系統(tǒng)

接下來根據(jù)我們在上一篇文章中描述的領(lǐng)域模型月褥,應(yīng)用微服務(wù)架構(gòu)的思想構(gòu)建聚合支付系統(tǒng)弛随。

“最小系統(tǒng)”特指以下描述的每個部分都是不可缺少的。

服務(wù)劃分

橙色部分就是微服務(wù)架構(gòu)中的“服務(wù)”了宁赤。

  • 支付后臺:支付的核心功能舀透,處理來自于商戶后臺的支付與退款請求,是整個聚合支付消息傳遞的關(guān)鍵决左。
  • 收銀臺:考慮支付請求并不一定來自于后臺愕够。在實際支付場景中,請求可以由客戶端APP或瀏覽器跳轉(zhuǎn)過來佛猛,它與后臺請求所使用的網(wǎng)絡(luò)通常是不一樣的惑芭,某些場景下,還要提供讓客戶選擇支付方式的頁面继找。
  • 支付機構(gòu):支付落地在支付機構(gòu)或銀行遂跟,意味著最終是調(diào)用他們提供的接口,但支付機構(gòu)的接口并不是一成不變的婴渡,經(jīng)常會升級改造幻锁。將每個支付機構(gòu)的接口包裝成一個服務(wù),可以減少支付機構(gòu)接口改造核心業(yè)務(wù)模塊的影響边臼。
    對賬結(jié)算模塊:
  • 賬戶服務(wù):為了實時記賬而存在的服務(wù)越败,將支付金額按規(guī)則進行分賬,并與外部賬戶保持同步硼瓣。

值得說明的是,對賬結(jié)算模塊中除了賬戶服務(wù)之外置谦,比對結(jié)算功能通常不需要設(shè)計為服務(wù)堂鲤。比對通常使用批處理技術(shù)(如Spark或MapReduce),而結(jié)算模塊由于與會計系統(tǒng)對接媒峡,通常按指定的規(guī)范來實現(xiàn)瘟栖。

  • 商戶服務(wù):負責提供商戶交互的UI界面,融合商戶使用過程中所需的功能谅阿。

必要的輔助組件

  • API網(wǎng)關(guān):API 網(wǎng)關(guān)可以說是進入系統(tǒng)的唯一節(jié)點半哟。這與面向?qū)ο笤O(shè)計模式中的 Facade 模式很像。主要用來收斂后面的服務(wù)實現(xiàn)签餐。
  • 注冊中心:實現(xiàn)服務(wù)自動發(fā)現(xiàn)寓涨,從而實現(xiàn)客戶端負載均衡。
  • 配置中心:集中管理所有服務(wù)的配置氯檐,簡化配置過程戒良。

應(yīng)用微服務(wù)架構(gòu),以上是三個必要的輔助組件冠摄,需要配套部署糯崎,缺一不可几缭。

部署到云

對于小團隊,為了降低運維成本沃呢,方便擴展年栓,通常會租用云服務(wù)器。正巧薄霜,微服務(wù)架構(gòu)是云友好和容器(如Docker)友好的某抓,尤其是現(xiàn)在許多云平臺服務(wù)商都提供了容器技術(shù),更方便我們將聚合支付系統(tǒng)部署到云上黄锤。

如果你的團隊己經(jīng)做了聚合支付搪缨,而且己經(jīng)有業(yè)務(wù)在跑了,那么我強烈建議參考《將單體應(yīng)用改造為微服務(wù)》 一文鸵熟,盡快應(yīng)用微服務(wù)架構(gòu)副编。要小心,不要大規(guī)模重構(gòu)代碼流强,正如 Martin Fowler 所言痹届,“大規(guī)模重寫唯一能夠保證的只有大規(guī)模!”打月。眼光要看的足夠遠队腐,但步子不能一下子邁的太大。

最后奏篙,選擇語言

好了柴淘,我們打算動手寫代碼了。

但在這之前秘通,還有一件事我們要確定一下为严。

我們應(yīng)該構(gòu)建在什么語言平臺上?雖然微服務(wù)號稱對各種語言都兼容肺稀,但一個小團隊最重要的還是保持技術(shù)棧相對單一第股。

首先被排除的是C/C++,在初期话原,語言的效率就是團隊的效率夕吻,真的玩不起。

PHP雖然足夠簡單繁仁,但由于對微服務(wù)支持不佳涉馅,也被我們排除。

Nodejs與GO在國內(nèi)受眾仍然較少黄虱,考慮到招程序員的要求控漠,雖然看起來很酷,但我們還是別折騰了。

Python最近由于人工智能而大熱盐捷,但在微服務(wù)方面的支持還不是那么完善偶翅,還需要發(fā)展一下。

Java體系中有個非常硬霸的框架叫Spring Cloud碉渡,不只是對微服務(wù)支持很好聚谁,還喊出了“連接一切”的口號。

所以滞诺,沒有什么特別原因的話形导,建議還是選 Java 和 Spring Cloud吧。

附錄:微服務(wù)架構(gòu)的圭臬

本文反復提到了微服務(wù)架構(gòu)习霹,但微服務(wù)架構(gòu)并非本文重點朵耕。關(guān)于微服務(wù)的論述,我在此附上Chris Richardson的微服務(wù)系列文章淋叶。

以下是原文與譯文的鏈接阎曹。

  1. Introduction to Microservices
  2. Building Microservices: Using an API Gateway
  3. Building Microservices: Inter-Process Communication in a Microservices Architecture
  4. Service Discovery in a Microservices Architecture
  5. Event-Driven Data Management for Microservices
  6. Choosing a Microservices Deployment Strategy
  7. Refactoring a Monolith into Microservices
  1. 微服務(wù)架構(gòu)概念解析
  2. 構(gòu)建微服務(wù)架構(gòu):使用 API Gateway
  3. 深入微服務(wù)架構(gòu)的進程間通信
  4. 服務(wù)發(fā)現(xiàn)的可行方案以及實踐案例
  5. 微服務(wù)的事件驅(qū)動數(shù)據(jù)管理
  6. 選擇微服務(wù)部署策略
  7. 將單體應(yīng)用改造為微服務(wù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市煞檩,隨后出現(xiàn)的幾起案子处嫌,更是在濱河造成了極大的恐慌,老刑警劉巖斟湃,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熏迹,死亡現(xiàn)場離奇詭異,居然都是意外死亡凝赛,警方通過查閱死者的電腦和手機注暗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墓猎,“玉大人友存,你說我怎么就攤上這事√招疲” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵直晨,是天一觀的道長搀军。 經(jīng)常有香客問我,道長勇皇,這世上最難降的妖魔是什么罩句? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮敛摘,結(jié)果婚禮上门烂,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好屯远,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布蔓姚。 她就那樣靜靜地躺著,像睡著了一般慨丐。 火紅的嫁衣襯著肌膚如雪坡脐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天房揭,我揣著相機與錄音备闲,去河邊找鬼。 笑死捅暴,一個胖子當著我的面吹牛恬砂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蓬痒,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼泻骤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乳幸?” 一聲冷哼從身側(cè)響起瞪讼,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粹断,沒想到半個月后符欠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡瓶埋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年希柿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片养筒。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡曾撤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晕粪,到底是詐尸還是另有隱情挤悉,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布巫湘,位于F島的核電站装悲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏尚氛。R本人自食惡果不足惜诀诊,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阅嘶。 院中可真熱鬧属瓣,春花似錦载迄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溜畅,卻和暖如春捏卓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慈格。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工怠晴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浴捆。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓蒜田,卻偏偏與公主長得像,于是被迫代替她去往敵國和親选泻。 傳聞我的和親對象是個殘疾皇子冲粤,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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