RPC框架介绍(一)

总结自《架构探险:从零开始写分布式服务架构》

1.Java RMI

基于BIO实现,性能较差

1.1 调用示意图:

RPC框架介绍(一)_第1张图片

1.2 特性:

RPC框架介绍(一)_第2张图片

1.3 使用:

自定义接口继承Remote,实现类实现此接口的自定义方法并继承UnicastRemoteObject;服务端使用LocateRegistry.createRegistry注册服务总端口,Naming.bing注册服务;客户端使用Naming.lookup引入服务,然后调用服务即可
调用方式:如rmi://localhost:8801/helloService

1.4 穿透防火墙:

通过扩展RMISocketFactory实现强制指定RMI的通信端口,防止被防火墙拦截

重写的方法为:createSocket、createServerSocket;服务端使用RMISocketFactory.setSocketFactory注册

2.CXF/Axis2

常用的两种WebServices实现,基于HTTP

2.1 CXF

2.1.1 特点:

RPC框架介绍(一)_第3张图片

2.1.2 结合Spring使用:

服务端:

自定义接口打上@WebService,表明为一个WebService远程服务接口
实现类也打上@WebService,并通过endpointInterface指明其实现的接口,格式为包名+类名
配置cxf-server.xml:使用< jaxws:endpoint >配置服务
配置web.xml:增加配置CXFServlet和路径
部署到tomcat,运行即可,输入localhost:8080/路径/接口?wsdl,可查看wsdl文件

客户端:

配置cxf-client.xml:使用< jaxws:client>引入服务
编写客户端调用类,获取配置的引入服务bean,强制为自定义接口后即可调用方法

2.2 Axis2

2.2.1 特点

RPC框架介绍(一)_第4张图片

2.2.2 结合Spring使用

服务端:

自定义接口和实现类
配置axis2-server.xml:声明实现类为bean服务
配置services.xml:描述Axis2服务,如ServiceClass、ServiceObjectSupplier、SpringBeanName邓
配置web.xml:增加配置AxisServlet和路径
部署到tomcat,运行即可,输入localhost:8080/路径/接口?wsdl,可查看wsdl文件

客户端:有多种,这里使用不用预生成代码的动态调用方式

封装RPCServiceClient的Options属性,如使用EndpointReference创建调用接口服务对象;
设置好调用方法名、调用参数、返回数据等,使用封装好的RPCServiceClient对象的invokeBlocking即可获取String格式的响应

3 Thrift

具备广泛的语言支持、基于二进制编码协议、TCP/IP传输协议的一种高性能RPC实现,比基于文本协议、HTTP的XML-RPC/JSON-RPC/SOAP与WSDL协议栈更快

3.1 工作流程:

RPC框架介绍(一)_第5张图片
RPC框架介绍(一)_第6张图片

3.2 运行机制

从内部运行角度看,其网络堆栈包括如下图四个部分:

RPC框架介绍(一)_第7张图片

介绍:

RPC框架介绍(一)_第8张图片
RPC框架介绍(一)_第9张图片
RPC框架介绍(一)_第10张图片

3.3 常规使用

前导工作:

编写Thrift IDL文件:定义数据结构的文件和定义服务声明的文件
打开cmd,进入thrift-0.9.3.exe所在目录,分别执行命令:thrift-0.9.3 -r -gen java 数据结构文件/服务文件,然后将thrift-0.9.3.exe所在目录下生成的文件复制到工程里面
编写实现类实现接口.iface

编写服务端和客户端

1.阻塞同步模式

启动服务:封装TServerSocket(端口/new)、TBinaryProtocol.Factory(工厂)、TProcessor(自定义接口及其实现类/new),设置到服务器TSimpleServer的启动参数TServer.Args中

调用服务:封装TTranspost、TProtocol;基于TTranspost和TProtocol创建Client,再创建数据结构对象,即可调用方法

2.异步非阻塞模式

启动服务:封装TNonblockingServerSocket(端口/new)、TCompactProtocol.Factory(工厂)、TProcessor(自定义接口及其实现类/new),设置到服务器TNonblockingServer的启动参数TServer.Args中

调用服务:封装TAsycnClientManager、TNonblockingTransport、TProtocolFactory,基于TAsycnClientManager、TNonblockingTransport、TProtocolFactory创建接口.AsyncClient对象,创建数据结构对象后,设置自定义回调接口、扩展了AsyncMethodCallback< 接口.AsyncClient.方法_call >的类AsyncInvokerCallBack(其中使用CountDownLatch来计数),然后使用接口.AsyncClient对象调用方法即可

先运行启动服务方法,然后运行调用服务方法即可

3.4 基于注解的简化使用

主要注解及其作用:
RPC框架介绍(一)_第11张图片

流程:

前导工作:

定义数据结构:@ThriftStruct标注数据结构,@ThriftField标注其属性和getter/setter方法,getter方法需注明其对应属性的序号
定义服务接口:@ThriftService(“接口名”)定义接口,@ThriftMethod定义接口里的方法
定义实现类:不需要注解

服务端:

创建ThriftServerDef,封装了ExecutorService对象和ThriftServiceProcessor对象,ThriftServiceProcessor对象则封装了ThriftCodeManager、List< ThriftEventHandler >和接口实现类;
创建NettyServerConfig对象,封装了两个ExecutorService对象,分别为boss和worker
最后创建基于NettyServerConfig和ThriftServerDef的ThriftServer对象,调用start方法即可

客户端:

创建ThriftClientManager对象来创建客户端;
创建FramedClientConnector来连接主机和端口;
创建数据结构对象,使用ThriftClientManager对象的createClient方法,传入FramedClientConnector对象、接口类,再调用get方法,即可获取此接口的实例对象

先运行服务端,再运行客户端即可

你可能感兴趣的:(分布式服务)