中小型研发团队架构实践三要点--转
來(lái)自微信公眾號(hào)聊聊架構(gòu)
作者|張輝清
編輯|雨多田光
?
如果你正好處在中小型研發(fā)團(tuán)隊(duì)……
中小型研發(fā)團(tuán)隊(duì)很多,而社區(qū)在中小型研發(fā)團(tuán)隊(duì)架構(gòu)實(shí)踐方面的探討卻很少。中小型研發(fā)團(tuán)隊(duì)特別是 50 至 200 人的研發(fā)團(tuán)隊(duì),在早期的業(yè)務(wù)探索階段,更多關(guān)注業(yè)務(wù)邏輯,快速迭代以驗(yàn)證商業(yè)模式,很少去關(guān)注技術(shù)架構(gòu)。
這時(shí)如果繼續(xù)按照原有的架構(gòu)及研發(fā)模式,會(huì)出現(xiàn)大量的問(wèn)題,再也無(wú)法玩下去了。能不能有一套可直接落地、基于開(kāi)源、成本低,可快速搭建的中間件及架構(gòu)升級(jí)方案呢?
我是一個(gè)有十多年經(jīng)驗(yàn)的 IT 老兵,曾主導(dǎo)了兩家公司的技術(shù)架構(gòu)升級(jí)改造,現(xiàn)拋磚引玉,與大家一起探討這方面的問(wèn)題。
在接下來(lái)的一段時(shí)間里,我會(huì)陸續(xù)推出此系列文章。
根據(jù)我們以往的經(jīng)驗(yàn),分享者主講一個(gè)小時(shí)左右,業(yè)務(wù)研發(fā)就可以快速地進(jìn)入項(xiàng)目實(shí)戰(zhàn)。對(duì)于后面新加入的團(tuán)隊(duì)成員,也可通過(guò) WIKI 自主快速學(xué)習(xí)。這是我們之前對(duì)自己的要求,盡量降低工具對(duì)人員的要求,簡(jiǎn)單實(shí)用、降低成本。
文章中部分 Demo 采用 C# 語(yǔ)言, 但到了框架或架構(gòu)層面,與語(yǔ)言本身沒(méi)有太多直接的關(guān)系。如 RabbitMQ、Job、Redis 和集中式日志,它們服務(wù)端的部署是一樣的,只是客戶(hù)端語(yǔ)言版本稍有不同。
所有 Demo 都可直接運(yùn)行,服務(wù)地址及管理后臺(tái)也可直接訪(fǎng)問(wèn)。因?yàn)椴渴鹪诠性?#xff0c;牽涉到成本費(fèi)用的問(wèn)題,我計(jì)劃持續(xù)到明年 3 月底。
這些小小的基礎(chǔ)工作,希望能夠幫到中小型研發(fā)團(tuán)隊(duì),解決大家項(xiàng)目中遇到的實(shí)際問(wèn)題。愿與你一起成長(zhǎng),你的分享和點(diǎn)贊是我此次付出的動(dòng)力,謝謝!
整個(gè)系列文章分為三個(gè)部分,包括 框架篇、架構(gòu)篇 和 公共應(yīng)用篇。
-
框架篇 即中間件或工具的使用,如緩存、消息隊(duì)列、集中式日志、度量、微服務(wù)框架等,工欲善其事,必先利其器。
-
架構(gòu)篇 主要是設(shè)計(jì)思想的提升,有企業(yè)總體架構(gòu)、單個(gè)項(xiàng)目架構(gòu)設(shè)計(jì)、統(tǒng)一應(yīng)用分層等。
-
公共應(yīng)用篇 是業(yè)務(wù)與技術(shù)的結(jié)合,有單點(diǎn)登錄和企業(yè)支付網(wǎng)關(guān)。
以下是篇章的具體介紹:
框架篇——工欲善其事,必先利其器
如果說(shuō)運(yùn)維是地基,那么框架就是承重墻。農(nóng)村建住房是一塊磚一塊磚地往上壘,而城市建大 House 則是先打地基,再建承重墻,最后才是壘磚,所以中間件的搭建和引進(jìn)是建設(shè)高可用、高性能、易擴(kuò)展可伸縮的大中型系統(tǒng)的前提。
框架篇中的每篇主要由四部分組成:它是什么、工作原理、使用場(chǎng)景 和 可直接調(diào)試的 Demo。其中 Demo 及中間件歷經(jīng)兩家公司四年時(shí)間的考驗(yàn),涉及幾百個(gè)應(yīng)用,100 多個(gè)庫(kù) 1 萬(wàn)多張表,日訂單從幾萬(wàn)張到十幾萬(wàn),年 GMV 從幾十億到幾百億。
所有中間件及工具都是基于開(kāi)源,早期我們也有部分自主研發(fā)如集中式日志和度量框架。后期在第二家公司時(shí)為了快速地搭建,降低成本,易于維護(hù)和擴(kuò)展,全部改為開(kāi)源。這樣不僅利于個(gè)人的學(xué)習(xí)成長(zhǎng)、知識(shí)重用和職業(yè)生涯,也利于團(tuán)隊(duì)的組建和人才的引進(jìn)。
?集中式緩存 Redis
緩存是計(jì)算機(jī)的難題之一,分布式緩存亦是如此。Redis 看起來(lái)非常簡(jiǎn)單,但它影響著系統(tǒng)的效率、性能、數(shù)據(jù)一致性。
用好它不容易,涉及到的問(wèn)題包括:緩存時(shí)長(zhǎng)(復(fù)雜多維度的計(jì)算)、緩存失效處理(主動(dòng)更新)、緩存鍵(Hash 和方便人工干預(yù))、緩存內(nèi)容及數(shù)據(jù)結(jié)構(gòu)的選擇、緩存雪崩的處理、緩存穿透的處理等。
Redis 除了緩存的功能,還有其它功能如 Lua 計(jì)算能力、Limit 與 Session 時(shí)間窗口、分布式鎖等。
?消息隊(duì)列 RabbitMQ
消息隊(duì)列好比葛洲壩,有大量數(shù)據(jù)的堆積能力,然后再可靠地進(jìn)行異步輸出。它是 EDA 事件驅(qū)動(dòng)架構(gòu)的核心,也是 CQRS 同步數(shù)據(jù)的關(guān)鍵。為什么選擇 RabbitMQ 而沒(méi)有選擇 Kafka,因?yàn)闃I(yè)務(wù)系統(tǒng)有對(duì)消息的高可靠性要求,以及對(duì)復(fù)雜功能如消息確認(rèn) Ack 的要求。
?集中式日志ELK
日志主要分為系統(tǒng)日志和應(yīng)用日志兩類(lèi)。試想一下,你該如何在一個(gè)具有幾百臺(tái)服務(wù)器的集群中定位到問(wèn)題?如何追蹤每天產(chǎn)生的幾 G 甚至幾 T 的數(shù)據(jù)?集中式日志就是此類(lèi)問(wèn)題的解決方案。
早期我們使用自主研發(fā)的 Log4Net+MongoDB 來(lái)收集和檢索日志信息,但隨著數(shù)據(jù)量的增加,查詢(xún)速度卻變得越來(lái)越慢。后期改為開(kāi)源的 ELK,雖然易用性有所下降,但它支持海量數(shù)據(jù)以及與編程語(yǔ)言無(wú)關(guān)的特征。下面是 ELK 的架構(gòu)圖。
?任務(wù)調(diào)度 Job
任務(wù)調(diào)度 Job 如同數(shù)據(jù)庫(kù)作業(yè)或 Windows 計(jì)劃任務(wù),是分布式系統(tǒng)中異步和批處理的關(guān)鍵。我們的 Job 分為 WinJob 和 HttpJob:WinJob 是操作系統(tǒng)級(jí)別的定時(shí)任務(wù),使用開(kāi)源的框架 Quartz.NET 實(shí)現(xiàn);而 HttpJob 則是自主研發(fā)實(shí)現(xiàn),采用 URL 方式可定時(shí)調(diào)用微服務(wù)。
HttpJob 借助集群巧妙地解決了 WinJob 的單點(diǎn)和發(fā)布問(wèn)題,并集中管理所有的調(diào)度規(guī)則,調(diào)度規(guī)則有簡(jiǎn)單規(guī)則和 Cron 表達(dá)式。HttpJob 它簡(jiǎn)單易用,但間隔時(shí)間不能低于 1 分鐘,畢竟通過(guò) URL 方式來(lái)調(diào)度并不高效。下圖是 HttpJob 的管理后臺(tái)。
?應(yīng)用監(jiān)控 Metrics
“沒(méi)有度量就沒(méi)有提升”,度量是改進(jìn)優(yōu)化的基礎(chǔ),是做好一個(gè)系統(tǒng)的前置條件。Zabbix 一般用于系統(tǒng)級(jí)別的監(jiān)控,Metrics 則用于業(yè)務(wù)應(yīng)用級(jí)別的監(jiān)控。
業(yè)務(wù)應(yīng)用是個(gè)黑盒子,通過(guò)數(shù)據(jù)埋點(diǎn)來(lái)收集應(yīng)用的實(shí)時(shí)狀態(tài),然后展示在大屏或看板上。它是報(bào)警系統(tǒng)和數(shù)字化管理的基礎(chǔ),還可以結(jié)合集中式日志來(lái)快速定位和查找問(wèn)題。我們的業(yè)務(wù)監(jiān)控系統(tǒng)使用 Metrics.NET+InfluxDB+Grafana。
?微服務(wù)框架 MSA
微服務(wù)是細(xì)粒度業(yè)務(wù)行為的重用,需要與業(yè)務(wù)能力及業(yè)務(wù)階段相匹配。微服務(wù)框架是實(shí)現(xiàn)微服務(wù)及分布式架構(gòu)的關(guān)鍵組件,我們的微服務(wù)框架是基于開(kāi)源 ServiceStack 來(lái)實(shí)現(xiàn)。
它簡(jiǎn)單易用、性能好,文檔自動(dòng)生成、方便調(diào)試測(cè)試,調(diào)試工具 Swagger UI、自動(dòng)化接口測(cè)試工具 SoapUI。微服務(wù)的接口開(kāi)放采用我們自主研發(fā)的微服務(wù)網(wǎng)關(guān),通過(guò)治理后臺(tái)簡(jiǎn)單的配置即可。網(wǎng)關(guān)以 NIO、IOCP 的方式實(shí)現(xiàn)高并發(fā),主要功能有鑒權(quán)、超時(shí)、限流、熔斷、監(jiān)控等,下圖是 Swagger UI 調(diào)試工具。
?搜索利器 Solr
分庫(kù)分表后的關(guān)聯(lián)查詢(xún),大段文本的模糊查詢(xún),這些要如何實(shí)現(xiàn)呢?顯然傳統(tǒng)的數(shù)據(jù)庫(kù)沒(méi)有很好的解決辦法,這時(shí)可以借助專(zhuān)業(yè)的檢索工具。
全文檢索工具 Solr 不僅簡(jiǎn)單易用性能好,而且支持海量數(shù)據(jù)高并發(fā),只需實(shí)現(xiàn)系統(tǒng)兩邊數(shù)據(jù)的準(zhǔn)實(shí)時(shí)或定時(shí)同步即可。下圖是 Solr 的工作原理。
?更多工具
-
分布式協(xié)調(diào)器 ZooKeeper
ZK 工作原理、配置中心、Master 選舉、Demo,一篇足以。
-
ORM 框架
Dapper.NET 語(yǔ)法簡(jiǎn)單、運(yùn)行速度快,與數(shù)據(jù)庫(kù)無(wú)關(guān),SQL 自主編寫(xiě)可控,是一款適合于互聯(lián)網(wǎng)系統(tǒng)的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)工具。
-
對(duì)象映射工具 EmitMapper 和 AutoMapper
EmitMapper 性能較高,AutoMapper 易用性較好。
-
IoC 框架
控制反轉(zhuǎn) IoC 輕量級(jí)框架 Autofac。
-
DLL 包管理
公司內(nèi)部 DLL 包管理工具 NuGet,可解決 DLL 集中存儲(chǔ)、更新、引用、依賴(lài)問(wèn)題。
-
發(fā)布工具 Jenkins
一鍵編譯、發(fā)布、自動(dòng)化測(cè)試、一鍵回滾,高效便捷故障低。
架構(gòu)篇——思想提升
會(huì)使用以上框架并不一定能成為優(yōu)秀的架構(gòu)師,但一位優(yōu)秀架構(gòu)師一定會(huì)使用框架。架構(gòu)師除了會(huì)使用工具外,還需要設(shè)計(jì)思想的提升和性能調(diào)優(yōu)技能。
此篇以真實(shí)項(xiàng)目為背景,思想方法追求簡(jiǎn)單有效,主要內(nèi)容包括 企業(yè)總體架構(gòu)、單個(gè)項(xiàng)目架構(gòu)設(shè)計(jì)、統(tǒng)一應(yīng)用分層、調(diào)試工具 WinDbg。
?企業(yè)總體架構(gòu)
當(dāng)我們有了幾百個(gè)上千個(gè)應(yīng)用后,不僅僅需要單個(gè)項(xiàng)目的架構(gòu)設(shè)計(jì),還需要企業(yè)總體架構(gòu)做頂層思考和指導(dǎo)。大公司與小商販的商業(yè)思維是一樣的,但大公司比較難看到商業(yè)全貌和本質(zhì)。而小公司又缺乏客戶(hù)流量和中間件的應(yīng)用場(chǎng)景,中型公司則兼而有之,所以企業(yè)總體架構(gòu)也相對(duì)好落地。
企業(yè)總體架構(gòu)需要在 技術(shù)、業(yè)務(wù)、管理 之間游刃有余地切換,它包括業(yè)務(wù)架構(gòu)、應(yīng)用架構(gòu)、數(shù)據(jù)架構(gòu)和技術(shù)架構(gòu)。附檔是一份脫敏感信息后的真實(shí)案例,有參考 TOGAF 標(biāo)準(zhǔn)。但內(nèi)容以解決公司系統(tǒng)的架構(gòu)問(wèn)題為導(dǎo)向、以時(shí)間為主線(xiàn),包括企業(yè)商務(wù)模型、架構(gòu)現(xiàn)狀、架構(gòu)規(guī)劃和架構(gòu)實(shí)施。
?單個(gè)項(xiàng)目架構(gòu)設(shè)計(jì)
單個(gè)項(xiàng)目的架構(gòu)設(shè)計(jì)如同施工圖紙,能直接指導(dǎo)工程代碼的實(shí)施。上一環(huán)是功能需求,下一環(huán)是代碼實(shí)施,這是架構(gòu)設(shè)計(jì)的價(jià)值所在。從功能需求到用例,到用例活動(dòng)圖,到領(lǐng)域圖、架構(gòu)分層,到核心代碼,它們之間環(huán)環(huán)相扣。
做不好領(lǐng)域圖可能源自沒(méi)有做好用例活動(dòng)圖,因?yàn)橛美顒?dòng)圖是領(lǐng)域圖的上一環(huán)。關(guān)注職責(zé)、邊界、應(yīng)用關(guān)系、存儲(chǔ)、部署是架構(gòu)設(shè)計(jì)的核心,下圖是具體案例參考。
?統(tǒng)一應(yīng)用分層
給應(yīng)用分層這件事情很簡(jiǎn)單,但是讓一家公司的幾百個(gè)應(yīng)用采用統(tǒng)一的分層結(jié)構(gòu),這可不是件簡(jiǎn)單的事情。它要做到可大可小、簡(jiǎn)單易用、支持多種場(chǎng)景,我們使用 IPO 方式:I 表示 Input、O 表示 Output、P 表示 Process,一進(jìn)一出一處理。應(yīng)用系統(tǒng)的本質(zhì)就是機(jī)器,是處理設(shè)備,也是一進(jìn)一出一處理,IPO 方式相對(duì)于 DDD 而言更為簡(jiǎn)單實(shí)用。
?調(diào)試工具 WinDbg
生產(chǎn)環(huán)境偶爾會(huì)出現(xiàn)一些異常問(wèn)題,而 WinDbg 或 GDB 就是解決此類(lèi)問(wèn)題的利器。調(diào)試工具 WinDbg 如同醫(yī)生的聽(tīng)診器,是系統(tǒng)生病時(shí)做問(wèn)題診斷的逆向分析工具,Dump 文件類(lèi)似于飛機(jī)的黑匣子,記錄著生產(chǎn)環(huán)境程序運(yùn)行的狀態(tài)。
主要介紹調(diào)試工具 WinDbg 和抓包工具 ProcDump 的使用,并分享一個(gè)真實(shí)的案例。N 年前不知誰(shuí)寫(xiě)的代碼,導(dǎo)致每一兩個(gè)月偶爾出現(xiàn) CPU 飆高的現(xiàn)象。
我們先使用 ProcDump 在生產(chǎn)環(huán)境中抓取異常進(jìn)程的 Dump 文件,然后在不了解代碼的情況下通過(guò) WinDbg 命令進(jìn)行分析,最終定位到有問(wèn)題的那行代碼。
公共應(yīng)用篇
先工具再框架,然后架構(gòu)設(shè)計(jì),最后深入公共應(yīng)用。公共應(yīng)用因?yàn)榕c業(yè)務(wù)系統(tǒng)結(jié)合緊密,但又具有一定的獨(dú)立性,所以一般自主開(kāi)發(fā),不使用開(kāi)源也不方便開(kāi)源。公共應(yīng)用主要包括單點(diǎn)登錄、企業(yè)支付網(wǎng)關(guān)、CTI 通訊網(wǎng)關(guān)(短信郵件微信),此次分享單點(diǎn)登錄和企業(yè)支付網(wǎng)關(guān)。
?單點(diǎn)登錄
應(yīng)用拆分后總要合在一起,拆分是應(yīng)用實(shí)施層面的拆分,合成是用戶(hù)層面的合成,而合成必須解決認(rèn)證和導(dǎo)航問(wèn)題。單點(diǎn)登錄 SSO 即只需要登錄一次,便可到處訪(fǎng)問(wèn),它是建立在用戶(hù)系統(tǒng)、權(quán)限系統(tǒng)、認(rèn)證系統(tǒng)和企業(yè)門(mén)戶(hù)的基礎(chǔ)上。我們的憑證數(shù)據(jù) Token 使用 JWT 標(biāo)準(zhǔn),以解決不同語(yǔ)言、不同客戶(hù)端、跨 WebAPI 的安全問(wèn)題。
?企業(yè)支付網(wǎng)關(guān)
企業(yè)支付網(wǎng)關(guān)集中和封裝了公司的各大支付,例如支付寶、財(cái)付通、微信、預(yù)付款等。它統(tǒng)一了業(yè)務(wù)系統(tǒng)調(diào)用各支付接口的方式,簡(jiǎn)化了業(yè)務(wù)系統(tǒng)與支付系統(tǒng)的交互。
它將各種支付接口統(tǒng)一為支付、代扣、分潤(rùn)、退款、退分潤(rùn)、補(bǔ)差、轉(zhuǎn)賬、凍結(jié)、解凍、預(yù)付款等,調(diào)用時(shí)只需選擇支付類(lèi)型即可。企業(yè)支付網(wǎng)關(guān)將各大支付系統(tǒng)進(jìn)行集中的設(shè)計(jì)、研發(fā)、部署、監(jiān)控、維護(hù),提供統(tǒng)一的加解密、序列化、日志記錄,安全隔離。
本系列文章涉及內(nèi)容清單如下(并不按這順序發(fā)布),其中有感興趣的,歡迎關(guān)注:
-
開(kāi)篇
-
緩存 Redis
-
消息隊(duì)列 RabbitMQ
-
集中式日志 ELK
-
任務(wù)調(diào)度 Job
-
應(yīng)用監(jiān)控 Metrics
-
微服務(wù)框架 MSA
-
搜索利器 Solr
-
分布式協(xié)調(diào)器 ZooKeeper
-
小工具:Dapper.NET/EmitMapper/AutoMapper/Autofac/NuGet
-
發(fā)布工具 Jenkins
-
總體架構(gòu)設(shè)計(jì)
-
單個(gè)項(xiàng)目架構(gòu)設(shè)計(jì)
-
統(tǒng)一應(yīng)用分層
-
調(diào)試工具 WinDbg
-
單點(diǎn)登錄
-
企業(yè)支付網(wǎng)關(guān)
-
結(jié)篇
?
搜索本系列文章?用這個(gè):https://s.geekbang.org/當(dāng)然啦,現(xiàn)在只是開(kāi)篇
先搜點(diǎn)別的吧
比如“Re:從0開(kāi)始的微服務(wù)架構(gòu)”
作者介紹
張輝清,10 多年的 IT 老兵,先后擔(dān)任攜程架構(gòu)師、古大集團(tuán)首席架構(gòu)、中青易游 CTO 等職務(wù),主導(dǎo)過(guò)兩家公司的技術(shù)架構(gòu)升級(jí)改造工作。現(xiàn)關(guān)注架構(gòu)與工程效率,技術(shù)與業(yè)務(wù)的匹配與融合,技術(shù)價(jià)值與創(chuàng)新。
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/7608057.html
總結(jié)
以上是生活随笔為你收集整理的中小型研发团队架构实践三要点--转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 不用copy代码--eclipse使用g
- 下一篇: How to include custo