参考文档
springboot集成nacos服务注册发现中心_nacos-discovery-spring-boot-starter-CSDN博客
依赖
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>0.2.8</version>
</dependency>
配置
nacos:
discovery:
server-addr: xxx
auto-register: true
源码简析
注册
NacosDiscoveryAutoConfiguration
NacosDiscoveryAutoRegister
@NacosInjected
private NamingService namingService;
@Override
public void onApplicationEvent(WebServerInitializedEvent event) {
// 是否开启了服务自动注册
if (!discoveryProperties.isAutoRegister()) {
return;
}
// 获取注册配置
Register register = discoveryProperties.getRegister();
if (StringUtils.isEmpty(register.getIp())) {
register.setIp(NetUtils.localIP());
}
if (register.getPort() == 0) {
register.setPort(event.getWebServer().getPort());
}
register.getMetadata().put("preserved.register.source", "SPRING_BOOT");
register.setInstanceId("");
// 服务名默认是应用名
String serviceName = register.getServiceName();
if (StringUtils.isEmpty(serviceName)){
if (StringUtils.isEmpty(applicationName)){
throw new AutoRegisterException("serviceName notNull");
}
serviceName = applicationName;
}
try {
// 注册实例
namingService.registerInstance(serviceName, register.getGroupName(),
register);
logger.info("Finished auto register service : {}, ip : {}, port : {}",
serviceName, register.getIp(), register.getPort());
} catch (NacosException e) {
throw new AutoRegisterException(e);
}
}
NamingService如何注入?通过注解
@EnableNacosDiscovery
@Import(NacosDiscoveryBeanDefinitionRegistrar.class)
NacosDiscoveryBeanDefinitionRegistrar#registerBeanDefinitions
NacosBeanUtils#registerNacosCommonBeans
NacosBeanUtils#registerAnnotationNacosInjectedBeanPostProcessor
CacheableEventPublishingNacosServiceFactory.NamingCreateWorker#run
注入的是DelegatingNamingService
接着看是如何注入的
NacosNamingService
@Override
public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {
NamingUtils.checkInstanceIsLegal(instance);
String groupedServiceName = NamingUtils.getGroupedName(serviceName, groupName);
if (instance.isEphemeral()) {
BeatInfo beatInfo = beatReactor.buildBeatInfo(groupedServiceName, instance);
beatReactor.addBeatInfo(groupedServiceName, beatInfo);
}
serverProxy.registerService(groupedServiceName, groupName, instance);
}
NamingProxy
public void registerService(String serviceName, String groupName, Instance instance) throws NacosException {
NAMING_LOGGER.info("[REGISTER-SERVICE] {} registering service {} with instance: {}", namespaceId, serviceName,
instance);
final Map<String, String> params = new HashMap<String, String>(16);
params.put(CommonParams.NAMESPACE_ID, namespaceId);
params.put(CommonParams.SERVICE_NAME, serviceName);
params.put(CommonParams.GROUP_NAME, groupName);
params.put(CommonParams.CLUSTER_NAME, instance.getClusterName());
params.put("ip", instance.getIp());
params.put("port", String.valueOf(instance.getPort()));
params.put("weight", String.valueOf(instance.getWeight()));
params.put("enable", String.valueOf(instance.isEnabled()));
params.put("healthy", String.valueOf(instance.isHealthy()));
params.put("ephemeral", String.valueOf(instance.isEphemeral()));
params.put("metadata", JacksonUtils.toJson(instance.getMetadata()));
// 调服务端接口注册
reqApi(UtilAndComs.nacosUrlInstance, params, HttpMethod.POST);
}