ClientConfiguration - minbox-projects/message-pipe GitHub Wiki

客户端(Client)在启动时会根据@EnableMessagePipeClient的配置来选择使用不同的方式进行注册客户端服务,注册成功后才可以接受服务端(Server)的消息分发。

1. 注册服务类型

  • ServerServiceType#NACOS

    @EnableMessagePipeClient(serverType = ServerServiceType.NACOS)
    

    将客户端(Client)注册到Nacos Server服务上,由于服务端(Server)针对NamingService有服务变动订阅通知,所以可以在第一时间将客户端缓存到服务端本地,并将客户端与消息管道进行绑定。

  • ServerServiceType#GRPC

    @EnableMessagePipeClient(serverType = ServerServiceType.GRPC)
    

    基于Google提供的GRPC服务框架实现,客户端启动时会根据服务端的IP、Port进行注册,注册成功后默认每间隔10秒发送一次心跳包,告知服务端(Server)当前自己的运行状态。

2. 注册服务选择器

既然上面我们通过@EnableMessagePipeClient注解的serverType参数进行配置了注册方式,那么具体是通过方式来实例化对应的启动服务类的呢?

@EnableMessagePipeClient部分源码:

// ...
@Import({MessagePipeClientImportBeanDefinitionRegistrar.class, RegistrarServiceSelector.class})
// ...

我们可以看到通过@Import注解引入了其他两个类,其中一个是 ImportSelector 接口的实现类。

RegistrarServiceSelector源码:

@Slf4j
public class RegistrarServiceSelector implements ImportSelector {
    /**
     * The name of {@link ServerServiceType} attributes in {@link EnableMessagePipeClient}
     */
    private static final String REGISTRAR_TYPE_ATTRIBUTE_NAME = "serverType";

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        Map<String, Object> annotationAttributes =
                importingClassMetadata.getAnnotationAttributes(EnableMessagePipeClient.class.getName());
        ServerServiceType serverServiceType = (ServerServiceType) annotationAttributes.get(REGISTRAR_TYPE_ATTRIBUTE_NAME);
        log.info("Use the [{}] method to register the Client service", serverServiceType);
        switch (serverServiceType) {
            case GRPC:
                return new String[]{GRpcRegistrarService.class.getName()};
            case NACOS:
                return new String[]{NacosRegistrarService.class.getName()};
        }
        throw new MessagePipeException("Unsupported ServerServiceType:" + serverServiceType);
    }
}

通过查看源码可以发现选择注册服务的方式完全是根据@EnableMessagePipeClient#serverType参数值而决定的。

3. Nacos方式服务

如果通过Nacos方式启动客户端服务时,主要是通过NacosRegistrarService类进行完成注册。

注册Nacos服务时需要NamingService实例,如果客户端项目SpringIOC容器内不存在NamingService实例,则会使用NacosFactory#createNamingService方法创建新的实例(该NamingService实例并不会注册到Spring IOC容器内)

如果客户端项目正常停止后会调用NamingService#deregisterInstance方法取消注册客户端在Nacos Server的服务。

注意事项:nacos-client v1.3.2版本之前元数据不支持特殊字符的形式传递,也就是支持正则表达式的消息管道时可能会存在问题。

配置参数详见:ClientConfiguration

4. GRPC方式服务

如果通过Grpc的方式启动客户端(Client)服务时,主要是通过GRpcRegistrarService类进行完成注册。

客户端项目在启动时会根据ClientConfiguration#serverAddressClientConfiguration#serverPort配置信息进行尝试注册到服务端(Server),注册成功后会开启一个调度线程池(ScheduledExecutorService)来定时向服务端发送心跳包。

配置参数详见:[ClientConfiguration](