一、实现思路
- SocketServer作为服务端,Socket作为客户端。
- 定义公共接口,例如XXXService。
- 在服务端,定义XXXService的实现类,例如XXXService。
- 客户端将要调用XXXService、方法名、参数,通过Socket的中的OutPutStream传到服务端,服务端利用反射拿到要调用的实现类、方法、参数类型、参数进行本地调用,然后通过Socket返回给客户端。
|
|
二、实现代码(来自《分布式服务框架原理与实践》一书)
注意:一定要注意传参的顺序
1. 服务接口类(客户端与服务端共享)
|
|
2. 服务实现类(服务端)
|
|
3. 通过Socket的形式(SocketServer实现)对外暴露服务(服务端)
|
|
4. 拿到目标服务的代理(客户端),利用的是反向代理
**很长时间没见动态代理了,注意这个importer方法拿到的EchoService的代理实现类,这个方法只是返回了代理对象,没有执行操作,当客户端拿到这个代理对象时候,调用echo方法就会执行InvocationHandler的invoke方法,这个方法实现对服务端的调用,所以如果使用现成的服务框架,这个动态代理的逻辑是透明的。**
|
|
5. 测试
初始化服务端,生成一个RpcImporter对象,调用importer方法拿到EchoService的代理类,使用代理类调用echo方法拿到返回结果。
|
|
三、总结
上述过程完成一个基本的RPC实现,很多服务框架虽然复杂,但是也是借助了这种思想,只不过分布式服务框架要做的事情要复杂的多,而且对上述很多东西做了一些抽象,例如协议,Invoker, Exporter等等,后期随着不断学习,相信会逐步了解。