柚子快報(bào)邀請(qǐng)碼778899分享:【中間件】中間件的宏觀探討漫談
柚子快報(bào)邀請(qǐng)碼778899分享:【中間件】中間件的宏觀探討漫談
中間件探討
內(nèi)容管理
intro中間件和框架why use常用相關(guān)Middleware接入層服務(wù)層
本文主要是宏觀上再次探討一下中間件
cfeng之前單純的分享過緩存、消息隊(duì)列、還有就是Spring Cloud下面提供的一些中間件的使用,但是整體上就是感覺很松散的,所以cfeng現(xiàn)在再次重新宏觀梳理一下中間件
intro
中間件 Middleware,字面上看就是起中間作用的構(gòu)件。早期的概念就是再操作系統(tǒng)的基礎(chǔ)上,為其他應(yīng)用軟件提供服務(wù)的基礎(chǔ)軟件, 就像一種軟件膠水連接系統(tǒng)以及應(yīng)用服務(wù)。 比如中間件簡(jiǎn)化應(yīng)用間的通信方式【可以不用再調(diào)用復(fù)雜系統(tǒng)函數(shù)即可數(shù)據(jù)傳輸】
而現(xiàn)在互聯(lián)網(wǎng)分布式架構(gòu)下,中間件是泛指在分布式系統(tǒng)中被廣泛使用的中間層軟件 ----- (we 所開發(fā)的軟件不管是B端還是C端都是服務(wù)用戶,而中間件就是服務(wù)于我們所開發(fā)的這些軟件)
中間件和框架
framework和middleware是兩個(gè)不同的概念,在軟件開發(fā)過程中所起的作用不同。
框架Framework: 半成品可擴(kuò)展
框架是一組預(yù)先編寫好的代碼和規(guī)范,提供一種結(jié)構(gòu),幫助開發(fā)者更容易的構(gòu)建和維護(hù)應(yīng)用程序,它是一種半成品,使用框架進(jìn)行開發(fā)就是在別人搭建好的舞臺(tái)上進(jìn)行跳舞。 (要想成為成品,我們需要填入我們自己的業(yè)務(wù)邏輯。)
通常包含一系列庫、工具和相關(guān)最佳實(shí)踐,目的是簡(jiǎn)化特定類型的應(yīng)用開發(fā),定義了應(yīng)用程序的體系結(jié)構(gòu),提供了通用的功能。比如數(shù)據(jù)持久、用戶認(rèn)證、路由等。
we使用框架時(shí),就直接在框架的基礎(chǔ)上進(jìn)行搭建,不需要重頭開始構(gòu)建整個(gè)應(yīng)用程序,而是在框架提供的結(jié)構(gòu)下進(jìn)行代碼編寫,完成程序的功能,它就是提供了一種模板化的方式,使得開發(fā)更加高效
java最常見的Spring Framework就是一個(gè)綜合性的企業(yè)級(jí)框架,以IOC和AOP為核心,提供了各種綜合性功能,整個(gè)生態(tài)不斷擴(kuò)大,包含
1. 基礎(chǔ)的自動(dòng)配置的Spring Boot(Spring、SpringMvc)
2. 安全管理的Spirng Security,提供了用戶密碼認(rèn)證、OAuth、JWT等諸多特性
3. 數(shù)據(jù)訪問支持的Spring Data -- JPA、MongoDB等
4. 基于webSocket通信的Spring WebScoket
5. 構(gòu)建分布式系統(tǒng)的Spring Cloud --- Netflix、Alibaba、Config等
......
【Spring特別綜合,就是一個(gè)重量級(jí)的開發(fā)框架,基本上構(gòu)建一個(gè)程序的方方面面Spring都可以提供支持,當(dāng)然這些領(lǐng)域除了Spring還有其他的框架與之競(jìng)爭(zhēng)】
eg: 安全管理Shiro, 數(shù)據(jù)訪問支持Hibernate、Mybatis-plus 等等, 我們?cè)陂_發(fā)時(shí)在選用框架時(shí)就需要綜合考慮
框架就是實(shí)現(xiàn)系統(tǒng)的半成品工具,最終的目的都是服務(wù)產(chǎn)品,所以我們開發(fā)都是結(jié)果產(chǎn)品為導(dǎo)向,那么就需要考慮:我們選用的工具是否恰好
eg: 現(xiàn)在需要將一個(gè)螺絲放入產(chǎn)品完成產(chǎn)品封裝。你可以選擇一個(gè)幾元的螺絲刀實(shí)現(xiàn),你也可以買一個(gè)很貴的多功能工具實(shí)現(xiàn)。 這個(gè)時(shí)候就需要慎重的考慮了
單獨(dú)的框架是不能發(fā)揮作用的,填入用戶代碼之后才是一個(gè)完整的產(chǎn)品。以java為例,常用的Spring框架都是以java實(shí)現(xiàn)的,而最終又是以公司自身產(chǎn)品為目的,所以很多時(shí)候公司都會(huì)進(jìn)行自定義的工具開發(fā),來更好的適配自己的產(chǎn)品
cfeng在work中,產(chǎn)品可能頻繁的需要和客戶端交互獲取前置的相關(guān)數(shù)據(jù),所以公司也是直接封裝了工具,使用直接一個(gè)注解搞定
中間件 Middleware: 可擴(kuò)展獨(dú)立運(yùn)行成品
中間件通常是一種獨(dú)立的系統(tǒng)軟件或服務(wù)程序,可以連接多個(gè)獨(dú)立的應(yīng)用程序。不需要再填充用戶代碼,只需要作為一個(gè)用戶來使用將中間件放入產(chǎn)品系統(tǒng)即可。
明顯看出,中間件就是服務(wù)于我們的系統(tǒng)的,整體處于中間層,那為什么要使用中間件?必須使用嗎?
我們需要持續(xù)的思考:如果沒有某種XXX,我們應(yīng)該如何做。
eg: 如果不允許使用Spring進(jìn)行開發(fā),我們應(yīng)該怎么進(jìn)行web開發(fā)?
沒有Spring其實(shí)就是自己需要開發(fā)Spring提供的一些功能。從更基礎(chǔ)開始搭建系統(tǒng)罷了
eg: 如果不允許使用Redis,怎么進(jìn)行分布式緩存和其他相關(guān)協(xié)作
why use
為什么要使用中間件進(jìn)行系統(tǒng)的通信和數(shù)據(jù)交互?主要在于 封裝性
封裝了底層操作的復(fù)雜性。 中間件可以根據(jù)公司具體情況進(jìn)行經(jīng)驗(yàn)配置,使用邊界條件降級(jí)策略進(jìn)行透明封裝,用戶不再需要考慮內(nèi)部復(fù)雜性 【這個(gè)就是常常提到的原理, 比如Nacos怎么做服務(wù)注冊(cè)的? – 在使用的時(shí)候可能不需要深入考慮該問題】封裝了公共業(yè)務(wù)模型的具體實(shí)現(xiàn)。 也就是降低了學(xué)習(xí)使用成本,比如redis的使用,就是調(diào)用API,降低了調(diào)用方的業(yè)務(wù)邏輯表達(dá)能力。封裝性帶來的良好的模塊性。 中間件可以理解為公共邏輯的封裝, 比如消息中間件處理消息交互的公共邏輯。使用定義清晰的中間件接口,簡(jiǎn)化業(yè)務(wù)邏輯架構(gòu),同時(shí)將缺陷封裝在中間件中,可維護(hù)性提升。
常用相關(guān)Middleware
龐大的業(yè)務(wù)規(guī)模,通常伴隨著海量的計(jì)算、數(shù)據(jù)交互、數(shù)據(jù)處理。同時(shí)也就伴隨著中間件的使用。 計(jì)算機(jī)任何問題都可以通過分成解決,如果不行,那就再增加一層。中間件的引入其實(shí)也就是分層的思想,解決可用穩(wěn)定性。
中間件的種類繁多,但是從整個(gè)架構(gòu)層面也就是接入層和服務(wù)層來進(jìn)行考慮
接入層
接入層就是首先面對(duì)internet中的大流量的沖擊,所以常用的相關(guān)中間件就是流量相關(guān)的負(fù)載均衡中間件
LVS: linux Virtual Server, 當(dāng)然現(xiàn)在已經(jīng)集成到Linux的內(nèi)核模塊中,主要作用就是負(fù)載均衡Nginx: 開源的高性能的HTTP和反向代理web服務(wù)器。 內(nèi)存占用少,啟動(dòng)極快?!菊虼淼氖强蛻舳耍热鏥PN; 反向代理的是服務(wù)器,用戶無感知】
服務(wù)化: 微服務(wù), 將功能以服務(wù)的形式提供,和服務(wù)導(dǎo)向架構(gòu)Service-Oriented Architecture, SOA關(guān)聯(lián)。各個(gè)組件以服務(wù)形式存在,通過網(wǎng)絡(luò)進(jìn)行通信。 后臺(tái)的程序服務(wù)化,接入層也需要進(jìn)行正確的路由
Dubbo: 提供高性能、透明化的遠(yuǎn)程方法調(diào)用(RPC)服務(wù),支持服務(wù)治理和負(fù)載均衡,RPC是分布式系統(tǒng)間進(jìn)行數(shù)據(jù)交互的基本形式 Sentinel: 開源的流量控制和防護(hù)庫,保護(hù)分布式系統(tǒng)的服務(wù)免受不良請(qǐng)求的影響。 包括流量控制、熔斷降級(jí)、實(shí)時(shí)監(jiān)控、規(guī)則配置、異步處理等… Spring Cloud生態(tài):Spring Cloud構(gòu)建分布式系統(tǒng)的開發(fā)工具集合,簡(jiǎn)化分布式開發(fā),提供了注冊(cè)發(fā)現(xiàn)、負(fù)載均衡、分布式配置、斷路器、消息總線等功能
Eureka: 服務(wù)注冊(cè)發(fā)現(xiàn)組件,需要單獨(dú)創(chuàng)建一個(gè)Eureka Server節(jié)點(diǎn) Ribbon: 基于HTTP和TCP的客戶端負(fù)載均衡器, 后續(xù)還有Load Balancer等 Feign: 基于HTTP的聲明式模板化的服務(wù)調(diào)用 Hystrix: 處理服務(wù)熔斷降級(jí),實(shí)現(xiàn)斷路器模式,避免單點(diǎn)故障 Zuul: API網(wǎng)關(guān)服務(wù),提供路由、顧慮和監(jiān)控等功能 Config: 分布式配置中心,支持配置信息集中管理,動(dòng)態(tài)刷新配置 Bus: 消息總線,用于微服務(wù)架構(gòu)中傳播狀態(tài)變化或者事件消息 Zipkin: 分布式追蹤系統(tǒng),協(xié)調(diào)處理跨越多個(gè)服務(wù)的請(qǐng)求 Sleuth: 分布式跟蹤系統(tǒng), 收集、追蹤微服務(wù)架構(gòu)中的請(qǐng)求鏈路 Consul: 分布式注冊(cè)中心和配置中心,可替代Eureka和Config Spring Cloud Task: 任務(wù)和批處理程序… …
其余的還有Nacos、Artemis、Apllo等各種和服務(wù)化相關(guān)中間件后續(xù)再詳細(xì)展開
服務(wù)層
后臺(tái)系統(tǒng)開發(fā)本身也需要使用相關(guān)的中間件來完成系統(tǒng)功能,不管是消息隊(duì)列、定時(shí)調(diào)度、存儲(chǔ)還是鏈路日志等都可以使用表現(xiàn)良好的中間件來完成功能。
消息中間件:
系統(tǒng)依賴關(guān)系解耦利器,常用于消息通信、服務(wù)解耦和流量削峰。發(fā)布/訂閱數(shù)據(jù)交互模式可以將生產(chǎn)者和消費(fèi)者的業(yè)務(wù)邏輯耦合程度降到最低。
RabbitMQRocketMQKafkaHermesQMQ …
定時(shí)調(diào)度:
定時(shí)task的調(diào)度是現(xiàn)在很多產(chǎn)品都面臨的場(chǎng)景,成熟的task調(diào)度能夠極大降低系統(tǒng)的開發(fā)難度
Xxl- jobElastic- job …
存儲(chǔ)
存儲(chǔ)的中間件包含分布式緩存的解決方案、分布式系統(tǒng)下數(shù)據(jù)庫的解決方案和全文搜索解決方案
Redis、 Codis …MyCat、 Sharding-JDBC …ElasticSearch …
數(shù)據(jù)同步
大數(shù)據(jù)場(chǎng)景下對(duì)于數(shù)據(jù)同步要求也可以通過中間件來解決:
CanalotterFlink-CDC …
鏈路跟蹤
鏈路追蹤也是分布式系統(tǒng)下常見的場(chǎng)景
CATSkyWalking …
日志采集
分布式環(huán)境下產(chǎn)品可能需要采集相關(guān)日志進(jìn)行后臺(tái)分析或者產(chǎn)品展示
ELK …
除了上面部分領(lǐng)域的部分中間件,現(xiàn)在市場(chǎng)上的各種細(xì)分領(lǐng)域的中間件是層出不窮,中間件作為系統(tǒng)架構(gòu)使用的成品,我們?cè)谑褂脮r(shí)也需要謹(jǐn)慎思考。同時(shí)我們更需要掌握中間件的原理,從而開發(fā)更適合自己產(chǎn)品的中間件?
柚子快報(bào)邀請(qǐng)碼778899分享:【中間件】中間件的宏觀探討漫談
參考鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。