欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

javarpc代碼,javarpc原理

java rpc框架哪個(gè)好 知乎

Thrift 是由 Facebook 開(kāi)源的一個(gè) RPC 框架,現(xiàn)在已經(jīng)掛在 apache.org 下了。主要的幾個(gè)好處:

10年積累的網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先制作網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有措美免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

1. 支持非常多語(yǔ)言,包括在 WEB 開(kāi)發(fā)中很常用的 PHP,以及最重要的 C++/Python/Java 等 WEB后端常用語(yǔ)言,當(dāng)然,還包括很 cool 的 Ruby、Erlang。

2. 完整的 RPC 框架實(shí)現(xiàn),用腳本生成通訊相關(guān)的框架代碼,開(kāi)發(fā)者只需要集中精力處理好 業(yè)務(wù)邏輯。比如搭建一個(gè) Hello World Service 只需要幾分鐘。

3.擁有被 Facebook、Last.fm 等不少大規(guī)模互聯(lián)網(wǎng)應(yīng)用驗(yàn)證過(guò)的性能和可用性。

Hessian是一款基于HTTP協(xié)議的RPC框架,采用的是二進(jìn)制RPC協(xié)議,非常輕量級(jí) ,且速度較快。

當(dāng)然,還有Hetty,它是一款構(gòu)建于Netty和Hessian基礎(chǔ)上的高性能的RPC框架。

jsonrpc java怎么運(yùn)行

JSON-RPC-Java 由兩個(gè)對(duì)用戶可視化的組件構(gòu)成,它們是JSONRPCBridge和JSONRPCServlet,二者的協(xié)調(diào)實(shí)現(xiàn)了JSON服務(wù)器端對(duì)請(qǐng)求對(duì)象的處理,并響應(yīng)給用戶。

JSONRPCBridge是一個(gè)擁有服務(wù)器端導(dǎo)出給特定客戶端的對(duì)象的引用的session對(duì)象,它接收服務(wù)器(也就是JSONRPCServlet)傳來(lái)的JSON-RPC請(qǐng)求,然后其把JSON對(duì)象解碼(unmarshalling)為Java對(duì)象,再扮演方法調(diào)用的角色,還要把方法調(diào)用返回的Java對(duì)象結(jié)果組碼(marshall)為JSON對(duì)象傳給客戶端處理。而具體的從Java對(duì)象到Javascript對(duì)象的類型轉(zhuǎn)換由負(fù)責(zé)串行化的串行化類Serializer處理。

JSONRPCBridge必須放置在HttpSession對(duì)象中,并且注冊(cè)屬性名為“JSONRPCBridge”,以使JSONRPCServlet能夠定位負(fù)責(zé)調(diào)用導(dǎo)出到客戶端的Java對(duì)象的橋。為此,為了導(dǎo)出一個(gè)對(duì)象的所有實(shí)例和靜態(tài)方法到客戶端,應(yīng)該有如下的代碼: JSONRPCBridge.registerObject("myObject", myObject);

為了導(dǎo)出一個(gè)類的所有的靜態(tài)方法,應(yīng)該:JSONRPCBridge.registerClass(("myObject", myObject);

如果registerObject和registerClass被多次調(diào)用為有相同鍵值的對(duì)象使用,那么其將被最新賦值的對(duì)象所更新。

在JSON中,還可以使用單例模式的globalBridge來(lái)為所有的HTTP客戶端導(dǎo)出所有的實(shí)例方法。其可以用來(lái)注冊(cè)工廠類,但使用時(shí)要注意認(rèn)證與安全問(wèn)題。使用時(shí)如下標(biāo)識(shí):JSONRPCBridge.getGlobalBridge().registerObject("myObject",myObject); 同上其還可以導(dǎo)出所有的靜態(tài)方法。

該協(xié)議中最重要的一部分還有就是Servlet了,現(xiàn)在就來(lái)簡(jiǎn)單的介紹一下:

在該協(xié)議中,JSONRPCServlet充當(dāng)傳送器,處理通過(guò)HTTP傳輸過(guò)來(lái)的JSON

如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的RPC框

0,服務(wù)接口定義---Echo.java

/*

* 定義了服務(wù)器提供的服務(wù)類型 */public interface Echo { ? ?public String echo(String string);

}

一,客戶端代碼分析--實(shí)現(xiàn)類:MainClient.java

客戶端實(shí)現(xiàn)包括:獲得一個(gè)代理對(duì)象,并使用該代理對(duì)象調(diào)用服務(wù)器的服務(wù)。獲取代理對(duì)象時(shí),需要指定被代理的類(相當(dāng)于服務(wù)器端提供的服務(wù)名),Server IP,Port,這樣客戶端就能找到服務(wù)端的服務(wù)了。

延伸:分布式環(huán)境下,Client如何打到Server的服務(wù)?---因?yàn)椋诜?wù)器中運(yùn)行的某些服務(wù)不像標(biāo)準(zhǔn)服務(wù)有著固定的端口,如HTTP的80端口。

一種解決方法是:在運(yùn)行服務(wù)的每臺(tái)機(jī)器上都運(yùn)行一個(gè)特殊的守護(hù)進(jìn)程,該守護(hù)進(jìn)程負(fù)責(zé)跟蹤位于該機(jī)器中每一項(xiàng)服務(wù)所使用的端口;此外,守護(hù)進(jìn)程還監(jiān)聽(tīng)一個(gè)特定的已經(jīng)端口,Client通過(guò)這個(gè)端口與守護(hù)進(jìn)程聯(lián)系,請(qǐng)求得到指定服務(wù)的端口。

復(fù)雜的RPC實(shí)現(xiàn)框架中,比如可以把服務(wù)注冊(cè)到ZooKeeper中,Client也從ZooKeeper中查詢服務(wù)。參考:一個(gè)更復(fù)雜的RPC框架實(shí)現(xiàn)

Echo echo = RPC.getProxy(Echo.class, "127.0.0.1", 20382);

System.out.println(echo.echo("hello,hello"));//使用代理對(duì)象調(diào)用服務(wù)器的服務(wù).并將結(jié)果輸出

二,服務(wù)器端分析--實(shí)現(xiàn)類:MainServer.java

服務(wù)器實(shí)現(xiàn)包括:創(chuàng)建一個(gè)服務(wù)器對(duì)象,將它能提供的服務(wù)注冊(cè),并啟動(dòng)進(jìn)程監(jiān)聽(tīng)客戶端的連接

Server server = new RPC.RPCServer(); ? ? ? ?/*

* server 啟動(dòng)后,需要注冊(cè)server端能夠提供的服務(wù),這樣client使用 服務(wù)的名字、

* 服務(wù)器的IP、以及服務(wù)所運(yùn)行的端口 來(lái)調(diào)用 server 的服務(wù) ? ? ? ? */

server.register(Echo.class, RemoteEcho.class);//注冊(cè)服務(wù)的名字

server.register(AnOtherEchoService.class, AnOtherEchoServiceImpl.class);

server.start();//啟動(dòng)server

三,服務(wù)器監(jiān)聽(tīng)Client連接分析----實(shí)現(xiàn)類:Listener.java

當(dāng)server.start()后,它要?jiǎng)?chuàng)建一個(gè)Listener對(duì)象,這是一個(gè)線程類,該線程用來(lái)監(jiān)聽(tīng)Client連接。

public void start() {

System.out.println("啟動(dòng)服務(wù)器");

/*

* server 啟動(dòng)時(shí),需要Listener監(jiān)聽(tīng)是否有client的請(qǐng)求連接

* listener 是一個(gè)線程,由它來(lái)監(jiān)聽(tīng)連接 ? ? ? ? ? ? */

listener = new Listener(this); ? ? ? ? ? ?this.isRuning = true;

listener.start();//listener 是一個(gè)線程類,start()后會(huì)執(zhí)行線程的run方法

}

其實(shí),監(jiān)聽(tīng)連接就是JAVA ServerSocket類和Socket類提供的相關(guān)功能而已。

/*

* accept()是一個(gè)阻塞方法,server_socket 一直等待client 是否有連接到來(lái) */

Socket client = server_socket.accept();//建立一條TCP連接

四,動(dòng)態(tài)代理對(duì)象 生成---RPC.java

客戶端只需要編寫(xiě)生成代理對(duì)象,用代理對(duì)象去調(diào)用遠(yuǎn)程服務(wù)的代碼即可。但是,底層的功能如:建立連接,序列化(本例中也沒(méi)有考慮),跨語(yǔ)言調(diào)用(未考慮)...是由RPC框架完成的。

當(dāng)MainClient 語(yǔ)句:RPC.getProxy(Echo.class, "127.0.0.1", 20382);執(zhí)行時(shí),會(huì)由

/*

* @param Class[]{} 該參數(shù)聲明了動(dòng)態(tài)生成的代理對(duì)象實(shí)現(xiàn)了的接口,即 clazz 所代表的接口類型 .

* 這表明了生成的代理對(duì)象它是一個(gè)它所實(shí)現(xiàn)了的接口類型的對(duì)象

* 從而就可以用它來(lái)調(diào)用它所實(shí)現(xiàn)的接口中定義的方法

*

* @param handler 生成代理實(shí)例對(duì)象時(shí)需要傳遞一個(gè)handler參數(shù)

* 這樣當(dāng)該 代理實(shí)例對(duì)象調(diào)用接口中定義的方法時(shí),將會(huì)委托給InvocationHandler 接口中聲明的invoke方法

* 此時(shí),InvocationHandler 的invoke 方法將會(huì)被自動(dòng)調(diào)用 ? ? ? ? */

T t = (T) Proxy.newProxyInstance(RPC.class.getClassLoader(), new Class[] {clazz}, handler); ? ? ? ?return t;

返回該代理對(duì)象,然后就會(huì)委托第三個(gè)參數(shù) handler 自動(dòng)執(zhí)行 invoke(),invoke將客戶端調(diào)用的所有相關(guān)信息封裝到Invocation 對(duì)象中(后面分析)。然后執(zhí)行第16行代碼發(fā)起連接。

1 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 2 ? ? ? ? ? ? ? ? Invocation invo = new Invocation(); 3 ?? ? ? ? ? ? ? ?invo.setInterfaces(clazz); 4 ? ? ? ? ? ? ? ? ?5 ? ? ? ? ? ? ? ? //利用反射機(jī)制將java.lang.reflect.Method 所代表的方法名,參數(shù) 封裝到 Invocation invo對(duì)象中 6 ? ? ? ? ? ? ? ? invo.setMethod(new org.jy.rpc.protocal.Method(method.getName(),method.getParameterTypes())); 7 ?? ? ? ? ? ? ? ?invo.setParams(args); 8 ? ? ? ? ? ? ? ? ?9 ? ? ? ? ? ? ? ? /*10 ?? ? ? ? ? ? ? ? * 當(dāng)把需要調(diào)用的遠(yuǎn)程server端的方法名和參數(shù)封裝到invo之后,Client 對(duì)象 就可以把 invo 作為參數(shù) 傳遞給服務(wù)器了.11 ?? ? ? ? ? ? ? ? * 為什么需要這樣做呢?InvocationHandler 的invoke方法是自動(dòng)執(zhí)行的,在該方法里面,它根據(jù)生成的代理對(duì)象 proxy (第一個(gè)參數(shù))12 ?? ? ? ? ? ? ? ? * 所實(shí)現(xiàn)的接口(由 Proxy.newProxyInstance()的第二個(gè)參數(shù)指定) 就可以知道這個(gè)接口中定義了哪些方法13 ?? ? ? ? ? ? ? ? * InvocationHandler 的 invoke 方法的第二個(gè)參數(shù)Method method 就可以解析出接口中的方法名和參數(shù)了14 ?? ? ? ? ? ? ? ? * 把它們封裝進(jìn)Invocation invo對(duì)象中,再將 invo 作為 client.invoke(invo)的參數(shù) 發(fā)送到服務(wù)器方15 ? ? ? ? ? ? ? ? ?*/16 ? ? ? ? ? ? ? ? client.invoke(invo);//invoke 先調(diào)用init發(fā)起一個(gè)Socket連接,再將invo 發(fā)送至輸出流中17 ? ? ? ? ? ? ? ? return invo.getResult();18 ? ? ? ? ? ? }

五,“客戶端存根”--Client.java

最重要的是它的 invoke方法(注意與InvocationHandler的invoke()區(qū)分)。它負(fù)責(zé)建立連接,打開(kāi)輸入、輸出流,向服務(wù)器發(fā)送字節(jié)數(shù)據(jù)。

1 ? ? public void invoke(Invocation invo) throws UnknownHostException, IOException, ClassNotFoundException {2 ?? ? ? ?init();3 ? ? ? ? System.out.println("寫(xiě)入數(shù)據(jù)");4 ? ? ? ? oos.writeObject(invo);//將Client 需要調(diào)用的Server的 接口、方法、參數(shù) 封裝起來(lái) 發(fā)給服務(wù)器5 ?? ? ? ?oos.flush();6 ? ? ? ? ois = new ObjectInputStream(socket.getInputStream());//用來(lái)接收從 server 返回 回來(lái)的執(zhí)行結(jié)果 的輸入流7 ? ? ? ? Invocation result = (Invocation) ois.readObject();8 ? ? ? ? invo.setResult(result.getResult());//將結(jié)果 保存到 Invocation result對(duì)象中9 ? ? }

六,“服務(wù)器存根“---實(shí)現(xiàn)類:RPCServer.java

上面提到,服務(wù)器通過(guò)Listener監(jiān)聽(tīng)客戶端連接,當(dāng)建立客戶端連接后,Socket client = server_socket.accept(); 不再阻塞,服務(wù)器調(diào)用它的call()方法完成客戶端請(qǐng)求的功能。也即,客戶端請(qǐng)求的結(jié)果實(shí)際上是在服務(wù)器執(zhí)行生成的。返回的結(jié)果是在Client.java 的 invoke() 方法里被讀取出來(lái) 。call()再一次用到了JAVA反射(第11行) 參考:JAVA動(dòng)態(tài)代理

1 public void call(Invocation invo) { 2 ?? ? ? ? ? ?System.out.println(invo.getClass().getName()); 3 ? ? ? ? ? ? Object obj = serviceEngine.get(invo.getInterfaces().getName()); 4 ? ? ? ? ? ? if(obj!=null) { 5 ? ? ? ? ? ? ? ? try { 6 ? ? ? ? ? ? ? ? ? ? Method m = obj.getClass().getMethod(invo.getMethod().getMethodName(), invo.getMethod().getParams()); 7 ? ? ? ? ? ? ? ? ? ? /* 8 ?? ? ? ? ? ? ? ? ? ? * 利用JAVA反射機(jī)制來(lái)執(zhí)行java.lang.reflect.Method 所代表的方法 9 ?? ? ? ? ? ? ? ? ? ? * @param result : 執(zhí)行實(shí)際方法后 得到的 服務(wù)的執(zhí)行結(jié)果10 ? ? ? ? ? ? ? ? ? ? ?*/11 ? ? ? ? ? ? ? ? ? ? Object result = m.invoke(obj, invo.getParams());12 ? ? ? ? ? ? ? ? ? ? invo.setResult(result);//將服務(wù)的執(zhí)行結(jié)果封裝到invo對(duì)象中。在后面的代碼中,將該對(duì)象寫(xiě)入到輸出流中13 ? ? ? ? ? ? ? ? } catch (Throwable th) {14 ?? ? ? ? ? ? ? ? ? ?th.printStackTrace();15 ?? ? ? ? ? ? ? ?}16 ? ? ? ? ? ? } else {17 ? ? ? ? ? ? ? ? throw new IllegalArgumentException("has no these class");18 ?? ? ? ? ? ?}19 ? ? ? ? }

七,”RPC 編碼、解碼,協(xié)議的定義“---Invocation.java?? Method.java

其實(shí),這里并不是那種實(shí)用的開(kāi)源RPC框架如Thrift中所指的編碼、IDL……上面兩個(gè)類只是RPC實(shí)現(xiàn)過(guò)程中輔助完成Java動(dòng)態(tài)代理的實(shí)現(xiàn),說(shuō)白了就是封裝客戶端需要調(diào)用的方法,然后指定生成的代理對(duì)象需要實(shí)現(xiàn)的接口(服務(wù)).

八,總結(jié):

先運(yùn)行MainServer.java啟動(dòng)服務(wù)器,然后,再運(yùn)行MainClient.java 啟動(dòng)一個(gè)客戶端連接服務(wù)器就可以看到執(zhí)行結(jié)果。

當(dāng)需要添加新的服務(wù)時(shí):按以下步驟即可:①定義服務(wù)接口及其實(shí)現(xiàn)類,如:AnOtherEchoService.java? ②:在MainServer.java中注冊(cè)新添加的服務(wù)。

③:在MainClient.java中編寫(xiě)獲得新服務(wù)的代理對(duì)象的代碼,并用該代理對(duì)象調(diào)用新服務(wù)接口中聲明的方法。

這樣,在客戶端就能夠遠(yuǎn)程地調(diào)用服務(wù)器上的一個(gè)新服務(wù)了。

分析JAVA中幾種常用的RPC框架

HTTP/1.1 協(xié)議規(guī)定的 HTTP 請(qǐng)求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 這幾種。其中,POST 一般用來(lái)向服務(wù)端提交數(shù)據(jù),本文主要討論 POST 提交數(shù)據(jù)的幾種方式。

我們知道,HTTP 協(xié)議是以 ASCII 碼傳輸,建立在 TCP/IP 協(xié)議之上的應(yīng)用層規(guī)范。規(guī)范把 HTTP 請(qǐng)求分為三個(gè)部分:狀態(tài)行、請(qǐng)求頭、消息主體。類似于下面形式:

method request-URL version headers entity-body

協(xié)議規(guī)定,POST 提交的數(shù)據(jù)必須放在消息主體(entity-body)中,但協(xié)議并沒(méi)有規(guī)定數(shù)據(jù)必須使用什么編碼方式。實(shí)際上,開(kāi)發(fā)者完全可以自己決定消息主體的格式,只要最后發(fā)送的 HTTP 請(qǐng)求滿足上面的格式就可以。

java protobuf 定義rpc服務(wù)怎么調(diào)用

1.,選擇其中的win版本下載,我選擇的是protoc-2.4.1-win32.zip

2.下載一個(gè)protobuf-java-2.4.1.jar文件(注意,要與你剛才下的proto.exe版本相同)

然后就開(kāi)始開(kāi)發(fā)了。

步驟:

1.用記事本編寫(xiě)一個(gè).proto文件:

}如:編寫(xiě)的是test.proto

package protobuf;

option java_package = "com.sq.protobuf";

option java_outer_classname = "FirstProtobuf";

message testBuf {

required int32 ID = 1;

required string Url = 2;

}

將其放在與剛解壓的protoc.exe同級(jí)目錄中。

2.在cmd中,到protoc-2.4.1-win32文件夾下,

執(zhí)行

E:\protoc-2.4.1-win32 protoc.exe --java_out=./ test.proto

則可以找到的一個(gè)生成的FirstProtobuf.java文件。

3.在MyEclipse中新建一個(gè)java project,建立包c(diǎn)om.sq.protobuf,然后將剛才生成的FirstProtobuf.java文件放在其下面。

此時(shí)會(huì)報(bào)錯(cuò),因?yàn)闆](méi)有引入jar包,在package視圖下,將protobuf-java-2.4.1.jar引入,即可解決問(wèn)題。

Java調(diào)用wsdl,怎么實(shí)現(xiàn)

java調(diào)用wsdl的步驟如下,主要是使用第三方框架:

步驟如下:

1.下載AXIS2類庫(kù),AXIS2是目前java調(diào)用webservice的一個(gè)主要方法(由于更新較頻繁,請(qǐng)自行g(shù)oogle該類庫(kù)的網(wǎng)址)

2.由于是第三方webservice,直接引入AXIS2的包就可以用了,代碼如下:

import?java.rmi.RemoteException;

import?javax.xml.rpc.ParameterMode;

import?javax.xml.rpc.ServiceException;

import?org.apache.axis.client.Call;

import?org.apache.axis.client.Service;

import?org.apache.axis.encoding.XMLType;

public?class?webServiceTest?{

public?String?invokeRemoteFuc()?{

String?endpoint?=?"";

String?result?=?"no?result!";

Service?service?=?new?Service();

Call?call;

Object[]?object?=?new?Object[1];

object[0]?=?"Dear?I?miss?you";//Object是用來(lái)存儲(chǔ)方法的參數(shù)

try?{

call?=?(Call)?service.createCall();

call.setTargetEndpointAddress(endpoint);//?遠(yuǎn)程調(diào)用路徑

call.setOperationName("say");//?調(diào)用的方法名

//?設(shè)置參數(shù)名:

call.addParameter("str1",?//?參數(shù)名

XMLType.XSD_STRING,//?參數(shù)類型:String

ParameterMode.IN);//?參數(shù)模式:'IN'?or?'OUT'

//?設(shè)置返回值類型:

call.setReturnType(XMLType.XSD_STRING);//?返回值類型:String?????????

result?=?(String)?call.invoke(object);//?遠(yuǎn)程調(diào)用

}?catch?(ServiceException?e)?{

e.printStackTrace();

}?catch?(RemoteException?e)?{

e.printStackTrace();

}

return?result;

}

public?static?void?main(String[]?args)?{

webServiceTest?t?=?new?webServiceTest();

String?result?=?t.invokeRemoteFuc();

System.out.println(result);

}

}

該方法的原理很簡(jiǎn)單,通過(guò)AXIS2封裝好的類設(shè)置URL和參數(shù),直接調(diào)用就好了,我們要關(guān)注的就是設(shè)置URL,方法,還有方法的參數(shù),其他的copypaste好啦,很簡(jiǎn)單吧,再看看其他的方法,我勒個(gè)去了,害我瞎搞兩天。遲點(diǎn)上個(gè)源碼共大家參考!

新聞標(biāo)題:javarpc代碼,javarpc原理
本文網(wǎng)址:http://chinadenli.net/article16/hedogg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google品牌網(wǎng)站設(shè)計(jì)全網(wǎng)營(yíng)銷推廣做網(wǎng)站網(wǎng)站內(nèi)鏈品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)