Nacos服务注册源码:客户端

入口

我们就拿nacos自己example下的NamingExample来做测试

public class NamingExample {

    public static void main(String[] args) throws NacosException, InterruptedException {

        Properties properties = new Properties();
        properties.setProperty("serverAddr", "localhost");
        properties.setProperty("namespace", "public");

        NamingService naming = NamingFactory.createNamingService(properties);

        naming.registerInstance("nacos.test.3", "11.11.11.11", 8888, "TEST1");

        System.out.println("instances after register: " + naming.getAllInstances("nacos.test.3"));

        Executor executor = new ThreadPoolExecutor( 1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(),
                                                   new ThreadFactory() {
                                                       @Override
                                                       public Thread newThread(Runnable r) {
                                                           Thread thread = new Thread(r);
                                                           thread.setName("test-thread");
                                                           return thread;
                                                       }
                                                   });

        naming.subscribe("nacos.test.3", new AbstractEventListener() {

            //EventListener onEvent is sync to handle, If process too low in onEvent, maybe block other onEvent callback.
            //So you can override getExecutor() to async handle event.
            @Override
            public Executor getExecutor() {
                return executor;
            }

            @Override
            public void onEvent(Event event) {
                System.out.println("serviceName: " + ((NamingEvent) event).getServiceName());
                System.out.println("instances from event: " + ((NamingEvent) event).getInstances());
            }
        });

        naming.deregisterInstance("nacos.test.3", "11.11.11.11", 8888, "TEST1");

        Thread.sleep(1000);

        System.out.println("instances after deregister: " + naming.getAllInstances("nacos.test.3"));

        Thread.sleep(1000);
    }
}

NamingFactory.createNamingService

image.png
将配置参数properties传进去,然后通过反射创建NamingService, 也就是说会调用到NacosNamingService的构造方法,我们来看一下
image.png
这里会调用到NamingClientProxyDelegate的构造方法
image.png

这里我们提前注意一下NamingGrpcClientProxy的构造方法,后面会用到
image.png
!!!有一个start方法,它会创建连接
image.png
connectToServer会调用到子类GrpcClient.connectToServer方法
image.png

naming.registerInstance

这里的namingServer是NacosNamingServer,最终会调用到NacosNamingServer.registerInstance(serviceName, ip, port, clusterName)
image.png
image.png
如果说group不传入的话,默认会设置一个DEFAULT_GROUP,继续调用
image.png
image.png
在构造方法里面我们能看到clientProxy实际上是一个NamingClientProxyDelegate,这里会调用它的registerService

NamingClientProxyDelegate.registerService

image.png
image.png
一般来说我们实例都是临时实例,所以这里使用的grpcClientProxy
接下来会调用到NamingGrpcClientProxy.registerService(serviceName, groupName, instance)

NamingGrpcClientProxy.registerService

image.png
image.png

  1. 又封装了一个InstanceRequest对象,里面包含namespaceId, serverName, groupName, instance等
  2. 调用requestToServer:向服务端发起请求了

image.png
这里的rpcClint是GrpcSdkClient,所以会调用到它的request方法
image.png

GrpcSdkClient.request

这里会调用到父类RpcClient.request方法
image.png
image.png
这里最终会调用到GrpcConnection里面的request方法
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/359056.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在DBeaver中重命名数据库

前言 DBeaver是一款强大的开源通用数据库管理和开发工具&#xff0c;支持多种数据库类型。在某些数据库系统中&#xff0c;你可以直接通过DBeaver的图形界面来重命名数据库名称。本文将详细介绍如何在DBeaver中进行数据库重命名操作。 重要提示&#xff1a; 对于不同的数据库…

Leetcode—2396. 严格回文的数字【中等】

2024每日刷题&#xff08;一零六&#xff09; Leetcode—2396. 严格回文的数字 算法思想 实现代码 class Solution { public:bool isStrictlyPalindromic(int n) {return false;} };运行结果 之后我会持续更新&#xff0c;如果喜欢我的文章&#xff0c;请记得一键三连哦&…

vue2 国际化的使用,自动翻译文件,自动生成国际化文件

vue2 国际化的使用&#xff0c;自动翻译文件&#xff0c;自动生成国际化文件 npm i vue-i18n6 文件代码 // zh.js 用来写全局通用的国际化 export default {home:"首页" }//en.js 用来写全局通用的国际化 export default {home:"home page" }//kor.js …

窗口函数rows between 、range between的区分

【移动窗口】 移动窗口&#xff0c;顾名思义&#xff0c;“窗口”&#xff08;也就是操作数据的范围&#xff09;不是固定的&#xff0c;而是随着设定条件逐行移动的。 在over后面的子句中&#xff0c;使用rows加“范围关键字”可以设置移动窗口&#xff0c;语法如下&#xf…

ESP32 看门狗:保障系统稳定运行的重要机制

ESP32 看门狗&#xff1a;保障系统稳定运行的重要机制 导言&#xff1a; 在嵌入式系统开发中&#xff0c;系统稳定性是至关重要的。为了应对系统出现异常情况或者死锁等问题&#xff0c;ESP32提供了看门狗&#xff08;Watchdog&#xff09;机制。本文将深入探讨ESP32看门狗的工…

内网穿透的应用-如何搭建FastDFS文件服务器并实现无公网ip访问本地文件服务

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

Docker的优化和私有容器的部署管理

1 Docker的优化和配置调整 1.1 如何缩小镜像的体积大小 1&#xff09;尽可能使用小体积的基础镜像&#xff08;一般推荐使用alpine阿尔卑斯镜像&#xff09; 2&#xff09;尽可能的减少dockfile指令的数量从而来减少镜像的层数 3&#xff09;在RUN指令末尾添加安装软件后清…

【Python笔记-设计模式】抽象工厂模式

一、说明 (一) 解决问题 抽象工厂是一种创建型设计模式&#xff0c;主要解决接口选择的问题。能够创建一系列相关的对象&#xff0c;而无需指定其具体类。 (二) 使用场景 系统中有多于一个的产品族&#xff0c;且这些产品族类的产品需实现同样的接口。 例如&#xff1a;有…

【Transformer】Attention Is All You Need

Abstract 主要的序列转导模型是基于复杂的循环或卷积神经网络&#xff0c;包括一个编码器和一个解码器。表现最好的模型还通过注意机制连接编码器和解码器。我们提出了一个新的简单的网络架构&#xff0c;变压器&#xff0c;完全基于注意力机制&#xff0c;完全摒弃递归和卷积…

JavaEE UDP协议

JavaEE UDP协议 在之前的文章中有对UDP协议套接字的使用进行讲解&#xff0c;本文主要对UDP协议进行一些理论补充。 文章目录 JavaEE UDP协议1. 概念2. UDP协议格式2.1 数据报长度2.2 校验和/检验和2.2.1 CRC校验2.2.2 MD5算法 1. 概念 UDP&#xff0c;即User Datagram Proto…

国标GB/T 28181详解:GB/T28181设备控制流程

目 录 一、基本要求 二、设备控制的功能项目 &#xff08;一&#xff09;设备控制支持的功能项目 &#xff08;二&#xff09;设备配置支持的功能项目 三、命令流程 &#xff08;一&#xff09;无应答命令流程 1、流程图 2、流程描述 &#xff08;二…

代码随想录算法训练营DAY7 | 哈希表(2)

一、LeetCode 454 四数相加II 题目链接&#xff1a;454.四数相加IIhttps://leetcode.cn/problems/4sum-ii/description/ 思路&#xff1a;建立HashMap&#xff0c;Key存储nums1、nums2数对之和&#xff0c;Value存储数对和出现次数&#xff0c;再遍历nums3、nums4数对确定答案…

动态住宅IP可以用来注册亚马逊电商吗?

注册亚马逊店铺可以用动态IP&#xff0c;只要是独立且干净的网线就没问题&#xff0c;亚马逊规则要求一个IP地址只能出现一个亚马逊店铺&#xff0c;若使用不当会导致关联账户。所以现在非常多人使用指纹浏览器搭配代理IP 固定ip可以给我们的账户带来更多的安全&#xff0c;要知…

如何使用docker快速安装Plik并实现固定公网地址远程访问

文章目录 推荐1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点…

矩阵键盘的使用

在定义局部变量时&#xff0c;一定要给该变量赋初值。在这个程序中&#xff0c;给按键按下的返回值变量 KeyNum 赋值为 20 。 矩阵键盘线行扫描法的学习链接&#xff1a;https://www.bilibili.com/video/BV1dv411z7Gd/?spm_id_from333.999.0.0&vd_sourceb91967c499b23106…

Nginx启用WebSocket支持

报错内容nginx.conf proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 问题解决WebSocket跨域 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Credentials true;

【算法专题】前缀和(附图解、代码)

&#x1f4d1;前言 本文主要是前缀和的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力一点&…

Vulnhub-DerpNStink

一、信息收集 端口扫描 Scanning derpnstink.local (192.168.1.14) [1000 ports] Discovered open port 80/tcp on 192.168.1.14 Discovered open port 21/tcp on 192.168.1.14 Discovered open port 22/tcp on 192.168.1.14 目录扫描 二、漏洞利用 访问主页f12找到第一个f…

网工内推 | 资深网工,周末双休,厂商认证优先,14薪

01 群核科技 招聘岗位&#xff1a;资深网络运维工程师 职责描述&#xff1a; 1、负责公司IDC机房网络的规划及持续改进&#xff0c;保证网络稳定运行&#xff1b; 2、负责公司国内外传输线路建设&#xff0c;提高链路的高可用保证业务的SLA&#xff1b; 3、负责网络监控平台的…

逻辑回归与感知机详解

一逻辑回归 采用log函数作为代价函数 1 用于二分类问题 2 cost成本函数定义 3 求最小值&#xff0c;链式求导法则 4 梯度下降法 5 结构图表示 二 感知机 样本点到超平面距离法 1 线性二分类问题 2 点到直线距离 3 更新w 和b 参数 4 算法流程 5 例子