rpc学习

源码地址:https://github.com/feijian8/rpc

1、rpc-registry

a、提供服务注册服务接口

ServiceRegistry提供了zookeeper中服务的注册服务,通过创建ZkClient对象,注册需要的服务目录和创建临时的服务的属性ip+port,数据结构如下:

/**

* zk中数据的实例:

* [zk: localhost:2181(CONNECTED) 20] ls /registry/com.xxx.rpc.sample.api.HelloService

* [address-0000000001]

* ��t127.0.0.1:8001

*/

b、提供服务发现服务接口

ServiceDiscovery提供了zookeeper中服务的发现服务,通过ZkClient对象,发现service对象包名对应的服务地址,如果只有一个微服务,那么直接返回该服务对应的ip和port就ok了,否者,返回几个微服务中的随机一个服务的ip和port就ok

,包名对应的服务地址如下:[zk: localhost:2181(CONNECTED) 43] ls /registry/com.xxx.rpc.sample.api.HelloService-sample.hello2   [address-0000000002, address-0000000003, address-0000000004]。

2、rpc-registry-zookeeper

该项目实现了rpc依赖于zookeeper的服务对于项目微服务的注册和发现。

3、rpc-common

a、RpcRequest:封装了rpc请求的body体。

       RpcResponse:封装了rpc返回的响应消息体。

    b、RpcDecoder:提供rpc的解码器。

       RpcEncoder:提供rpc的编码器。

    c、SerializationUtil:基于 Protostuff 实现了对象的序列化工具。

    

4、rpc-client

a、RpcClient:主要提供通过ip和port创建netty的tcp连接,发送RpcRequest请求数据到指定的服务地址,返回需要的RpcResponse对象给RpcProxy。

b、RpcProxy:通过动态代理获取servicename,使用ZooKeeperServiceDiscovery获取zk中存储的微服务的ip和port,然后使用ip+port构建需要RpcClient,发送请求的RpcRequest对象到微服务地址,返回需要的RpcResponse对象,

最后通过泛型传入的对象,返回外部接口方法对象给客户端。

其中RpcProxy中可以直接通过servicename返回消息body,也可以通过serviceName+serviceVersion不同版本的接口返回不同的消息body,适用用版本的不断迭代开发过程。

这样就完成rpc整个调用过程!

5、rpc-server

a、RpcServer:提供了rpc服务的发布,通过spring的注解,扫描包含RpcService注解的类并初始化,初始化rpc注解的服务到zk中,通过调用rpc-registry的服务,注册rpc服务。

b、创建并初始化 Netty 服务端 Bootstrap 对象的时候针对请求和响应对象添加解码和编码处理,同时设置处理业务handler,通过反射获取service的method和parameter,执行完后,封装到response返回给rpc的client端。

c、rpcserver处理业务是异步处理,

6、rpc-sample-api

简单的bean类,定义了接口和辅助的model类,给客户端提供了接口声明。

7、rpc-sample-client

a、rpc的客户端调用示例代码,模拟实现了rpc的客户端请求过程,通过RpcProxy获取RpcClient实例,调用send就可以通过netty的nio长连接通道发送消息到服务器,返回结果RpcResponse给客户端展示。

b、2,3,4分别演示了不同参数传递和多线程处理。

8、rpc-sample-server

a、演示了RpcBootstrap启动rpc的server,然后server加载rpc的registry注册包含@RpcService的注解到zk中,暴露服务接口给客户端调用。

猜你喜欢

转载自qjwm888.iteye.com/blog/2326483
RPC