自研RPC框架之整体架构

自研RPC框架之整体架构

1.RPC整体架构

image-20240209142416533

整个RPC架构有四部分组成,包括服务调用方与提供方、注册中心、管理面板,其中管理面板有待实现,首先服务提供方和服务调用方都具有共同的API接口Jar包,里面包含了双方都需要的一致接口与实体类的声明,针对幂等性接口可以加上OpenrpcRetry注解,设置超时时间、重试次数、初始重试间隔时间等多种重试机制的参数。服务提供方会通过OpenrpcService注解配合包扫描完成服务的注册,其中服务名称设置为接口的全限定名称+分组名称(默认空字符串)+版本号(跟分组名称一个道理),在服务名称的节点下创建临时子节点,临时子节点名称即为服务提供方声明的IP地址+端口号。服务调用方通过OpenrpcReference注解利用动态代理技术完成底层网络通信,创建代理对象,完成RPC远程调用。

2.RPC代码框架

image-20240209144726291

3.RPC通信示例

openrpc-api的内容:

image-20240209145037105

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的内容:

image-20240209145349859

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()
// .application("first-openrpc-consumer")
// .registry(new RegistryConfig("zookeeper://127.0.0.1:21810"))
// .serializeProtocol("hessian")
// .compressProtocol("gzip")
.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的内容:

image-20240209145804941

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) {
// ServiceConfig service = new ServiceConfig();
// service.setInterface(HelloRPC.class);
// service.setRef(new HelloRPCImpl());
OpenrpcBootStrap.getInstance().application("first-openrpc-provider")
// 配置注册中心
// application.registry(new RegistryConfig("zookeeper://127.0.0.1:21810"))
// 发布服务
// application.publish(service)
// 扫描服务包,注册服务
.scanPackage("com.huling.service")
// 启动服务
.start();
}
}