8583 over http

N年前曾有一個架構(gòu)設(shè)計的案例捣卤。

一绳锅、需求

【背景】

當(dāng)時集團有10萬名一線員工,每名一線員工工作都手持一個基于Android系統(tǒng)定制的移動設(shè)備(下文簡稱A設(shè)備)蜈膨。類似于手機屿笼,通過SIM卡可進行網(wǎng)絡(luò)通信。其上安裝多個應(yīng)用翁巍,支持多種業(yè)務(wù)驴一。A設(shè)備其中一個附件設(shè)備可支持刷卡支付業(yè)務(wù),簡稱此應(yīng)用為pos應(yīng)用灶壶。另有一個用于無卡支付的應(yīng)用肝断,簡稱為pay應(yīng)用。由于發(fā)展歷程的原因驰凛,兩個應(yīng)用都是符合ISO8583協(xié)議要求胸懈,但對8583部分可自定義的字段由于業(yè)務(wù)場景的不同,有不同的自定義實現(xiàn)恰响。而且這兩個應(yīng)用由不同的開發(fā)團隊實現(xiàn)趣钱,無法兼容。A設(shè)備除了pos應(yīng)用胚宦、pay應(yīng)用還部署了很多集團旗下其它子公司的應(yīng)用首有。pay應(yīng)用、pos應(yīng)用作為前端枢劝,其對應(yīng)的后端應(yīng)用系統(tǒng)也是不同的井联。而根據(jù)業(yè)務(wù)發(fā)展趨勢,后續(xù)的業(yè)務(wù)類型會更多您旁,而自定義的8583報文協(xié)議已經(jīng)顯示出力不從心烙常。特別是從3G網(wǎng)絡(luò)升級到4G網(wǎng)絡(luò),A設(shè)備承載的業(yè)務(wù)將增加圖像等多媒體信息鹤盒。

【需求】

由于集團發(fā)展戰(zhàn)略的需要蚕脏,要進一步加強終端設(shè)備的管控,將只允許A設(shè)備通過https直接接入集團私有云昨悼,再由集團的私有云接到原有機房服務(wù)器蝗锥。如何設(shè)計一個改造方案,能以盡可能低的成本完成集團要求并支持未來發(fā)展需要率触?

原有的部署:pos app / pay app ----( 8583協(xié)議基于tcp短連接 )----> bff ----(hessian rpc ) ----> ms 终议。
要求的部署:A設(shè)備(pos app / pay app) ---- ( https ) ----> 集團的私有云 ---->公司 SF網(wǎng)絡(luò)區(qū)。

【補充】

  1. 8583協(xié)議是基于ISO8583報文國際標(biāo)準(zhǔn)的包格式的通訊協(xié)議葱蝗,8583包最多由128個字段域組成穴张,每個域都有統(tǒng)一的規(guī)定,并有定長與變長之分两曼。8583包前面一段為位圖皂甘,它是打包解包確定字段域的關(guān)鍵。8583協(xié)議都是請求響應(yīng)式悼凑,沒有會話狀態(tài)關(guān)聯(lián)多個請求偿枕¤邓玻客戶端發(fā)起一個請求,服務(wù)器端對應(yīng)的接收請求渐夸,驗證請求嗤锉,處理請求,響應(yīng)結(jié)果墓塌。8583報文是二進制數(shù)據(jù)的格式瘟忱。

  2. bff是一個Backend for Frontend前置網(wǎng)關(guān)性質(zhì)的應(yīng)用系統(tǒng),負責(zé)解釋8583報文苫幢,編排串聯(lián)并調(diào)用rpc微服務(wù)访诱,再將rpc微服務(wù)響應(yīng)的結(jié)果,編碼成8583報文響應(yīng)給前端韩肝。前端app 通過8583協(xié)議訪問bff前置系統(tǒng)触菜。而其中的8583協(xié)議是BFF基于mima框架TCP短鏈接實現(xiàn)的,TCP有SSL安全層伞梯。一次請求與響應(yīng)玫氢,就對應(yīng)于一次TCP連接的打開與關(guān)閉帚屉。bff前面有F5負載均衡器谜诫。

  3. ms在這里是指后端的多個微服務(wù)架構(gòu)風(fēng)格的應(yīng)用系統(tǒng),支持hessian 協(xié)議攻旦,micro-service-a, micro-service-b, micro-service-c... 喻旷。bff與ms都部署在公司Server Farms 網(wǎng)絡(luò)區(qū),此網(wǎng)絡(luò)區(qū)與私有云有專線連接牢屋。

二且预、分析

  1. pay app + pos app 需要支持?jǐn)?shù)千的TPS。
    并發(fā)請求不是太高烙无。但A設(shè)備有10萬锋谐,維持10萬的長連接成本較高,是沒有太多必要的截酷。
  2. 8583報文最大不超過10KB涮拗。
    對私有云至SF網(wǎng)絡(luò)區(qū)的專線帶寬有些要求。
  3. 基本屬于重構(gòu)的范圍迂苛,不涉及業(yè)務(wù)功能的變化三热。但需要支持發(fā)展趨勢。一是一線員工需要假設(shè)一定的增長速度三幻。二是隨著A設(shè)備全部升級為4G網(wǎng)絡(luò)就漾,能承載的業(yè)務(wù)也更多種多樣,8583報文的靈活性不及restful念搬。
  4. 已自定義的8583報文抑堡,按MESSAGE_TYPE+PROCESSING_CODE計算摆出,包括請求與答復(fù),按1000類報文評估首妖。
    如果全部都直接改造系統(tǒng)代碼懊蒸,改為restful風(fēng)格的URL形式,顯然是開發(fā)與測試成本極大的悯搔。想要更低成本的解決方案骑丸,就必須保留8583報文原本的編碼解碼邏輯,將其報文內(nèi)容通過https傳輸妒貌。

三通危、架構(gòu)方案

【設(shè)計思路】

基于以上需求分析,架構(gòu)方案的主要思路是:8583 over http灌曙。
將8583二進制報文內(nèi)容基于https協(xié)議傳輸菊碟。即在HTTP服務(wù)器的配置文件中增加一種自定義的MIME( Multipurpose Internet Mail Extensions)多用途互聯(lián)網(wǎng)郵件擴展類型。例如content-type可命名為"application/pay8583", ”application/pos8583“在刺。只要自已的http服務(wù)器能識別即可逆害。如果http服務(wù)器不方便修改,采用application/octet-stream的content-type也是可行的蚣驼。但需要另外定義一個http頭部字段標(biāo)識具體是哪一種8583自定義報文格式魄幕。

在集團私有云部署3臺Nginx服務(wù)器,使其成下面的訪問鏈路:

A設(shè)備(pos app / pay app) ---- ( 8583 over https ) ----> 私有云Nginx ----(8583 over http)----> bff ----(hessian rpc ) ----> ms 颖杏。

【pos app / pay app 改造】

  1. 將原本的TCP(SSL)連接改為 https連接纯陨。按下文Nginx要求,增加請求及響應(yīng)時的http首部字段留储。
  2. 8583報文不需要改動翼抠,以二進制格式通過https傳輸。

【私有云部署Nignx】

Nginx前可利用私有云已有的負載均衡器(例如可能的LVS-DR + Keepalive)获讳。

  1. 修改Nginx配置文件 mime.types阴颖。使其支持content-type "application/pay8583",對于自定義的content-type丐膝,只支持post請求方法量愧,不支持GET/PUT/DELETE/HEAD等請求方法。

  2. 修改nginx.conf 的http配置塊尤误,修改keepalive_timeout保持與前端一定時長的連接侠畔。

  3. 修改nginx.conf 的server配置塊,配置https ssl_certificate损晤。Nginx可以卸載SSL層软棺,轉(zhuǎn)換為普通的http長連接給到BFF。

  4. 修改nginx.conf 的location配置塊,proxy_pass尤勋。
    根據(jù)context反向代理至對應(yīng)的bff喘落。例如 https://domain-name/pos 轉(zhuǎn)發(fā)至pos-bff茵宪,https://domain-name/pay轉(zhuǎn)發(fā)至pay-bff,https://domain-name/biz-new轉(zhuǎn)發(fā)至新的業(yè)務(wù)瘦棋。不同的context可以對應(yīng)到不同的前端app/ 不同的業(yè)務(wù)類型 / 不同的子公司稀火。biz-new可以采用新的restful風(fēng)格。domain-name/pay的業(yè)務(wù)可以在未來長期的系統(tǒng)功能迭代過程中赌朋,慢慢的逐步的將8583報文轉(zhuǎn)換為restful風(fēng)格凰狞。如果原有業(yè)務(wù)長期沒有變化,則保持為8583格式沛慢。

  5. 保持與BFF的長連接赡若。

proxy_http_version 1.1;
proxy_set_header Connection "";
keepalive 16;
  1. 轉(zhuǎn)發(fā)客戶端真實IP
proxy_set_header X-Real-IP $remote_addr;
  1. 請求時,Nginx應(yīng)該轉(zhuǎn)發(fā)這些首部字段: Host团甲, Accept逾冬, User-Agent, Connection躺苦, Keep-Alive身腻, Content-Type, Content-Length匹厘。

  2. 響應(yīng)時嘀趟,Nginx應(yīng)該轉(zhuǎn)發(fā)這些首部字段:Connection, Keep-Alive集乔, Cache-Control去件,Content-Type坡椒, Content-Length扰路。

【BFF改造】

  1. 需要增加一個DispatcherServlet,用于從http post的request body獲得8583報文倔叼,轉(zhuǎn)交給BFF原有的解碼器汗唱。

  2. 增加一個Header8583Filter,用于檢查下面 8583 over https 設(shè)計中所要求的 HTTP 首部字段丈攒, 不合法時返回 400 狀態(tài)碼哩罪, 合法時設(shè)置響應(yīng)首部。
    Accept應(yīng)該為”application/pay8583“巡验,User-Agent應(yīng)該為”<device_name>-<app_name>-version“际插,Content-Type應(yīng)該為”application/pay8583“,Cache-Control應(yīng)該為” no-cache“显设。
    當(dāng)BFF編排微服務(wù)框弛, 發(fā)生了 Hessian 超時或其它意外異常時, 應(yīng)當(dāng)響應(yīng)500狀態(tài)碼捕捂。 嚴(yán)禁將服務(wù)器異常堆棧信息返回終端設(shè)備瑟枫。

  3. 待上線驗證沒問題后斗搞,逐步移除mina 框架。 改造后的方案不再使用 mina 框架慷妙, 而是利用了 Servlet 容器對于 Http 協(xié)議的支持僻焚。并且原本的大量的 TCP 短連接,已有私有云服務(wù)器 nginx 承接膝擂,轉(zhuǎn)變?yōu)樯倭康?http 長連接虑啤。

  4. 禁用Cookie,BFF不需要HttpSession架馋。

  5. 8583報文不需要改動咐旧,后續(xù)ms都不需要有任何改動。最大限度的減少開發(fā)的工程量绩蜻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铣墨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子办绝,更是在濱河造成了極大的恐慌伊约,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孕蝉,死亡現(xiàn)場離奇詭異屡律,居然都是意外死亡,警方通過查閱死者的電腦和手機降淮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門超埋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人佳鳖,你說我怎么就攤上這事霍殴。” “怎么了系吩?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵来庭,是天一觀的道長。 經(jīng)常有香客問我穿挨,道長月弛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任科盛,我火速辦了婚禮帽衙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贞绵。我一直安慰自己厉萝,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冀泻,像睡著了一般常侣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弹渔,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天胳施,我揣著相機與錄音,去河邊找鬼肢专。 笑死舞肆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的博杖。 我是一名探鬼主播椿胯,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剃根!你這毒婦竟也來了哩盲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤狈醉,失蹤者是張志新(化名)和其女友劉穎廉油,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苗傅,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡抒线,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了渣慕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘶炭。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖逊桦,靈堂內(nèi)的尸體忽然破棺而出眨猎,到底是詐尸還是另有隱情,我是刑警寧澤卫袒,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布宵呛,位于F島的核電站,受9級特大地震影響夕凝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜户秤,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一码秉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸡号,春花似錦转砖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晋控。三九已至,卻和暖如春姓赤,著一層夾襖步出監(jiān)牢的瞬間赡译,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工不铆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝌焚,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓誓斥,卻偏偏與公主長得像只洒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子劳坑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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

  • 本文為《三萬長文50+趣圖帶你領(lǐng)悟web編程的內(nèi)功心法[https://www.itzhai.com/articl...
    Arthinking閱讀 902評論 0 0
  • HTTP協(xié)議 超文本傳輸協(xié)議(HTTP毕谴,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為...
    似水牛年閱讀 3,064評論 0 3
  • Http協(xié)議詳解 標(biāo)簽(空格分隔): Linux 聲明:本片文章非原創(chuàng),內(nèi)容來源于博客園作者MIN飛翔的HTTP協(xié)...
    Sivin閱讀 5,210評論 3 82
  • 一距芬、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,337評論 6 152
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)析珊、焦點、注意力蔑穴、語言聯(lián)想忠寻、情景聯(lián)想 觀點: 1.統(tǒng)計學(xué)現(xiàn)在叫數(shù)據(jù)分析,社會...
    Jenaral閱讀 5,705評論 0 5