您好,登錄后才能下訂單哦!
Java中PRC框架如何使用,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
??RPC (Remote Procedure Call)即遠(yuǎn)程過(guò)程調(diào)用,是分布式系統(tǒng)常見(jiàn)的一種通信方法。它允許程序調(diào)用另一個(gè)地址空間(通常是共享網(wǎng)絡(luò)的另一臺(tái)機(jī)器上)的過(guò)程或函數(shù),而不用程序員顯式編碼這個(gè)遠(yuǎn)程調(diào)用的細(xì)節(jié)。
??除 RPC 之外,常見(jiàn)的多系統(tǒng)數(shù)據(jù)交互方案還有分布式消息隊(duì)列、HTTP 請(qǐng)求調(diào)用、數(shù)據(jù)庫(kù)和分布式緩存等。
??其中 RPC 和 HTTP 調(diào)用是沒(méi)有經(jīng)過(guò)中間件的,它們是端到端系統(tǒng)的直接數(shù)據(jù)交互。
通俗點(diǎn)說(shuō)
RPC就是從一臺(tái)機(jī)器(客戶(hù)端)上通過(guò)參數(shù)傳遞的方式調(diào)用另一臺(tái)機(jī)器(服務(wù)器)上的一個(gè)函數(shù)或方法(可以統(tǒng)稱(chēng)為服務(wù))并得到返回的結(jié)果。
RPC會(huì)隱藏底層的通訊細(xì)節(jié)(不需要直接處理Socket通訊或Http通訊)。
客戶(hù)端發(fā)起請(qǐng)求,服務(wù)器返回響應(yīng)(類(lèi)似于Http的工作方式)RPC在使用形式上像調(diào)用本地函數(shù)(或方法)一樣去調(diào)用遠(yuǎn)程的函數(shù)(或方法)。
在RPC框架中主要有三個(gè)角色:提供者、消費(fèi)者和注冊(cè)中心。如下圖所示:
提供者: 暴露服務(wù)的服務(wù)提供方。
調(diào)用者: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方。
注冊(cè)中心: 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心。
原理圖如上,也就是說(shuō)兩臺(tái)服務(wù)器A,B,一個(gè)應(yīng)用部署在A(yíng)服務(wù)器上,想要調(diào)用B服務(wù)器上應(yīng)用提供的函數(shù)/方法,由于不在一個(gè)內(nèi)存空間,不能直接調(diào)用,需要通過(guò)網(wǎng)絡(luò)來(lái)表達(dá)調(diào)用的語(yǔ)義和傳達(dá)調(diào)用的數(shù)據(jù)。
比如說(shuō),A服務(wù)器想調(diào)用B服務(wù)器上的一個(gè)方法:Employee getEmployeeByName(String fullName)
RPC整個(gè)調(diào)用過(guò)程,主要經(jīng)歷如下幾個(gè)步驟:
首先要解決通訊的問(wèn)題:即A機(jī)器想要調(diào)用B機(jī)器,首先得建立起通信連接。
主要是通過(guò)在客戶(hù)端和服務(wù)器之間建立TCP連接,遠(yuǎn)程過(guò)程調(diào)用的所有交換的數(shù)據(jù)都在這個(gè)連接里傳輸。連接可以是按需連接,調(diào)用結(jié)束后就斷掉,也可以是長(zhǎng)連接,多個(gè)遠(yuǎn)程過(guò)程調(diào)用共享同一個(gè)連接。
要解決尋址的問(wèn)題,也就是說(shuō),A服務(wù)器上的應(yīng)用怎么告訴底層的RPC框架,如何連接到B服務(wù)器(如主機(jī)或IP地址)以及特定的端口,方法的名稱(chēng)名稱(chēng)是什么。
通常情況下我們需要提供B機(jī)器(主機(jī)名或IP地址)以及特定的端口,然后指定調(diào)用的方法或者函數(shù)的名稱(chēng)以及入?yún)⒊鰠⒌刃畔?,這樣才能完成服務(wù)的一個(gè)調(diào)用。
可靠的尋址方式(主要是提供服務(wù)的發(fā)現(xiàn))是RPC的實(shí)現(xiàn)基石,比如可以采用redis或者zookeeper來(lái)注冊(cè)服務(wù)等等。
從服務(wù)提供者的角度看:當(dāng)提供者服務(wù)啟動(dòng)時(shí),需要自動(dòng)向注冊(cè)中心注冊(cè)服務(wù);
當(dāng)提供者服務(wù)停止時(shí),需要向注冊(cè)中心注銷(xiāo)服務(wù);
提供者需要定時(shí)向注冊(cè)中心發(fā)送心跳,一段時(shí)間未收到來(lái)自提供者的心跳后,認(rèn)為提供者已經(jīng)停止服務(wù),從注冊(cè)中心上摘取掉對(duì)應(yīng)的服務(wù)。
從調(diào)用者的角度看:調(diào)用者啟動(dòng)時(shí)訂閱注冊(cè)中心的消息并從注冊(cè)中心獲取提供者的地址;
當(dāng)有提供者上線(xiàn)或者下線(xiàn)時(shí),注冊(cè)中心會(huì)告知到調(diào)用者;
調(diào)用者下線(xiàn)時(shí),取消訂閱。
序列化
當(dāng)A機(jī)器上的應(yīng)用發(fā)起一個(gè)RPC調(diào)用時(shí),調(diào)用方法和其入?yún)⒌刃畔⑿枰ㄟ^(guò)底層的網(wǎng)絡(luò)協(xié)議如TCP傳輸?shù)紹機(jī)器,由于網(wǎng)絡(luò)協(xié)議是基于二進(jìn)制的,所有我們傳輸?shù)膮?shù)數(shù)據(jù)都需要先進(jìn)行序列化(Serialize)或者編組(marshal)成二進(jìn)制的形式才能在網(wǎng)絡(luò)中進(jìn)行傳輸。然后通過(guò)尋址操作和網(wǎng)絡(luò)傳輸將序列化或者編組之后的二進(jìn)制數(shù)據(jù)發(fā)送給B機(jī)器。
反序列化
當(dāng)B機(jī)器接收到A機(jī)器的應(yīng)用發(fā)來(lái)的請(qǐng)求之后,又需要對(duì)接收到的參數(shù)等信息進(jìn)行反序列化操作(序列化的逆操作),即將二進(jìn)制信息恢復(fù)為內(nèi)存中的表達(dá)方式,然后再找到對(duì)應(yīng)的方法(尋址的一部分)進(jìn)行本地調(diào)用(一般是通過(guò)生成代理Proxy去調(diào)用,
通常會(huì)有JDK動(dòng)態(tài)代理、CGLIB動(dòng)態(tài)代理、Javassist生成字節(jié)碼技術(shù)等),之后得到調(diào)用的返回值。
B機(jī)器進(jìn)行本地調(diào)用(通過(guò)代理Proxy)之后得到了返回值,此時(shí)還需要再把返回值發(fā)送回A機(jī)器,同樣也需要經(jīng)過(guò)序列化操作,然后再經(jīng)過(guò)網(wǎng)絡(luò)傳輸將二進(jìn)制數(shù)據(jù)發(fā)送回A機(jī)器,而當(dāng)A機(jī)器接收到這些返回值之后,則再次進(jìn)行反序列化操作,恢復(fù)為內(nèi)存中的表達(dá)方式,最后再交給A機(jī)器上的應(yīng)用進(jìn)行相關(guān)處理(一般是業(yè)務(wù)邏輯處理操作)。
Thrift
:thrift是一個(gè)軟件框架,用來(lái)進(jìn)行可擴(kuò)展且跨語(yǔ)言的服務(wù)的開(kāi)發(fā)。它結(jié)合了功能強(qiáng)大的軟件堆棧和代碼生成引擎,以構(gòu)建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語(yǔ)言間無(wú)縫結(jié)合的、高效的服務(wù)。
Dubbo
:Dubbo是一個(gè)分布式服務(wù)框架,以及SOA治理方案。其功能主要包括:高性能NIO通訊及多協(xié)議集成,服務(wù)動(dòng)態(tài)尋址與路由,軟負(fù)載均衡與容錯(cuò),依賴(lài)分析與降級(jí)等。 Dubbo是阿里巴巴內(nèi)部的SOA服務(wù)化治理方案的核心框架,Dubbo自2011年開(kāi)源后,已被許多非阿里系公司使用。
Spring Cloud
:Spring Cloud由眾多子項(xiàng)目組成,如Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Consul 等,提供了搭建分布式系統(tǒng)及微服務(wù)常用的工具,如配置管理、服務(wù)發(fā)現(xiàn)、斷路器、智能路由、微代理、控制總線(xiàn)、一次性token、全局鎖、選主、分布式會(huì)話(huà)和集群狀態(tài)等,滿(mǎn)足了構(gòu)建微服務(wù)所需的所有解決方案。Spring Cloud基于Spring Boot, 使得開(kāi)發(fā)部署極其簡(jiǎn)單。
可以看著是HTTP協(xié)議的一種直接應(yīng)用,默認(rèn)基于JSON作為傳輸格式,使用簡(jiǎn)單,學(xué)習(xí)成本低效率高,但是安全性較低。
SOAP是一種數(shù)據(jù)交換協(xié)議規(guī)范,是一種輕量的、簡(jiǎn)單的、基于XML的協(xié)議的規(guī)范。而SOAP可以看著是一個(gè)重量級(jí)的協(xié)議,基于XML、SOAP在安全方面是通過(guò)使用XML-Security和XML-Signature兩個(gè)規(guī)范組成了WS-Security來(lái)實(shí)現(xiàn)安全控制的,當(dāng)前已經(jīng)得到了各個(gè)廠(chǎng)商的支持 。
他主要的優(yōu)點(diǎn)是:易用、靈活、跨語(yǔ)言、跨平臺(tái)。
面向服務(wù)架構(gòu),它可以根據(jù)需求通過(guò)網(wǎng)絡(luò)對(duì)松散耦合的粗粒度應(yīng)用組件進(jìn)行分布式部署、組合和使用。服務(wù)層是SOA的基礎(chǔ),可以直接被應(yīng)用調(diào)用,從而有效控制系統(tǒng)中與軟件代理交互的人為依賴(lài)性。
SOA是一種粗粒度、松耦合服務(wù)架構(gòu),服務(wù)之間通過(guò)簡(jiǎn)單、精確定義接口進(jìn)行通訊,不涉及底層編程接口和通訊模型。SOA可以看作是B/S模型、XML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的子集)/Web Service技術(shù)之后的自然延伸。
關(guān)于Java中PRC框架如何使用問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。