自研RPC框架之整体架构
1.RPC整体架构
整个RPC架构有四部分组成,包括服务调用方与提供方、注册中心、管理面板,其中管理面板有待实现,首先服务提供方和服务调用方都具有共同的API接口Jar包,里面包含了双方都需要的一致接口与实体类的声明,针对幂等性接口可以加上OpenrpcRetry
注解,设置超时时间、重试次数、初始重试间隔时间等多种重试机制的参数。服务提供方会通过OpenrpcService
注解配合包扫描完成服务的注册,其中服务名称设置为接口的全限定名称+分组名称(默认空字符串)+版本号(跟分组名称一个道理),在服务名称的节点下创建临时子节点,临时子节点名称即为服务提供方声明的IP地址+端口号。服务调用方通过OpenrpcReference
注解利用动态代理技术完成底层网络通信,创建代理对象,完成RPC远程调用。
2.RPC代码框架
3.RPC通信示例
openrpc-api
的内容:
1 2 3 4 5 6 7 8
| public interface HelloRPC { @OpenrpcRetry(timeout = 5000, tryTimes = 3, initInterval = 3000) String SayHi(String msg); }
public interface UserService { String login(String username, String password); }
|
openrpc-consumer
的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class ConsumerApplication { private static final Logger log = LoggerFactory.getLogger(ConsumerApplication.class);
public static void main(String[] args) throws InterruptedException { ReferenceConfig<HelloRPC> reference = new ReferenceConfig<>(); reference.setInterface(HelloRPC.class); reference.setGroup("");
OpenrpcBootStrap.getInstance()
.reference(reference);
HelloRPC helloRPC = reference.get(); for (int i = 0; i < 100; i++) { String s = helloRPC.SayHi("hi"); log.info("SayHi->{}", s); } Thread.sleep(1000000); } }
|
openrpc-provider
的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| @OpenrpcService(weight = 10, group = "") public class HelloRPCImpl implements HelloRPC { @Override public String SayHi(String msg) { return "hi consumer:" + msg; } }
@OpenrpcService(weight = 10, group = "") public class UserServiceImpl implements UserService { @Override public String login(String username, String password) { return "注册成功"; } }
public class ProviderApplication { public static void main(String[] args) { OpenrpcBootStrap.getInstance().application("first-openrpc-provider") .scanPackage("com.huling.service") .start(); } }
|