Thrift 是由 Facebook 开源的一个 RPC 框架,现在已经挂在 apache.org 下了.主要的几个好处:
① 支持非常多语言,包括在 WEB 开发中很常用的 PHP,以及最重要的 C++/Python/Java 等 WEB后端常用语言,当然,还包括很 cool 的 Ruby、Erlang.
Hessian是一款基于HTTP协议的RPC框架,采用的是二进制RPC协议,非常轻量级 ,且速度较快.
当然,还有Hetty,它是一款构建于Netty和Hessian基础上的高性能的RPC框架.
JSON-RPC-Java 由两个对用户可视化的组件构成,它们是JSONRPCBridge和JSONRPCServlet,二者的协调实现了JSON服务器端对请求对象的处理,并响应给用户.
为了导出一个类的所有的静态方法,应该:JSONRPCBridge.registerClass(("myObject", myObject);
如果registerObject和registerClass被多次调用为有相同键值的对象使用,那么其将被最新赋值的对象所更新.
该协议中最重要的一部分还有就是Servlet了,现在就来简单的介绍一下:
在该协议中,JSONRPCServlet充当传送器,处理通过HTTP传输过来的JSON
0,服务接口定义---Echo.java
/*
* 定义了服务器提供的服务类型 */public interface Echo { ? ?public String echo(String string);
}
一种解决方法是:在运行服务的每台机器上都运行一个特殊的守护进程,该守护进程负责跟踪位于该机器中每一项服务所使用的端口;此外,守护进程还监听一个特定的已经端口,Client通过这个端口与守护进程联系,请求得到指定服务的端口.
复杂的RPC实现框架中,比如可以把服务注册到ZooKeeper中,Client也从ZooKeeper中查询服务.参考:一个更复杂的RPC框架实现
System.out.println(echo.echo("hello,hello"));//使用代理对象调用服务器的服务.并将结果输出
二,服务器端分析--实现类:MainServer.java
Server server = new RPC.RPCServer(); ? ? ? ?/*
* server 启动后,需要注册server端能够提供的服务,这样client使用 服务的名字、
* 服务器的IP、以及服务所运行的端口 来调用 server 的服务 ? ? ? ? */
server.register(Echo.class, RemoteEcho.class);//注册服务的名字
server.register(AnOtherEchoService.class, AnOtherEchoServiceImpl.class);
server.start();//启动server
三,服务器监听Client连接分析----实现类:Listener.java
当server.start()后,它要创建一个Listener对象,这是一个线程类,该线程用来监听Client连接.
public void start() {
System.out.println("启动服务器");
* server 启动时,需要Listener监听是否有client的请求连接
* listener 是一个线程,由它来监听连接 ? ? ? ? ? ? */
listener = new Listener(this); ? ? ? ? ? ?this.isRuning = true;
listener.start();//listener 是一个线程类,start()后会执行线程的run方法
其实,监听连接就是JAVA ServerSocket类和Socket类提供的相关功能而已.
* accept()是一个阻塞方法,server_socket 一直等待client 是否有连接到来 */
Socket client = server_socket.accept();//建立一条TCP连接
四,动态代理对象 生成---RPC.java
* @param Class[]{} 该参数声明了动态生成的代理对象实现了的接口,即 clazz 所代表的接口类型 .
* 这表明了生成的代理对象它是一个它所实现了的接口类型的对象
* 从而就可以用它来调用它所实现的接口中定义的方法
*
* @param handler 生成代理实例对象时需要传递一个handler参数
* 这样当该 代理实例对象调用接口中定义的方法时,将会委托给InvocationHandler 接口中声明的invoke方法
* 此时,InvocationHandler 的invoke 方法将会被自动调用 ? ? ? ? */
T t = (T) Proxy.newProxyInstance(RPC.class.getClassLoader(), new Class[] {clazz}, handler); ? ? ? ?return t;
最重要的是它的 invoke方法(注意与InvocationHandler的invoke()区分).它负责建立连接,打开输入、输出流,向服务器发送字节数据.
六,"服务器存根"---实现类:RPCServer.java
七,"RPC 编码、解码,协议的定义"---Invocation.java? Method.java
八,总结:
当需要添加新的服务时:按以下步骤即可:①定义服务接口及其实现类,如:AnOtherEchoService.java? ②:在MainServer.java中注册新添加的服务.
③:在MainClient.java中编写获得新服务的代理对象的代码,并用该代理对象调用新服务接口中声明的方法.
HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种.其中,POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式.
我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范.规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体.类似于下面形式:
method request-URL version headers entity-body
协议规定,POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式.实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以.
然后就开始开发了.
步骤:
①用记事本编写一个.proto文件:
}如:编写的是test.proto
package protobuf;
option java_package = "com.sq.protobuf";
option java_outer_classname = "FirstProtobuf";
message testBuf {
将其放在与刚解压的protoc.exe同级目录中.
执行
则可以找到的一个生成的FirstProtobuf.java文件.
java调用wsdl的步骤如下,主要是使用第三方框架:
步骤如下:
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是用来存储方法的参数
try?{
call?=?(Call)?service.createCall();
call.setTargetEndpointAddress(endpoint);//?远程调用路径
call.setOperationName("say");//?调用的方法名
//?设置参数名:
call.addParameter("str1",?//?参数名
XMLType.XSD_STRING,//?参数类型:String
ParameterMode.IN);//?参数模式:'IN'?or?'OUT'
//?设置返回值类型:
call.setReturnType(XMLType.XSD_STRING);//?返回值类型:String??
result?=?(String)?call.invoke(object);//?远程调用
}?catch?(ServiceException?e)?{
e.printStackTrace();
}?catch?(RemoteException?e)?{
return?result;
public?static?void?main(String[]?args)?{
webServiceTest?t?=?new?webServiceTest();
String?result?=?t.invokeRemoteFuc();
System.out.println(result);
以上就是土嘎嘎小编为大家整理的javarpc代码相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!