本篇內(nèi)容涵蓋14個(gè)方面九榔,涉及上百個(gè)框架和工具。會(huì)有你喜歡的玫氢,大概也會(huì)有你所討厭的家伙帚屉。這是我平常工作中打交道最多的工具,大小公司都適用漾峡。如果你有更好的攻旦,歡迎留言補(bǔ)充。
一生逸、消息隊(duì)列二牢屋、緩存三、分庫(kù)分表四槽袄、數(shù)據(jù)同步五烙无、通訊六、微服務(wù)七遍尺、分布式工具八截酷、監(jiān)控系統(tǒng)九、調(diào)度十乾戏、入口工具十一迂苛、OLT(A)P十二、CI/CD十三鼓择、問題排查十四三幻、本地工具
10年架構(gòu)師領(lǐng)你架構(gòu)-成長(zhǎng)之路-(附面試題(含答案))
(騰訊T3-T4)打造互聯(lián)網(wǎng)PHP架構(gòu)師教程目錄大全,只要你看完呐能,薪資立馬提升2倍(持續(xù)更新)
原文鏈接:juejin.im
一念搬、消息隊(duì)列
√ 推薦:(1) 吞吐量?jī)?yōu)先選擇kafka
(2) 穩(wěn)定性優(yōu)先選擇RocketMQ
(3) 物聯(lián)網(wǎng):VerneMQ
[圖片上傳失敗...(image-8a8c88-1600265599787)]
一個(gè)大型的分布式系統(tǒng),通常都會(huì)異步化,走消息總線朗徊。 消息隊(duì)列作為最主要的基礎(chǔ)組件首妖,在整個(gè)體系架構(gòu)中,有著及其重要的作用爷恳。異步通常意味著編程模型的改變悯搔,時(shí)效性會(huì)降低。
kafka是目前最常用的消息隊(duì)列舌仍,尤其是在大數(shù)據(jù)方面,有著極高的吞吐量通危。而rocketmq和rabbitmq铸豁,都是電信級(jí)別的消息隊(duì)列,在業(yè)務(wù)上用的比較多菊碟。相比較而言节芥,ActiveMQ使用的最少,屬于較老一代的消息框架逆害。
pulsar是為了解決一些kafka上的問題而誕生的消息系統(tǒng)头镊,比較年輕,工具鏈有限魄幕。有些激進(jìn)的團(tuán)隊(duì)經(jīng)過試用相艇,反響不錯(cuò),但實(shí)際使用并不多纯陨。
mqtt具體來說是一種協(xié)議坛芽,主要用在物聯(lián)網(wǎng)方面,能夠雙向通信翼抠,屬于消息隊(duì)列范疇咙轩,推薦使用vernemq。
二阴颖、緩存
√ 推薦:(1) 堆內(nèi)緩存使用默認(rèn)的caffeine
(2) 分布式緩存采用redis的cluster集群模式活喊,但要注意使用限制
[圖片上傳失敗...(image-fe54d-1600265599787)]
數(shù)據(jù)緩存是減少數(shù)據(jù)庫(kù)壓力的有效途徑,有單機(jī)java內(nèi)緩存量愧,和分布式緩存之分钾菊。
對(duì)于單機(jī)來說,guava的LoadingCache和ehcache都是些熟面孔侠畔,不過SpringBoot選擇了caffeine作為它的默認(rèn)堆內(nèi)緩存结缚,這是因?yàn)閏affeine的速度比較快的原因。
對(duì)于分布式緩存來說软棺,優(yōu)先選擇的就是redis红竭,別猶豫。由于redis是單線程的(6.0支持多線程,但默認(rèn)不開啟)茵宪,并不適合高耗時(shí)操作最冰。所以對(duì)于一些數(shù)據(jù)量比較大的緩存,比如圖片稀火、視頻等暖哨,使用老牌的memcached效果會(huì)好的多。
JetCache是一個(gè)基于Java的緩存系統(tǒng)封裝凰狞,提供統(tǒng)一的api和注解來簡(jiǎn)化緩存的使用篇裁。類似SpringCache,支持本地緩存和分布式緩存赡若,也是簡(jiǎn)化開發(fā)的利器达布。
三、分庫(kù)分表
- √ 推薦:shardingsphere中的sharding-jdbc
[圖片上傳失敗...(image-b1f2b6-1600265599787)]
分庫(kù)分表逾冬,幾乎每一個(gè)上點(diǎn)規(guī)模的公司黍聂,都會(huì)有自己的方案。目前身腻,推薦使用驅(qū)動(dòng)層的sharding-jdbc(已經(jīng)進(jìn)入apache)产还,或者代理層的mycat。如果你沒有額外的運(yùn)維團(tuán)隊(duì)嘀趟,又不想花錢買其他機(jī)器脐区,那么就選前者。
如果分庫(kù)分表涉及的項(xiàng)目不多她按,spring的動(dòng)態(tài)數(shù)據(jù)源是一個(gè)非常好的選擇坡椒。它直接編碼在代碼里,直觀但不易擴(kuò)展尤溜。
如果只需要讀寫分離 倔叼,那么mysql官方驅(qū)動(dòng)里的replication協(xié)議,是更加輕量級(jí)的選擇宫莱。 上面的分庫(kù)分表組件丈攒,都是大浪淘沙,最終的優(yōu)勝品授霸。這些組件不同于其他組件選型巡验,方案一旦確定,幾乎無法回退碘耳,所以要慎之又慎显设。 分庫(kù)分表是小case,準(zhǔn)備分庫(kù)分表的階段辛辨,才是重點(diǎn):也就是數(shù)據(jù)同步捕捂。
四瑟枫、數(shù)據(jù)同步
[圖片上傳失敗...(image-34e2e-1600265599787)]
國(guó)內(nèi)使用mysql的公司居多,但postgresql憑借其優(yōu)異的性能指攒,使用率逐漸攀升慷妙。 不管什么數(shù)據(jù)庫(kù),實(shí)時(shí)數(shù)據(jù)同步工具允悦,都是把自己模擬成一個(gè)從庫(kù)膝擂,進(jìn)行數(shù)據(jù)拉取和解析。 具體來說隙弛,mysql是通過binlog進(jìn)行同步架馋;postgresql使用wal日志進(jìn)行同步。
對(duì)mysql來說全闷,canal是國(guó)內(nèi)用的最多的方案绩蜻;類似的databus也是比較好用的工具。
現(xiàn)在室埋,canal、maxwell等工具伊约,都支持將要同步的數(shù)據(jù)寫入到mq中姚淆,進(jìn)行后續(xù)處理,方便了很多屡律。
對(duì)于ETL(抽取腌逢、清洗、轉(zhuǎn)換)來說超埋,基本上都是source搏讶、task、sink路線霍殴,與前面的功能對(duì)應(yīng)媒惕。gobblin、datax来庭、logstash妒蔚、sqoop等,都是這樣的工具月弛。
它們的主要工作肴盏,就是怎么方便的定義配置文件,編寫各種各樣的數(shù)據(jù)源適配接口等帽衙。這些ETL工具菜皂,也可以作為數(shù)據(jù)同步(尤其是全量同步)的工具,通常是根據(jù)ID厉萝,或者最后更新時(shí)間 等恍飘,進(jìn)行處理榨崩。
binlog是實(shí)時(shí)增量工具,ETL工具做輔助常侣。通常一個(gè)數(shù)據(jù)同步功能蜡饵,需要多個(gè)組件的參與,他們共同組成一個(gè)整體胳施。
五溯祸、通訊
- √ 推薦:http+json,方便調(diào)試舞肆。高性能要求可選二進(jìn)制協(xié)議
[圖片上傳失敗...(image-cf0715-1600265599786)]
Java 中焦辅,netty已經(jīng)成為當(dāng)之無愧的網(wǎng)絡(luò)開發(fā)框架,包括其上的socketio(不要再和我提mina了)椿胯。對(duì)于http協(xié)議筷登,有common-httpclient,以及更加輕量級(jí)的工具okhttp來支持哩盲。
對(duì)于一個(gè)rpc來說前方,要約定一個(gè)通訊方式和序列化方式。json是最常用的序列化方式廉油,但是傳輸和解析成本大惠险,xml等文本協(xié)議與其類似,都有很多冗余的信息抒线;avro和kryo是二進(jìn)制的序列化工具班巩,沒有這些缺點(diǎn),但調(diào)試不便嘶炭。
rpc是遠(yuǎn)程過程調(diào)用的意思 抱慌,其中,thrift眨猎、dubbo抑进、gRPC默認(rèn)都是二進(jìn)制序列化方式的socket通訊框架;feign睡陪、hessian都是onhttp的遠(yuǎn)程調(diào)用框架单匣。
對(duì)了,gRPC的序列化工具是protobuf宝穗,一個(gè)壓縮比很高的二進(jìn)制序列化工具户秤。
通常,服務(wù)的響應(yīng)時(shí)間主要耗費(fèi)在業(yè)務(wù)邏輯以及數(shù)據(jù)庫(kù)上逮矛,通訊層耗時(shí)在其中的占比很小鸡号。可以根據(jù)自己公司的研發(fā)水平和業(yè)務(wù)規(guī)模來選擇须鼎。
感謝大家一直來支持鲸伴,這是我準(zhǔn)備的1000粉絲福利
【1000粉絲福利】10年架構(gòu)師分享PHP進(jìn)階架構(gòu)資料府蔗,助力大家都能30K
六、微服務(wù)
√ 推薦:(1) 注冊(cè)中心:consul
(2)網(wǎng)關(guān):nginx+Gateway
(3)配置中心:Apollo
(4)調(diào)用鏈:Skywalking
(5)熔斷:resilience4j
[圖片上傳失敗...(image-b88829-1600265599786)]
我們不止一次說到微服務(wù)汞窗,這一次我們從圍繞它的一堆支持框架姓赤,來窺探一下這個(gè)體系。是的仲吏,這里依然是在說spring cloud不铆。
默認(rèn)的注冊(cè)中心eureka不再維護(hù),consul已經(jīng)成為首選裹唆,它使用raft協(xié)議開發(fā)開箱即用誓斥。nacos、zookeeper等许帐,都可以作為備選方案劳坑。其中nacos帶有后臺(tái),比較適合國(guó)人使用習(xí)慣成畦。
熔斷組件距芬,官方的hystrix也已經(jīng)不維護(hù)了。推薦使用resilience4j循帐,最近阿里的sentinel也表現(xiàn)強(qiáng)勁框仔。
對(duì)于調(diào)用鏈來說,由于OpenTracing的興起惧浴,有了很多新的面孔。推薦使用jaeger或者skywalking奕剃。spring cloud集成的sleuth+zipkin功能稍弱衷旅,甚至不如傳統(tǒng)侵入式的cat。
配置中心是管理多環(huán)境配置文件的利器纵朋,尤其在你不想重啟服務(wù)器的情況下進(jìn)行配置更新柿顶。
目前,開源中做的最好的要數(shù)apollo操软,并提供了對(duì)spring boot的支持嘁锯。disconf使用也較為廣泛。相對(duì)來說聂薪,spring cloud config功能就局限了些家乘,用的很少。
網(wǎng)關(guān)方面藏澳,使用最多的就是nginx仁锯,在nginx之上,有基于lua腳本的openrestry翔悠。由于openresty的使用非常繁雜业崖,所以有了kong這種封裝級(jí)別更高的網(wǎng)關(guān)野芒。 對(duì)于spring cloud來說,zuul系列推薦使用zuul2双炕,zuul1是多線程阻塞的狞悲,有硬傷。spring-cloud-gateway是spring cloud親生的妇斤,Spring Cloud 大力支持摇锋,基于 Spring5.0 的新特性 WebFlux 進(jìn)行開發(fā)。底層網(wǎng)絡(luò)通信框架采用的是 Netty趟济,吞吐量高乱投。
七、分布式工具
[圖片上傳失敗...(image-fbdaef-1600265599786)]
大家都知道分布式系統(tǒng)zookeeper能用在很多場(chǎng)景顷编,與其類似的還有基于raft協(xié)議的etcd和consul戚炫。
由于它們能夠保證極高的一致性,所以用作協(xié)調(diào)工具是再好不過了媳纬。用途集中在:配置中心双肤、分布式鎖、命名服務(wù)钮惠、分布式協(xié)調(diào)茅糜、master選舉等場(chǎng)所。
對(duì)于分布式事務(wù)方面素挽,則有阿里的fescar工具進(jìn)行支持蔑赘。但如非特別的必要,還是使用柔性事務(wù)预明,追尋最終一致性缩赛,比較好。
八撰糠、監(jiān)控系統(tǒng)
√ 推薦:prometheus + grafana + telegraf
日志收集:大量ELKB酥馍,小量loki
[圖片上傳失敗...(image-a95f98-1600265599786)]
監(jiān)控系統(tǒng)組件種類繁多,目前阅酪,最流行的大概就是上面四類旨袒。 zabbix在主機(jī)數(shù)量不多的情況下,是非常好的選擇术辐。 prometheus來勢(shì)兇猛砚尽,大有一統(tǒng)天下的架勢(shì)。它也可以使用更加漂亮的grafana進(jìn)行前端展示辉词。 influxdata的influxdb和telegraf組件尉辑,都比較好用,主要是功能很全较屿。 使用es存儲(chǔ)的elkb工具鏈隧魄,也是一個(gè)較好的選擇卓练。我所知道的很多公司,都在用购啄。
九襟企、調(diào)度
[圖片上傳失敗...(image-ccdede-1600265599786)]
大家可能都用過cron表達(dá)式。這個(gè)表達(dá)式狮含,最初就是來自linux的crontab工具顽悼。 quartz是java中比較古老的調(diào)度方案,分布式調(diào)度采用數(shù)據(jù)庫(kù)鎖的方式几迄,管理界面需要自行開發(fā)蔚龙。 elastic-job-cloud應(yīng)用比較廣泛,但系統(tǒng)運(yùn)維復(fù)雜映胁,學(xué)習(xí)成本較高木羹。相對(duì)來說,xxl-job就更加輕量級(jí)一些解孙。中國(guó)人開發(fā)的系統(tǒng)坑填,后臺(tái)都比較漂亮。
十弛姜、入口工具
[圖片上傳失敗...(image-3308b3-1600265599786)]
為了統(tǒng)一用戶的訪問路口脐瑰,一般會(huì)使用一些入口工具進(jìn)行支持。
其中廷臼,haproxy苍在、lvs、keepalived等荠商,使用非常廣泛寂恬。
服務(wù)器一般采用穩(wěn)定性較好的centos,并配備ansible工具進(jìn)行支持结啼,那叫一個(gè)爽掠剑。
十一屈芜、OLT(A)P
[圖片上傳失敗...(image-87e7b8-1600265599786)]
- 現(xiàn)在的企業(yè)郊愧,數(shù)據(jù)量都非常大,數(shù)據(jù)倉(cāng)庫(kù)是必須的井佑。
搜索方面属铁,solr和elasticsearch比較流行,它們都是基于lucene的躬翁。solr比較成熟焦蘑,穩(wěn)定性更好一些,但實(shí)時(shí)搜索方面不如es盒发。 列式存儲(chǔ)方面例嘱,基于Hadoop 的hbase狡逢,使用最是廣泛;基于LSM的leveldb寫入性能優(yōu)越拼卵,但目前主要是作為嵌入式引擎使用多一些奢浑。 tidb是國(guó)產(chǎn)新貴,兼容mysql協(xié)議腋腮,公司通過培訓(xùn)向外輸出dba雀彼,未來可期。 時(shí)序數(shù)據(jù)庫(kù)方面即寡,opentsdb用在超大型監(jiān)控系統(tǒng)多一些徊哑。druid和kudu,在處理多維度數(shù)據(jù)實(shí)時(shí)聚合方面聪富,更勝一籌莺丑。 cassandra在剛出現(xiàn)時(shí)火了一段時(shí)間,雖然有facebook棄用的新聞善涨,但生態(tài)已經(jīng)形成窒盐,常年霸占數(shù)據(jù)庫(kù)引擎前15名。
十二钢拧、CI/CD
[圖片上傳失敗...(image-635846-1600265599786)]
為了支持持續(xù)集成和虛擬化蟹漓,除了耳熟能詳?shù)膁ocker,我們還有其他工具源内。
jenkins是打包發(fā)布的首選葡粒,畢竟這么多年了,一直是老大哥膜钓。當(dāng)然嗽交,寫Idea的那家公司,還出了一個(gè)叫TeamCity的工具颂斜,操作界面非常流暢夫壁。
solor不得不說是一個(gè)神器,用了它之后沃疮,小伙伴們的代碼一片飄紅盒让,我都快被吐沫星子給淹沒了。
對(duì)于公司內(nèi)部來說司蔬,一般使用gitlab搭建git服務(wù)器邑茄。其實(shí),它里面的gitlab CI俊啼,也是非常好用的肺缕。
Harbor,在 docker registry 基礎(chǔ)上擴(kuò)展了權(quán)限控制,審計(jì)同木,鏡像同步浮梢,管理界面等治理 能力,推薦使用彤路。
調(diào)度方面黔寇,k8sGoogle 開源,社區(qū)的強(qiáng)力推動(dòng)斩萌,有大量的落地方案缝裤。Rancher對(duì)k8s進(jìn)行了功能的拓展,實(shí)現(xiàn)了和k8s集群交互的一些便捷工具颊郎,包括執(zhí)行命令行憋飞,管理多個(gè) k8s集群,查看k8s集群節(jié)點(diǎn)的運(yùn)行狀態(tài)等姆吭,推薦集成榛做。
十三、問題排查
[圖片上傳失敗...(image-df6eae-1600265599786)]
java經(jīng)常發(fā)生內(nèi)存溢出問題内狸。使用jmap導(dǎo)出堆棧后检眯,我一般使用mat進(jìn)行深入分析。
如果在線上實(shí)時(shí)分析昆淡,有arthas和perf兩款工具锰瘸。
當(dāng)然,有大批量的linux工具進(jìn)行支持昂灵。
十四避凝、本地工具
[圖片上傳失敗...(image-dac91d-1600265599786)]
本地使用的jar包和工具,那就多了去了眨补。下面僅僅提一下最最常用的幾個(gè)管削。 數(shù)據(jù)庫(kù)連接池方面,國(guó)內(nèi)使用druid最多撑螺。目前含思,有號(hào)稱速度最快的hikari數(shù)據(jù)庫(kù)連接池,以及老掉牙的dbcp和c3p0甘晤。 json方面含潘,國(guó)內(nèi)使用fastjson最多,三天兩頭冒出個(gè)漏洞安皱;國(guó)外則使用jackson多一些调鬓。它們的api都類似艇炎,jackson特性多一些酌伊,但fastjson更加容易使用。鑒于fastjson頻繁出現(xiàn)安全問題,現(xiàn)在已經(jīng)掀起了一股去fastjson的浪潮居砖。 工具包方面虹脯,雖然有各種commons包,guava首選奏候。 技術(shù)日新月異循集,新瓶裝舊酒,名詞一籮筐蔗草,程序員很辛苦咒彤。唯有那背后的基礎(chǔ)原理,大道至簡(jiǎn)的思想咒精,經(jīng)久不衰镶柱。
喜歡我的文章就關(guān)注我吧,持續(xù)更新中.....
以上內(nèi)容希望幫助到大家模叙,很多PHPer在進(jìn)階的時(shí)候總會(huì)遇到一些問題和瓶頸歇拆,業(yè)務(wù)代碼寫多了沒有方向感,不知道該從那里入手去提升范咨,對(duì)此我整理了一些資料故觅,包括但不限于:分布式架構(gòu)、高可擴(kuò)展渠啊、高性能输吏、高并發(fā)、服務(wù)器性能調(diào)優(yōu)替蛉、TP6评也,laravel,YII2灭返,Redis盗迟,Swoole、Swoft熙含、Kafka罚缕、Mysql優(yōu)化、shell腳本怎静、Docker邮弹、微服務(wù)、Nginx等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨需要的可以免費(fèi)分享給大家蚓聘,需要的可以點(diǎn)擊進(jìn)入暗號(hào):知乎腌乡。