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#serverAddress
、ClientConfiguration#serverPort
配置信息进行尝试注册到服务端(Server
),注册成功后会开启一个调度线程池(ScheduledExecutorService
)来定时向服务端发送心跳包。
配置参数详见:[ClientConfiguration](