百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Rocketmq5.0客户端如何发现Namserver地址源码分析

ahcoder 2025-04-05 16:25 35 浏览

源码版本

  • rocketmq:release-5.0.0

生产者一般使用

DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP);
producer.setNamesrvAddr(DEFAULT_NAMESRVADDR);
producer.start();

如何设置NameServer地址

以下方式由高到底

  1. 通过java启动参数设置,比如通过设置环境变量
System.setProperty(MixAll.NAMESRV_ADDR_PROPERTY, "127.0.0.1:9876");

  1. 通过设置服务器环境变量(Linux)
-n 127.0.0.1:9876

  1. 通过代码设置,比如
producer.setNamesrvAddr(DEFAULT_NAMESRVADDR);

  1. 通过HTTP服务来设置,当上面都没有设置,会向一个HTTP地址发送请求来获取NameServer地址,默认的URL是http://jmenv.tbsite.net:8080/rocketmq/nsaddr (淘宝的测试地址), 我们可以通过设置系统参数rocketmq.namesrv.domain来覆盖 jmenv.tbsite.net的值, 通过设置rocketmq.namesrv.domain.subgroup参数来覆盖nsaddr的值

可以看到4通过设置HTTP服务获取NameServer的地址是最麻烦的,相当于自己还要出一个获取获取NameServer的接口,但是他是唯一支持动态增加NameServer,不用重启其他组件的方式

源码分析

我们现在通过源码方式分析上面的几种设置方式

这里的ClientConfig实际就是DefaultMQProducer,也就是我们发送消息的第一步,创建一个DefaultMQProducer

System.setProperty(MixAll.NAMESRV_ADDR_PROPERTY, "10.10.10.1:9999");
DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP);

通过DefaultMQProducer的构造方法我们可以看到namesrvAddr的默认值是通过
NameServerAddressUtils.getNameServerAddresses()

注意这里的DefaultMQProducer是继承了DefaultMQProducer

我们看看
NameServerAddressUtils.getNameServerAddresses()方法的具体实现

可以看到首先通过获取环境变量,其次是获取系统环境变量

这里就解释了我们的1、2优先级。 看到了1、2的方法也很容易证实3的设置方式了,默认值是1、2,如果我们设置了就是3的设置方式 可以看到这里的的namesrvAddr地址的获取主要是通过clientConfig获取的,而clientConfig的构造就是通过DefaultMQProducer构造的(前面分析的),而我们就可以通过在启动Product的时候设置 比如

DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP);
producer.setNamesrvAddr("name-server1-ip:9876;name-server2-ip:9876");

可以看到clientConfig就是在这里通过clientConfig构造的

但是这里的clientConfig就是DefaultMQProducer,我们可以通过debug的方式去确认

这里可以看到就验证了我们说的通过代码设置。

我们继续向下看 发现在product启动这里会去通过clientConfig获取namesrvAddr,如果我们之前的代码里面没有设置namesrvAddr的地址,那这里就会为空,然后就通过fetchNameServerAddr去获取namesrvAddr的地址

进到方法fetchNameServerAddr里面我们会发现是通过TopAddressing类的fetchNSAddr方法

我们看看

这里核心就是这个方法

return fetchNSAddr(true, 3000);

我们进去看看

可以看到这里通过http去获取namesrvAddr地址,url的获取是通过this.wsAddr;获取的,所以我们重点看看wsAddr如何初始化的

可以看到是通过MixAll.getWSAddr()的方法获取的,我们看看getWSAddr方法

阿里云ons clinetbus直接设置的是NAMESRV_ADDR吗

从上面我们可以确认最好的方式是通过http方式获取namesrvAddr地址,那么为什么我们使用阿里云的ons-clinet是这种方式呢

Properties properties = new Properties();
        properties.put(PropertyKeyConst.AccessKey, aliMQAccessKey);
        properties.put(PropertyKeyConst.SecretKey, aliMQSecretKey);
        properties.put(PropertyKeyConst.NAMESRV_ADDR, domainEventNameSrv);
        return ONSFactory.createProducer(properties);

咋看好像是直接设置了NAMESRV_ADDR地址,其实我们随便看看源码发现他也是设置的是wsAddr地址

总结

这里我们通过源码的方式验证了rocketmq product获取namesrvAddr的几种方式,其中最推荐的还是通过HTTP服务来获取,因为可以自由扩容

相关推荐

KaOS 2025.05版本发布:全面拥抱Qt6,彻底告别Qt5

KaOSLinux2025.05版本重磅发布:全面拥抱Qt6,开启KDE生态新篇章继2025.03版本发布两个月后,专注于KDE桌面环境、采用XFS文件系统的滚动发行版Li...

基于FIMC接口的CMOS摄像头驱动分析与设计

摘要:目前的嵌入式系统中,USB摄像头使用比较普遍,但其应用会受到传输速度的限制。本文采用一款高速CMOS摄像头,其驱动利用S3C6410内置的FIMC接口技术,采用DMA和ping-pong缓冲...

没错是微软 推出基于Linux的交换机系统

2015-09-2205:59:59作者:郑伟你没看错,为了提升自身Azure云数据中心内网络设备的兼容性及开放性,微软也开始推出基于Linux的网络交换机系统了。这个被称为AzureCloud...

Linus Torvalds 宣布首个 Linux 内核 6.16 候选版本

Linux内核负责人兼创始人LinusTorvalds宣布关闭合并窗口,该窗口用于将主要新功能添加到内核中,并开始发布Linux6.16候选版本,从候选版本1(Linux6.16-r...

Linux内核漏洞将影响Haswell架构服务器

在infoq网站上,GilTene最近报告一个十分重要,但并不为人知Linux内核补丁,特别对采用Haswell架构的Linux系统用户和管理员应该特别关注。报告提醒RedHat发行版的用户(包括...

关于Linux性能调优中网络I/O的一些笔记

写在前面和小伙伴分享一些Linux网络优化的笔记,内容很浅,可以用作入门博文内容结合《Linux性能优化》读书笔记整理涉及内容包括常用的优化工具(mii-tool,ethtool,ifconfig,i...

国产操作系统- Veket Linux(国产操作系统之光银河麒麟阅读理解)

VeketLinux是一个随身的可装在U盘的Linux操作系统。主要面向桌面用户。它的设计重点是提供简单易用且稳定的操作系统,同时保持更新和开发。它具有强大的功能集和广泛的用户基础,可满足...

AlmaLinux 9.6发布:升级工具、初步支持IBM Power虚拟化技术

IT之家5月21日消息,科技媒体linuxiac昨日(5月20日)发布博文,报道称代号为SageMargay的AlmaLinux9.6发行版已上线,距上一版本9.5发...

跟老韩学Linux运维架构师系列,vim与view的基本使用

下面是vim和view的10个实例:用vim打开一个新文件:vimnewfile.txt这个命令将会在vim编辑器中打开一个新文件。在vim中移动光标:使用方向键或h、j、k、l键来移动光标。在v...

malloc底层原理剖析——ptmalloc内存池

malloc底层为什么是内存池malloc大家都用过,其是库函数。我们都知道库函数在不同的操作系统中其实执行的是系统调用,那么malloc在Linux上执行的是哪个系统调用呢?brk()和mmap()...

Zen 6架构首秀Linux,AMD加速下一代处理器布局

IT之家5月15日消息,科技媒体Phoronix昨日(5月14日)发布博文,报道称AMD已经开始为下一代“Zen6”处理器做准备,已为该构架向Linux内核提交了首个补丁,...

为何越来越多企业转向安卓/Linux工业平板电脑?答案在这里

在工业领域,设备的稳定性至关重要,尤其是工业平板电脑,常年运行在高温、粉尘、潮湿等复杂环境下,一旦系统崩溃或者卡顿,可能会影响整个生产流程。那么,为什么越来越多的企业选择安卓/Linux工业平板电脑,...

从3ms到0.8ms:ARM+Linux如何重塑工业控制实时性标杆

在智能制造领域,产线控制系统对实时性的要求越来越高。根据行业调研数据,超过65%的工业现场出现过因系统响应延迟导致的故障停机,平均每次停机造成的直接损失高达2-8万元。传统x86架构搭配Windows...

看Linux如何"挖坑种树"

写在前面,有人看我的Linux文章说技术难度不深,笔者不是不想写深,笔者是觉得Linux难就难在入门,入门之后你就知道如何上网查询你所要要解决的Linux需求。如果你已入门,此文已对你无用,请略过此...

AlmaLinux 9.6 发布,新增功能亮点纷呈!

距离上一版本AlmaLinux9.5发布六个月后,基于5.14内核的AlmaLinux正式宣布其企业级Linux发行版的9.x系列第六个更新——AlmaLinux9.6(Sag...