一 实现的思路
开发四个pom工程,打成jar包
- rpc-common 项目
(1). 定义 Netty ChannelHandler 的编解码 handler : RpcDecoder RpcEncoder
(2). 定义 RpcRequest RpcReponse 实体类
该项目作为公共项目 , 供rpc-client 和 rpc -server 依赖调用 - rpc-registry-zookeeper 项目
(1). 该项目中 中定义两个工具类 ZookeeperRegistry (zookeeper注册) ZookeeperDiscover(zookeeper发现);
该项目作为公共项目 , 供rpc-client 和 rpc -server 依赖调用.
rpc -server 将ip port注册到 zookeeper key为服务的反射名称 value为ip port
rpc -client 通过 zookeeper 发现 ip port ,通过反射名称 获取 ip port; - rpc-client 项目 该项目定义两个类RpcClient RpcProxy
(1)RpcProxy 为 发布服务的接口创建 代理类; 在执行服务接口的方法时, 获取服务接口的 (名称.方法名 和 参数)
a. 通过接口的完成路径名称 从zookeeper获取 ip.port
b. 将类名 方法名 和 参数 放入RpcRequest 对象 并封装在ByteBuffer中
c. 调用RpcClient 的send() 方法 通过Netty Nio发送至服务端
return (T) Proxy.newInstance( interfaceClass.getClassLoader(), new Class<?>[]{interfaceClass},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws T){
........以上逻辑的实现位置
} } )
(2)RpcClient 主要定义send()方法 创建netty nio的远程访问, 通过bootstrap 将访问远程ip 传送参数 ,整合各种handler
该项目 供 客户端微服务 依赖调用 其本身依赖rpc-common 和 rpc-registry-zookeeper两个项目
注意: 在调用服务接口时,必须通过RpcProxy获取接口的代理类之后,再调用接口的方法,该远程访问才能起作用.
- rpc-server 该项目 主要作用为将自定义的微服务 注册到zookeeper 并发布出去处理请求
(1)发布个服务端微服务到zookeeper 通过自定义注解@RpcService 后去所有发布的微服务类 并注册为zookeeper的key值
(2)RpcServer 的setApplicationContext() 中 通过ServerBootStrap 完成微服务绑定ip port 发布
(3)RpcServerHandler 处理接收到的requst请求 , 根据 requst中的类名 通过反射 获取项目 中该类的静态bean 对象,通过 方法名,bean对象,参数类型,及参数值 反射调用该方法. 获取返回值通过netty write写回调用方;
该项目 供 服务端微服务 依赖调用 其本身依赖rpc-common 和 rpc-registry-zookeeper两个项目
cglib的作用 : 不用通过接口就能创建代理类,通过jvm的字节码文件创建代理类
代码: 地址待粘贴