跳到主要内容

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());
}
}

具体实现如下:

  1. 初始化 RPC 应用程序:

    • 调用 RpcApplication.init() 方法进行全局初始化。
  2. 服务注册:

    • 遍历传入的 ServiceRegisterInfo 列表,获取服务名和服务实现类。
    • 将服务实现类注册到本地注册表 LocalRegistry 中,供 RPC 调用时使用。
    • 根据 RPC 配置中的注册中心信息,创建对应的注册中心实例 Registry
    • 使用 registry.register() 方法将服务元信息(服务名、主机、端口等)注册到注册中心。
  3. 启动 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");
}
}
}