手写RPC目的
目的,假如我们是dubbo中间件的开发者,那我们要如何去设计一个RPC框架呢?那不妨我们也来设计一个RPC构架,可能在配置上没有dubbo做得那么灵活与完美,但通过手写一个RPC之后对于我们去理解与使用dubbo会更加得心应手。
手写RPC核心设计思路:
1.启动一个tomcat(HttpServer)、nettyServer响应接收网络连接。
2.把自定义的接口名、方法名分别注册到本地与远程(如zookeeper等等),实现注册中心与负载均衡。
3.服务器接收到请求交由Servlet来处理,并在Handler处理器中取出请求的接口名、方法名、方法参数进行实际的处理后返回结果给客户端。
5.服务端实现协议可以由开发者自行选择。
5.客户端连接注册中心通过LB负载拿到连接进行连接请求,负载均衡一般选用轮询或者随机算法。
废话不多说,下面开始真实的实操:需要源代码工程的滴滴。
一、创建接口端工程:
1.项目工程图如下:
我这里图方便将potocol、register和interface放在了一起,实际开发当中最好是再新建一个工程把potocol、register这两个封装成独立的lib来用,而interface独立成一个工程项目,因为这个interface是接口端,变化会比较多的,理应跟potocol、register分开。
1.api接口包
1.1定义了两个简单的测试接口
1.2定义了接口方法参数类Invocation
2.potocol请求协议包
2.1模拟实现了dubbo协议请求,
2.2模拟tomcat实现了http协议请求,
2.3实现负载均衡LoadBalance,
2.4实现ProtocolFactory协议工厂,模拟dubbo可以由开发者来配置选择请求协议
2.5实现ProxyFactory代理工厂,模拟dubbo可以对外提供很多的接口方法,让服务在接收到请求后进行对应接口方法逻辑处理。
3.register注册中心包
3.1实现本地注册,方便通过解析Invocation拿到本地接口名以及本地接口方法名进行实际的逻辑处理
3.2实现远程Map集合注册,方便实现LB负载均衡功能
3.3实现Zookeeper注册中心,方便实现LB负载均衡功能
4.spi包,模拟dubbo实现spi扩展
二、创建服务端工程:
1.项目工程图如下:
1.impl接口实现包
分别对HelloInterface和TestInterface两个接口进行实现
2.启动类直接启动即可,默认用http,可以设置启动参数为dubbo。
三、创建客户端工程:
1.项目工程图如下:
四、测试
1.启动服务端
2.启动客户端
上图客户端的信息是由服务器收到后直接返回的。
五、相信通过这么一番手写RPC操作之后,我们以后再去使用dubbo这种封装好的框架就应该很容易理解它的核心原理了,就不会出现只会用而不清楚原理了。
[