RPC框架启动机制
代码优化说明
我们想要开发者可以用更少的代码就可以使用我们的RPC框架,只需要把启动的代码封装为一个专门的启动类或者函数,然后让提供者(Provider)和消费者(Consumer)来调用即可。需要注意的是,服务提供者和消费者需要初始化的模块是不同,消费者(Consumer)不需要初始化Web服务器。
服务提供者启动类
ServiceRegisterInfo类主要是服务名称和服务实现类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ServiceRegisterInfo<T> {
/**
* 服务名称
*/
private String serviceName;
/**
* 服务实现类
*/
private Class<? extends T> implClass;
}
服务启动的时候,将ServiceRegisterInfo
注册到注册中心。
@Slf4j
public class ProviderBootstrap {
/**
* 初始化
*/
public static void init(List<ServiceRegisterInfo<?>> serviceRegisterInfoList) {
// RPC初始化
RpcApplication.init();
// 全局配置
final RpcConfig rpcConfig = RpcApplication.getRpcConfig();
for (ServiceRegisterInfo<?> serviceRegisterInfo : serviceRegisterInfoList) {
String serviceName = serviceRegisterInfo.getServiceName();
Class<?> implClass = serviceRegisterInfo.getImplClass();
// 本地注册
LocalRegistry.register(serviceName, implClass);
// 注册到注册中心
RegistryConfig registryConfig = rpcConfig.getRegistryConfig();
Registry registry = RegistryFactory.getInstance(registryConfig.getRegistry());
ServiceMetaInfo serviceMetaInfo = new ServiceMetaInfo();
serviceMetaInfo.setServiceName(serviceName);
serviceMetaInfo.setServiceHost(rpcConfig.getServerHost());
serviceMetaInfo.setServicePort(rpcConfig.getServerPort());
try {
registry.register(serviceMetaInfo);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// 启动服务
VertxTcpServer vertxTcpServer = new VertxTcpServer();
vertxTcpServer.doStart(RpcApplication.getRpcConfig().getServerPort());
}
}
具体实现如下:
-
初始化 RPC 应用程序:
- 调用
RpcApplication.init()
方法进行全局初始化。
- 调用
-
服务注册:
- 遍历传入的
ServiceRegisterInfo
列表,获取服务名和服务实现类。 - 将服务实现类注册到本地注册表
LocalRegistry
中,供 RPC 调用时使用。 - 根据 RPC 配置中的注册中心信息,创建对应的注册中心实例
Registry
。 - 使用
registry.register()
方法将服务元信息(服务名、主机、端口等)注册到注册中心。
- 遍历传入的
-
启动 RPC 服务端:
- 创建
VertxTcpServer
实例,它是基于 Vert.x 框架实现的 TCP 服务端。 - 调用
vertxTcpServer.doStart()
方法,并传入 RPC 配置中指定的服务端口,启动 TCP 服务端。
- 创建
这个引导程序的设计目的是将 RPC 服务端的初始化和启动过程集中在一个入口类中,方便管理和扩展。它处理了服务注册、配置读取等常见的 RPC 服务端初始化逻辑,并将具体的网络通信细节委托给了 VertxTcpServer
类。
服务提供者初始化启动:
public class CoreProviderExample {
public static void main(String[] args) {
List<ServiceRegisterInfo<?>> serviceRegisterInfos = new ArrayList<>();
ServiceRegisterInfo serviceRegisterInfo =
new ServiceRegisterInfo(UserService.class.getName(), UserServiceImpl.class);
serviceRegisterInfos.add(serviceRegisterInfo);
ProviderBootstrap.init(serviceRegisterInfos);
}
}
用户在使用的时候,只需要先创建要注册的实现类,放入serviceRegisterInfos里面,然后调用 ProviderBootstrap.init(serviceRegisterInfos);
即可
服务消费者启动类
消费者启动只需要初始化配置。
/**
* @author houyunfei
* 服务消费者启动类
*/
public class ConsumerBootstrap {
public static void init() {
RpcApplication.init();
}
}
服务消费者初始化启动:
public class CoreConsumerExample {
public static void main(String[] args) {
ConsumerBootstrap.init();
// 获取 代理
UserService userService = ServiceProxyFactory.getProxy(UserService.class);
User user = new User();
user.setName("cxk");
User user1 = userService.getUser(user);
if (user1 != null) {
System.out.println(user1.getName());
} else {
System.out.println("user==null");
}
}
}