手把手教你写一个RPC

 

1.1 RPC 是什么

定义:RPC(Remote Procedure Call Protocol)——远程过程调用协议 ,RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层应用层 ,RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

我的理解:与其说把RPC 看作是一种协议,倒不如把 它看作是一种 客户机/服务器交互的模式,但是 RPC一定是基于 TCP 或者 其他 通信协议的

下面我们来看一下一个RPC调用的流程涉及哪些通信细节:

  • 服务消费方(client)调用以本地调用方式调用服务;(1)
  • client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;(2)
  • client stub找到服务地址,并将消息发送到服务端;(3)
  • server stub收到消息后进行解码;(4)
  • server stub根据解码结果调用本地的服务;(5)
  • 本地服务执行并将结果返回给server stub;(6)
  • server stub将返回结果打包成消息并发送至消费方;(7)
  • client stub接收到消息,并进行解码;(8)
  • 服务消费方得到最终结果。(9)

RPC的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。

1.2 手动实现

1.2.1 先做一个空接口实现序列化接口

public interface IRpcService extends Serializable{  }

 

1.2.2 做一个需要被远程调用的接口 以及对应的接口实现类

public interface IHelloService extends IRpcService{     String sayHi(String name,String message);  }
public class HelloServiceImpl implements IHelloService{      private static final long serialVersionUID = 146468468464364698L;      @Override     public String sayHi(String name, String message) {         return new StringBuilder().append("hi~!").append(",").append(message).toString();     }  }

 

1.2.3 需要写一个服务端,主要的作用 是进行服务注册(接口注册) 以及 接收客户端的调用参数 执行调用请求 返回结果

注:这个地方 我没有采用dom4j 解析配置文件的形式 进行接口注册 有时间的朋友可以多加一层

public interface Server {          //Socket端口     int PORT = 8080;          //启动服务端     void start() throws IOException;          //停止服务端     void stop();          /**      * 服务注册      * -- serviceInterface 对外暴露接口      * -- 内部实现类      */     void regist(Class<? extends IRpcService> serviceInterface,Class<? extends IRpcService> impl);      }
public class ServerCenter implements 
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信