基于Nacos2.x版本实现服务上下架告警-前置知识

Nacos2.x grpc长轮选注册原理分析

1、下载源码

github 拉Nacos源码 地址:https://github.com/alibaba/nacos 拉下来之后 切到2.x版本 目前最高2.3.0 本片就以此版本分析

2、源码启动

  1. 先启动 nacos service端 找到nacos源码中的 console 模块中的 Nacos 然后添加 jvm 参数 -Dnacos.standalone=true 指定单机 启动
    在这里插入图片描述
  2. 打开example中的 NamingExample 类 修改 服务端地址为loccalhost:8848 执行main方法 代码稍微修改一下 我们只要注册 下面注销的代码 不需要 全部注释掉 使用System.in.read()让主线程阻塞在哪里
public static void main(String[] args) throws NacosException, InterruptedException, IOException {
        
        Properties properties = new Properties();
        properties.setProperty("serverAddr", System.getProperty("serverAddr", "localhost"));
        properties.setProperty("namespace", System.getProperty("namespace", "public"));
        
        NamingService naming = NamingFactory.createNamingService(properties);
        
        naming.registerInstance(INSTANCE_SERVICE_NAME, INSTANCE_IP, INSTANCE_PORT, INSTANCE_CLUSTER_NAME);
        
        System.out.println("[instances after register] " + naming.getAllInstances(INSTANCE_SERVICE_NAME));

        System.in.read();
        }
  1. 打开控制台localhost:8848/nacos 可以看到注册的服务信息 说明注册成功

3、源码客户端注册分析

NacosNamingService

  1. registerInstance方法此方法会调用NamingClientProxyDelegate.registerService() 方法完成服务注册 可以在 NacosNamingService的构造方法中看到
   this.clientProxy = new NamingClientProxyDelegate(this.namespace, serviceInfoHolder, nacosClientProperties,
                changeNotifier);
  1. NamingClientProxyDelegate 的registerService 方法 可以看出 如果是临时实列 并且 支持grpc 优先使用grpcClientProxy
    @Override
    public void registerService(String serviceName, String groupName, Instance instance) throws NacosException {
        getExecuteClientProxy(instance).registerService(serviceName, groupName, instance);
    }
    private NamingClientProxy getExecuteClientProxy(Instance instance) {
        if (instance.isEphemeral() || grpcClientProxy.isAbilitySupportedByServer(AbilityKey.SERVER_SUPPORT_PERSISTENT_INSTANCE_BY_GRPC)) {
            return grpcClientProxy;
        }
        return httpClientProxy;
    }

5、NamingGrpcClientProxy类分析

  1. registerService 此方法 调到最后会调用到doRegisterService 方法中 requestToServer方法完成服务注册
    public void doRegisterService(String serviceName, String groupName, Instance instance) throws NacosException {
     //封装InstanceRequest对象
        InstanceRequest request = new InstanceRequest(namespaceId, serviceName, groupName,
                NamingRemoteConstants.REGISTER_INSTANCE, instance);
                //在这一步完成注册
        requestToServer(request, Response.class);
        redoService.instanceRegistered(serviceName, groupName);
    }
  1. requestToServer 此方法会调用到 rpcClient.reqeust 完成rpc调用

4、源码服务端分析

  1. 客户端调用之后 会在 服务端的 naming 模块中 的 remote rpc.handler中的InstanceRequestHandler 类处理
  2. InstanceRequestHandler类 registerInstance() 方法 此方法在注册成功之后 会发布一个 RegisterInstanceTraceEvent 事件出来
    在这里插入图片描述

5、核心思路梳理

通过以上分析 我们得知 nacos 服务注册 以及 注销 或者是心跳检测不健康都会发送相关 事件出来 我们只要写一个 starter 监听相关事件 发送到kafka中 告警中心 消费 kafka的数据 就可以完成服务上下架告警

  • 26
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值