接口(客户端服务端通用)
image
服务端
接口实现类
image
处理客户端请求
image
客户端
远程调用方法
image
测试类
image
预期结果
HELLO
测试结果
HELLO
结果正常
原理分析
第一,我们看到了Proxy.newProxyInstance,很显然在进行动态代理。也即是说,在客户端调用SayHello方法时,我们先是通过动态代理返回一个代理的RpcService类型对象,这意味着当代理对象调用SayHello方法的时候,会自动调用invoke方法!
第二,我们看看invoke到底做了些什么?
它本质上就是进行Socket通信,那么它需要传递什么信息给到服务端呢?
我们知道客户端就是想调用服务端的某个类的某个方法,然后把这个方法的返回结果传输给客户端!
想一想,如何调用某个类的某个方法呢?
只要我们能确定这个类的全限定类名、确定方法名、确定方法的参数类型,给定方法需要的具体参数,通过反射就能实现。
客户端调用后得到的结果,我们序列化写入Socket流中,在服务端中反序列化得到对象即可。
第三,这里需要思考一个问题:在客户端我们只知道商品服务的API,并不知道这背后的API到底是如何实现的,所以我们需要有一个映射,就是商品服务的API到服务端的实现的一个映射关系,其实这就是所谓的服务的注册(我们这里使用接口名进行映射)
网友评论