Skip to main content

RPC框架启动机制


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