摘要:具體可以參考消息隊(duì)列之具體可以參考實(shí)戰(zhàn)之快速入門十分鐘入門阿里中間件團(tuán)隊(duì)博客是一個(gè)分布式的可分區(qū)的可復(fù)制的基于發(fā)布訂閱的消息系統(tǒng)主要用于大數(shù)據(jù)領(lǐng)域當(dāng)然在分布式系統(tǒng)中也有應(yīng)用。目前市面上流行的消息隊(duì)列就是阿里借鑒的原理用開(kāi)發(fā)而得。
我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識(shí)點(diǎn)以及面試問(wèn)題,目前已經(jīng)開(kāi)源,會(huì)一直完善下去,歡迎建議和指導(dǎo)歡迎Star: https://github.com/Snailclimb/Java-Guide
RPC
RPC(Remote Procedure Call)—遠(yuǎn)程過(guò)程調(diào)用 ,它是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。RPC使得開(kāi)發(fā)分布式程序就像開(kāi)發(fā)本地程序一樣簡(jiǎn)單。
RPC采用客戶端(服務(wù)調(diào)用方)/服務(wù)器端(服務(wù)提供方)模式, 都運(yùn)行在自己的JVM中??蛻舳酥恍枰胍褂玫慕涌?,接口的實(shí)現(xiàn)和運(yùn)行都在服務(wù)器端。RPC主要依賴的技術(shù)包括序列化、反序列化和數(shù)據(jù)傳輸協(xié)議,這是一種定義與實(shí)現(xiàn)相分離的設(shè)計(jì)。
目前Java使用比較多的RPC方案主要有RMI(JDK自帶)、Hessian、Dubbo以及Thrift等。
注意: RPC主要指內(nèi)部服務(wù)之間的調(diào)用,RESTful也可以用于內(nèi)部服務(wù)之間的調(diào)用,但其主要用途還在于外部系統(tǒng)提供服務(wù),因此沒(méi)有將其包含在本知識(shí)點(diǎn)內(nèi)。
常見(jiàn)RPC框架:RMI(JDK自帶): JDK自帶的RPC
詳細(xì)內(nèi)容可以參考:從懵逼到恍然大悟之Java中RMI的使用
Dubbo: Dubbo是 阿里巴巴公司開(kāi)源的一個(gè)高性能優(yōu)秀的服務(wù)框架,使得應(yīng)用可通過(guò)高性能的 RPC 實(shí)現(xiàn)服務(wù)的輸出和輸入功能,可以和 Spring框架無(wú)縫集成。
詳細(xì)內(nèi)容可以參考:
高性能優(yōu)秀的服務(wù)框架-dubbo介紹
Dubbo是什么?能做什么?
Hessian: Hessian是一個(gè)輕量級(jí)的remotingonhttp工具,使用簡(jiǎn)單的方法提供了RMI的功能。 相比WebService,Hessian更簡(jiǎn)單、快捷。采用的是二進(jìn)制RPC協(xié)議,因?yàn)椴捎玫氖嵌M(jìn)制協(xié)議,所以它很適合于發(fā)送二進(jìn)制數(shù)據(jù)。
詳細(xì)內(nèi)容可以參考: Hessian的使用以及理解
Thrift: Apache Thrift是Facebook開(kāi)源的跨語(yǔ)言的RPC通信框架,目前已經(jīng)捐獻(xiàn)給Apache基金會(huì)管理,由于其跨語(yǔ)言特性和出色的性能,在很多互聯(lián)網(wǎng)公司得到應(yīng)用,有能力的公司甚至?xí)趖hrift研發(fā)一套分布式服務(wù)框架,增加諸如服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)等功能。
詳細(xì)內(nèi)容可以參考: 【Java】分布式RPC通信框架Apache Thrift 使用總結(jié)
如何進(jìn)行選擇:是否允許代碼侵入: 即需要依賴相應(yīng)的代碼生成器生成代碼,比如Thrift。
是否需要長(zhǎng)連接獲取高性能: 如果對(duì)于性能需求較高的haul,那么可以果斷選擇基于TCP的Thrift、Dubbo。
是否需要跨越網(wǎng)段、跨越防火墻: 這種情況一般選擇基于HTTP協(xié)議的Hessian和Thrift的HTTP Transport。
此外,Google推出的基于HTTP2.0的gRPC框架也開(kāi)始得到應(yīng)用,其序列化協(xié)議基于Protobuf,網(wǎng)絡(luò)框架使用的是Netty4,但是其需要生成代碼,可擴(kuò)展性也比較差。
消息中間件
消息中間件,也可以叫做中央消息隊(duì)列或者是消息隊(duì)列(區(qū)別于本地消息隊(duì)列,本地消息隊(duì)列指的是JVM內(nèi)的隊(duì)列實(shí)現(xiàn)),是一種獨(dú)立的隊(duì)列系統(tǒng),消息中間件經(jīng)常用來(lái)解決內(nèi)部服務(wù)之間的 異步調(diào)用問(wèn)題 。請(qǐng)求服務(wù)方把請(qǐng)求隊(duì)列放到隊(duì)列中即可返回,然后等待服務(wù)提供方去隊(duì)列中獲取請(qǐng)求進(jìn)行處理,之后通過(guò)回調(diào)等機(jī)制把結(jié)果返回給請(qǐng)求服務(wù)方。
異步調(diào)用只是消息中間件一個(gè)非常常見(jiàn)的應(yīng)用場(chǎng)景。此外,常用的消息隊(duì)列應(yīng)用場(chǎng)景還偷如下幾個(gè):
解耦 : 一個(gè)業(yè)務(wù)的非核心流程需要依賴其他系統(tǒng),但結(jié)果并不重要,有通知即可。
最終一致性 : 指的是兩個(gè)系統(tǒng)的狀態(tài)保持一致,可以有一定的延遲,只要最終達(dá)到一致性即可。經(jīng)常用在解決分布式事務(wù)上。
廣播 : 消息隊(duì)列最基本的功能。生產(chǎn)者只負(fù)責(zé)生產(chǎn)消息,訂閱者接收消息。
錯(cuò)峰和流控
具體可以參考:
《消息隊(duì)列深入解析》
當(dāng)前使用較多的消息隊(duì)列有ActiveMQ(性能差,不推薦使用)、RabbitMQ、RocketMQ、Kafka等等,我們之前提高的redis數(shù)據(jù)庫(kù)也可以實(shí)現(xiàn)消息隊(duì)列,不過(guò)不推薦,redis本身設(shè)計(jì)就不是用來(lái)做消息隊(duì)列的。
ActiveMQ: ActiveMQ是Apache出品,最流行的,能力強(qiáng)勁的開(kāi)源消息總線。ActiveMQ是一個(gè)完全支持JMS1.1和J2EE 1.4規(guī)范的JMSProvider實(shí)現(xiàn),盡管JMS規(guī)范出臺(tái)已經(jīng)是很久的事情了,但是JMS在當(dāng)今的J2EE應(yīng)用中間仍然扮演著特殊的地位。
具體可以參考:
《消息隊(duì)列ActiveMQ的使用詳解》
RabbitMQ: RabbitMQ 是一個(gè)由 Erlang 語(yǔ)言開(kāi)發(fā)的 AMQP 的開(kāi)源實(shí)現(xiàn)。RabbitMQ 最初起源于金融系統(tǒng),用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗
AMQP :Advanced Message Queue,高級(jí)消息隊(duì)列協(xié)議。它是應(yīng)用層協(xié)議的一個(gè)開(kāi)放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì),基于此協(xié)議的客戶端與消息中間件可傳遞消息,并不受產(chǎn)品、開(kāi)發(fā)語(yǔ)言等條件的限制。
具體可以參考:
《消息隊(duì)列之 RabbitMQ》
RocketMQ:
具體可以參考:
《RocketMQ 實(shí)戰(zhàn)之快速入門》
《十分鐘入門RocketMQ》 (阿里中間件團(tuán)隊(duì)博客)
Kafka:Kafka是一個(gè)分布式的、可分區(qū)的、可復(fù)制的、基于發(fā)布/訂閱的消息系統(tǒng),Kafka主要用于大數(shù)據(jù)領(lǐng)域,當(dāng)然在分布式系統(tǒng)中也有應(yīng)用。目前市面上流行的消息隊(duì)列RocketMQ就是阿里借鑒Kafka的原理、用Java開(kāi)發(fā)而得。
具體可以參考:
《Kafka應(yīng)用場(chǎng)景》
《初談Kafka》
推薦閱讀:
《Kafka、RabbitMQ、RocketMQ等消息中間件的對(duì)比 —— 消息發(fā)送性能和區(qū)別》
歡迎關(guān)注我的微信公眾號(hào):"Java面試通關(guān)手冊(cè)"(一個(gè)有溫度的微信公眾號(hào),無(wú)廣告,單純技術(shù)分享,期待與你共同進(jìn)步~~~堅(jiān)持原創(chuàng),分享美文,分享各種Java學(xué)習(xí)資源。您想關(guān)注便關(guān)注,
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71317.html
摘要:降級(jí)往往會(huì)指定不同的級(jí)別,面臨不同的異常等級(jí)執(zhí)行不同的處理。談?wù)勀銓?duì)和的認(rèn)識(shí)兩者關(guān)系具體可以看公眾號(hào)阿里巴巴中間件的這篇文章獨(dú)家解讀從微服務(wù)框架到微服務(wù)生態(tài)與并不是競(jìng)爭(zhēng)關(guān)系,作為成熟的框架,其易用性擴(kuò)展性和健壯性已得到業(yè)界的認(rèn)可。 該文已加入筆主的開(kāi)源項(xiàng)目——JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識(shí)的文檔類項(xiàng)目),地址:https://github.com/...
摘要:降級(jí)往往會(huì)指定不同的級(jí)別,面臨不同的異常等級(jí)執(zhí)行不同的處理。談?wù)勀銓?duì)和的認(rèn)識(shí)兩者關(guān)系具體可以看公眾號(hào)阿里巴巴中間件的這篇文章獨(dú)家解讀從微服務(wù)框架到微服務(wù)生態(tài)與并不是競(jìng)爭(zhēng)關(guān)系,作為成熟的框架,其易用性擴(kuò)展性和健壯性已得到業(yè)界的認(rèn)可。 該文已加入筆主的開(kāi)源項(xiàng)目——JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識(shí)的文檔類項(xiàng)目),地址:https://github.com/...
摘要:官網(wǎng)源碼推薦從開(kāi)始手寫一個(gè)框架更多請(qǐng)?jiān)诩夹g(shù)棧微信公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字。是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架,它對(duì)進(jìn)行了非常輕量級(jí)的對(duì)象封裝,它將與數(shù)據(jù)庫(kù)表建立映射關(guān)系,是一個(gè)全自動(dòng)的框架。 Java 程序員方向太多,且不說(shuō)移動(dòng)開(kāi)發(fā)、大數(shù)據(jù)、區(qū)塊鏈、人工智能這些,大部分 Java 程序員都是 Java Web/后端開(kāi)發(fā)。那作為一名 Java Web 開(kāi)發(fā)程序員必須需要熟悉哪些框架呢? 今天...
摘要:方法,刪除當(dāng)前線程綁定的這個(gè)副本數(shù)字,這個(gè)值是的值,普通的是使用鏈表來(lái)處理沖突的,但是是使用線性探測(cè)法來(lái)處理沖突的,就是每次增加的步長(zhǎng),根據(jù)參考資料所說(shuō),選擇這個(gè)數(shù)字是為了讓沖突概率最小。 showImg(https://segmentfault.com/img/remote/1460000019828633); 老套路,先列舉下關(guān)于ThreadLocal常見(jiàn)的疑問(wèn),希望可以通過(guò)這篇學(xué)...
摘要:微軟的雖然引入了事件機(jī)制,可以在隊(duì)列收到消息時(shí)觸發(fā)事件,通知訂閱者。由微軟作為主要貢獻(xiàn)者的,則對(duì)以及做了進(jìn)一層包裝,并能夠很好地實(shí)現(xiàn)這一模式。 在分布式服務(wù)框架中,一個(gè)最基礎(chǔ)的問(wèn)題就是遠(yuǎn)程服務(wù)是怎么通訊的,在Java領(lǐng)域中有很多可實(shí)現(xiàn)遠(yuǎn)程通訊的技術(shù),例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之間到底是些什么關(guān)系呢,它們背后到底是基...
閱讀 5098·2021-11-25 09:43
閱讀 1701·2021-10-27 14:18
閱讀 1066·2021-09-22 16:03
閱讀 1363·2019-08-30 13:19
閱讀 1584·2019-08-30 11:15
閱讀 1658·2019-08-26 14:04
閱讀 3135·2019-08-23 18:40
閱讀 1175·2019-08-23 18:17