RPC简介 RPC(Remote Procedure Call)即为远程过程调用。RPC是一种通信协议,一个服务调用另一个服务就像调用本地服务一样,而不用关注网络通信的细节。这个两个应用可以在同一个机器,也可以在不同的机器上。RPC的实现有RMI、Hessian、Http 等。 RPC的执行过程如下所示: 执行过程 1、客户端发起远程调用,把请求发送给被调用方,客户端等待远程执行的结果。 2、服务方接受请求,执行完把结果返回给客户端,此时客户端收到结果继续执行余下逻辑。 RPC的底层调用过程: RPC调用原理 调用步骤如下: 客户端调用客户端存根的方法 客户端存根组装请求发送给传输层,把数据通过网络发给服务方 服务器的传输层接收到数据,把请求转到服务器存根,服务器存根进行普通的方法调用,最后把结果通过传输层发送到客户端 客户端收到结果,通过客户端存根解析结果,最后把结果返回给调用者。 Java实现RPC技术和架构 上面简单说了RPC的核心原理,我们现在用Java实现一个简单的RPC调用。 实现技术: 采用Socket通信、Java动态代理、反射与Java序列化。 实现架构: ·1、服务端提供一个接口,并在服务端实现接口;在服务端启动一个Server Socket ,等待客户端连接和发送数据;收到客户的请求数据并解析,最后通过反射调用本地服务,把结果通过socket传输给客户端。 2、服务消费者依赖服务器接口,客户端通过动态代理,生产一个接口的代理类;客户端调用代理方法时会把请求数据通过Socket把请求发送给服务器并等待服务器返回结果。 3、注册中心,服务端注册到服务到注册中心,客户端从注册中心获取服务的连接信息。 Java实现RPC 1、服务端提供一个接口HelloService,有两方法,一个是无返回值,一个有返回值。 HelloService接口 2、服务端实现这个接口: HelloService的实现类 3、核心包中定义两个公共接口Request和Resonse。 Request和Response 4,定义一个注册中心Registry,注册服务是提供一下信息: 服务端IP地址 服务器端口 Registry 5、服务端定义一个服务提供者Provider,在启动服务的前先把服务注册到注册中心,之后启动一个Server Socket。等待客户的数据,读取到数据后转换成请求对象Request对象,最后通过反射调用本地方法,最后通过Socket把结果写回客户端。 Provider 6、客户端定义一个Transport类,通过Socket和服务器传输数据,把数据通过Socket把请求发送给Server Socket并等待服务端返回结果。 Transport 7、定义一个Consumer,通过动态代理,为接口提供一个代理类,如果不熟悉可以看下Java的动态代理。在InvocationHandler的invoke中不是通过反射调用,而是通过socket调用服务端的方法。 Consumer 8,执行结果,在Consumer中调用了HelloService的两个方法,我们启动下程序看看执行结果。先启动服务端的Provider,在启动客户端的Consumer。 输出结果 本文就从实现原理上简单实现了RPC的调用,本程序只是一个演示,还有很多不足的地方,比如注册中心,序列化协议,负载均衡,传输协议等。 |
|
来自: 学而生之 > 《服务器业务类文章》