首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >nacos-client实例注册源码分析

nacos-client实例注册源码分析

作者头像
BUG弄潮儿
发布2022-12-05 21:13:20
发布2022-12-05 21:13:20
54200
代码可运行
举报
文章被收录于专栏:JAVA乐园JAVA乐园
运行总次数:0
代码可运行

pom.xml 引入

代码语言:javascript
代码运行次数:0
运行
复制
<dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      <version>2021.1</version>
  </dependency>

找到 spring.factories 文件

spring-cloud-starter-alibaba-nacos-discoveryjar包下找到MATE-INF/spring.factories 文件;可以看到 自动装配类NacosServiceRegistryAutoConfiguration

代码语言:javascript
代码运行次数:0
运行
复制
 com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration

实例注册 NacosAutoServiceRegistration

代码语言:javascript
代码运行次数:0
运行
复制
@Bean
 @ConditionalOnBean(AutoServiceRegistrationProperties.class)
 public NacosAutoServiceRegistration nacosAutoServiceRegistration(
   NacosServiceRegistry registry,
   AutoServiceRegistrationProperties autoServiceRegistrationProperties,
   NacosRegistration registration) {
  return new NacosAutoServiceRegistration(registry,
    autoServiceRegistrationProperties, registration);
 }

NacosServiceRegistryAutoConfiguration 会自动创建关键类 NacosAutoServiceRegistration Bean;该类的父类AbstractAutoServiceRegistration 实现了 ApplicationContextAware 会在 SpringBean 创建完成后自动调用。

代码语言:javascript
代码运行次数:0
运行
复制
@Override
@SuppressWarnings("deprecation")
public void onApplicationEvent(WebServerInitializedEvent event) {
  bind(event);
}

@Deprecated
public void bind(WebServerInitializedEvent event) {
  ApplicationContext context = event.getApplicationContext();
  if (context instanceof ConfigurableWebServerApplicationContext) {
    if ("management".equals(((ConfigurableWebServerApplicationContext) context).getServerNamespace())) {
      return;
    }
  }
  this.port.compareAndSet(0, event.getWebServer().getPort());
  // 开始注册客户端
  this.start();
}  

public void start() {
 //.......
  //触发注册
 register();
  //......
}

protected void register() {
  //服务注册:serviceRegistry是NacosServiceRegistry的实例
  this.serviceRegistry.register(getRegistration());
}

注册具体实现类 NacosServiceRegistry

注册核心代码

代码语言:javascript
代码运行次数:0
运行
复制
 @Override
 public void register(Registration registration) {

  if (StringUtils.isEmpty(registration.getServiceId())) {
   log.warn("No service to register for nacos client...");
   return;
  }

  NamingService namingService = namingService();
  String serviceId = registration.getServiceId();
  String group = nacosDiscoveryProperties.getGroup();

  Instance instance = getNacosInstanceFromRegistration(registration);

  try {
      //开始注册实例
      namingService.registerInstance(serviceId, group, instance);
      log.info("nacos registry, {} {} {}:{} register finished", group, serviceId,
      instance.getIp(), instance.getPort());
  }
  catch (Exception e) {
     log.error("nacos registry, {} register failed...{},", serviceId,
     registration.toString(), e);
     // rethrow a RuntimeException if the registration is failed.
     // issue : https://github.com/alibaba/spring-cloud-alibaba/issues/1132
     rethrowRuntimeException(e);
  }
 }

NamingHttpClientProxy 注册代理类

代码语言:javascript
代码运行次数:0
运行
复制
@Override
  public void registerService(String serviceName, String groupName, Instance instance) throws NacosException {
      //.......
      //把自己作为实例注册到nacos-server
      reqApi(UtilAndComs.nacosUrlInstance, params, HttpMethod.POST);

  }
  
  public String reqApi(String api, Map<String, String> params, Map<String, String> body, List<String> servers,
            String method) throws NacosException {
        //.......
        if (serverListManager.isDomain()) {
            //.......
            //调用服务接口
            return callServer(api, params, body, nacosDomain, method);
        } else {
            //.......
           //调用服务接口
            return callServer(api, params, body, server, method);
            }
        }
        //.......
    }

实例注册接口/nacos/v1/ns/instance

代码语言:javascript
代码运行次数:0
运行
复制
https://nacos.io/zh-cn/docs/open-api.html#2.1
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BUG弄潮儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • pom.xml 引入
  • 找到 spring.factories 文件
  • 实例注册 NacosAutoServiceRegistration
  • 注册具体实现类 NacosServiceRegistry
  • NamingHttpClientProxy 注册代理类
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档