这个RPC实现了一些基本的功能:
- 使用Netty来进行网络传输,效率比起传统的NIO要高很多。
- 使用Nacos作为服务的注册中心,用于管理注册的服务,当客户端请求发过来时,Nacos会寻找合适的服务返回给客户端消费。
- 实现了负载均衡的功能,,客户端对于Nacos返回的服务列表,会使用负载均衡算法,选择一个自己需要的服务加入,目前实现了轮询算法和随机选取算法。
- 加入了心跳检测机制,并不会发送完消息立即结束,而是保持的长连接,提高效率,并且也可以结合Nacos做心跳检测。
- 使用Protostuff作为对象的的序列化工具,效率更高,实现Netty中的编/解码的功能,提高了效率。
- 实现了钩子函数,当服务端下线的时候会自动去Nacos注销服务。
- 利用了并发编程的知识,使用CompletableFuture来接受客户端返回的结果。
- 使用了设计模式,例如使用单例模式去保持一个Channel,使得代码更加简洁。
详细的描述写在了我的博客
https://pandalee99.github.io/2022/11/02/srpc/
下面是测试环节:
由于使用Nacos,调试比较简单:
下载好Nacos,无论是win版还是linux版,在官网都有,比较方便;
但是由于Nacos一般都要配置数据库,为了方便测试,可以使用命令先进行单机运行
startup.cmd -m standalone
客户端:
public class NettyTestClient {
public static void main(String[] args) {
RpcClient client = new NettyClient(CommonSerializer.PROTOBUF_SERIALIZER);
RpcClientProxy rpcClientProxy = new RpcClientProxy(client);
HelloService helloService = rpcClientProxy.getProxy(HelloService.class);
HelloObject object = new HelloObject(114514, "Client send a Message");
String res = helloService.hello(object);
System.out.println(res);
}
}
服务端:
@ServiceScan
public class NettyTestServer {
public static void main(String[] args) {
RpcServer server = new NettyServer("127.0.0.1", 9999, CommonSerializer.PROTOBUF_SERIALIZER);
server.start();
}
}