参考文档
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: xxxauto-register: true
源码简析
注册
NacosDiscoveryAutoConfiguration
NacosDiscoveryAutoRegister
@NacosInjectedprivate NamingService namingService;@Overridepublic 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
@Overridepublic 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);}