用动态代理+反射+BIO写个RPC玩玩
RPC : Remote Procudure Call
不同计算机之间的方法可以远程调用,这个就是RPC最重要的概念
但是由于程序是运行在不同的机器中的,两个机器之间并没有联系,要是想实现调用其他机器上的方法如同在调用本机的方法一样的效果 该如何做到?
我用了最基本的BIO来实现这个需求,要实现这种需求, 客户端和服务端两个角色是必要的。
客户端调用过程大概这样,注意 这个 HelloService 是一个接口,并且在client服务中没有实现, 具体的实现在另一个服务,这么说有点像Feign的感觉,不过Feign底层用的是HttpClient。
package com.skypyb.cloud.client; import com.skypyb.cloud.client.core.Client; import com.skypyb.cloud.server.service.HelloService; import java.net.InetSocketAddress; public class Application { public static void main(String[] args) throws ClassNotFoundException { HelloService helloService = Client.getRemoteProxyObj(HelloService.class, new InetSocketAddress(9999)); String msg = helloService.hello("你好好"); System.out.println(msg); } }
HelloService 很简单,就一个方法
package com.skypyb.cloud.client.service; public interface HelloService { String hello(String msg); }
服务端的启动:
package com.skypyb.cloud.server; import com.skypyb.cloud.server.core.Server; import com.skypyb.cloud.server.core.ServerCenter; import com.skypyb.cloud.server.service.HelloService; import com.skypyb.cloud.server.service.impl.HelloServiceImpl; public class Application { public static void main(String[] args) { new Thread(() -> { Server server = new ServerCenter(9999); //注册 server.register(HelloService.class, HelloServiceImpl.class); server.start(); }).start(); } }
我个人在本机上是完全实现了相对应的效果的,即Client服务调用了Server服务的方法(这俩服务不在一个项目里)
这里只贴了启动和调用的代码,具体实现看github: https://github.com/skypyb/framework_impl/tree/master/rpc