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

探秘RocketMQ 5.0 client端Nameserver地址更新的源码实现方式 客户端每隔30s就会去扫描判断Nameserver是否存活客户端每隔2分钟才会去http服务器拉取最新的Nameserver地址客户端topic相关的缓存信息每隔30s会去Nameserver拉取最新的topic、broker相关信息作者:weihubeats。 阅读详情

源码版本

  • 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服务来获取,因为可以自由扩容

出现 Caused by: java.net.UnknownHostException: jmenv.tbsite.net 解决方法(原理分析) 如果无法解析地址服务器的主机名,就会导致报错:`Caused by: java.net.UnknownHostException: jmenv.tbsite.net` 阅读详情

相关推荐

从零到一:ArduPilot无人船PID调参实战指南

本文详细介绍了ArduPilot无人船PID调参的实战指南,从基础参数设定到高级调参技术,帮助用户掌握水面环境下的PID控制逻辑。通过案例分析和参数示例,解决无人船在空载、负载变化及不同水域环境中的航行问题,提升无人船的稳定性和精确度。

weixin_29266647的博客 507

Rocketmq之NameServer地址配置及更新

NameServer在整个Rocketmq的模块划分中占据重要的地位,起到类似于注册中心的作用。BrokerServer启动时需要向NameServer注册自身元数据信息以及主题Topic信息,而Producer发送消息到BrokerServer、Consumer从BrokerServer订阅消息,则需要经过NameServer才能确定最终要进行数据通讯的BrokerServer的地址,所以,BrokerServer、Producer、Consumer程序启动均需要配置NameServer的地址。

carbuser_xl的博客 1万+

Pinocchio 结合 CasADi 进行 IK 逆运动学及 Mujoco 仿真

摘要:本视频演示了如何利用Pinocchio和CasADi实现机械臂逆运动学(IK)求解,并在Mujoco中进行仿真。通过构建优化问题(最小化位姿误差),结合IPOPT求解器对机械臂关节角度进行优化。代码支持导入URDF/MJCF模型,并以so100机械臂为例,实现了末端执行器位置跟踪的仿真测试。关键步骤包括:建立平移/旋转误差函数、设置约束条件、调用CasADi求解,最终在Mujoco中实时更新关节状态完成运动控制。

darcsdn 1002

Apache消息中间件之RocketMQ

一、概要 随着使用的队列和虚拟主题的增加,ActiveMQ IO 模块达到了瓶颈。官方表述他们想尽力通过节流、断路器或降级来解决这个问题,但效果不佳。所以我们开始关注当时流行的消息解决方案Kafka。不幸的是,Kafka 无法满足要求,尤其是在低延迟和高可靠性方面(更多参看);在这种情况下,RocketMQ应运而生,旨在成为一种新的消息传递引擎来处理更广泛的用例,从传统的发布/订阅场景到大容量实时零损失容忍交易系统。如今,已有 100 多家公司在其业务中使用了 RocketMQ 的开源版本。 Apache

企业实战系列集 ●●● https://ximenjianxue.blog.youkuaiyun.com 2215

重回童年的经典系列☀️| 【坦克大战3D版】游戏制作+解析

带你重回童年的经典系列——坦克大战3D版制作,感兴趣的可以看看呀~

努力前行,总会成为自己心中的那道光 5万+

第39步 深度学习图像识别:Inception V3建模(Tensorflow)

第39步 深度学习图像识别:Inception V3建模(Tensorflow)

Jet4505的博客 3168

24.RocketMQ之动态增减NameServer

highlight: arduino-light 动态增减NameServer 一个消息队列集群由多台机器组成,持续稳定地提供服务,因为业务需求或硬件故障,经常需要增加或减少各个角色的机器,本节介绍如何在不影响服务稳定性的情况下动态地增减机器。 NameServer是RocketMQ集群的协调者,集群的各个组件是通过NameServer获取各种属性和地址信息的。 主要功能包括两部分: ...

qq_30635523的博客 817

基于Simulink进行双向DC-DC变换器的仿真建模

特点双向性:可以将能量从一个电压等级转换到另一个,且方向可逆。效率高:通过合理的控制策略减少能量损失。应用广泛:如电池管理系统、混合动力汽车等。挑战拓扑选择:根据应用场景选择合适的电路结构(如buck-boost、full-bridge等)。控制策略:确保高效稳定运行的同时,适应负载变化。热管理:有效散热以保持长期可靠性。首先明确要模拟的任务内容。设计一个能够支持双向能量传输的变换器。根据输入输出电压要求确定合适的变换器拓扑。实现有效的控制策略来维持输出电压稳定。

xiaoheshang_123的博客 367

RocketMQ入门(三)

今天的博客主题 MQ消息中间件 --》RocketMQ --》RocketMQ入门(三) 本文主要讲解RocketMQ的架构设计、架构部署及组件在实战中的建议 架构设计 RocketMQ是一个分布式消息传递和流媒体平台,具有低延迟,高性能和可靠性,万亿级容量和灵活的可扩展性。 它由四部分组成:名称服务器(name Server),代理(brokers),生产者(prod...

小萝卜.的博客 2346

Anomalib库安装以及使用

Anomalib是一个专注于异常检测的深度学习库。它的目标是收集最新的异常检测算法,并提供用于在公共和私有数据集上进行基准测试的工具。该库提供了一系列已实现的异常检测算法,这些算法在最近的文献中有所描述。此外,Anomalib还提供了一套工具,方便开发人员开发和实现自定义模型。该库特别注重基于图像的异常检测,旨在识别数据集中的异常图像或图像中的异常像素区域。通过使用Anomalib,用户可以快速构建和评估各种异常检测算法,以满足其特定需求。

mingo_敏 5199

基于jeecgboot3.9.0的项目管理——项目工作台(二)

基于jeecgboot3.9.0的项目管理——项目工作台(二)

宁波阿成的博客 206

rocketMq介绍和安装

MQ:MessageQueue,消息队列。 队列,是一种FIFO 先进先出的数据结构。消息由生产者发送到MQ进行排队,然后按原来的顺序交由消息的消费者进行处理。QQ和微信就是典型的MQ。主要有以下三个方面:异步例子:快递员发快递,直接到客户家效率会很低。引入菜鸟驿站后,快递员只需要把快递放到菜鸟驿站,就可以继续发其他快递去了。客户再按自己的时间安排去菜鸟驿站取快递。作用:异步能提高系统的响应速度、吞吐量。解耦例子:《Thinking in JAVA》很经典,但是都是英文,我们看不懂,所以需要编辑社,将文章翻

我的技术博客 2812

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

RocketMQ 实战(六) - 最佳实践

1 Producer 一个应用尽可能用一个Topic,消息子类型用tags来标识,tags可以由应用自由设置 只有发送消息设置了tags,消费方在订阅消息时,才可以利用tags在broker做消息过滤 message.setTags("TagA"); 如有可靠性需要,消息发送成功或者失败,要打印消息日志(sendresult和key信 息) 如果相同性质的消息量大,使用批量消息...

JavaEdge全是干货的技术号 2717

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

RocketMQ详解、下载、安装及启动运行

RocketMQ官网下载地址: https://rocketmq.apache.org/download。RocketMQ官网:https://rocketmq.apache.org/

weixin_42113716的博客 423

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

RocketMQ: 客户端使用指南

1 ) 客户端 API 形式DefaultMQProducer、TransactionMQProducer、DefaultMQPushConsumer、DefaultMQPullConsumer 都继承于 ClientConfig 类,ClientConfig 为客户端的公共配置类客户端的配置都是 get、set 形式,每个参数都可以用 spring 来配置,也可以在代码中配置,例如 namesrvAddr 这个参数可以这样配置,其他参数同理2 )客户端的公共配置参数名默认值说明。

Wang的专栏 1711

RocketMQ各种集群模式介绍

集群模式 1)单Master模式 这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用。不建议线上环境使用,可以用于本地测试。 2)多Master模式 一个集群无Slave,全是Master,例如2个Master或者3个Master,这种模式的优缺点如下: 优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高;

Leon_Jinhai_Sun的博客 1663

RcoketMQ 全部配置表

1、Broker配置 参数名 默认值 说明 listenPort 10911 接受客户端连接的监听端口 namesrvAddr null nameServer 地址 brokerIP1 网卡的 InetAddress 当前 broker 监听的 IP brokerIP2 跟 brokerIP1 一样 存在主从 bro..

Xx__WangQi的博客 657

RocketMq-客户端配置

客户端配置 相对于RocketMQ的Broker集群,生产者和消费者都是客户端 DefaultMQProducer、TransactionMQProducer、DefaultMQPushConsumer、 DefaultMQPullConsumer都继承于ClientConfig类,ClientConfig为客户端的公共配置类。 客户端的配置都是get、set形式,每个参数都可以用spring来配置,也可以在代码中配置。 例如namesrvAddr这个参数可以这样配置,producer.setNamesrv

小城我家 1487

RocketMQ安装部署-最小化版本适用于开发测试环境

文章目录前提下载部署启动NameServer启动Broker测试收发消息关闭服务器 前提 注意Rocket客户端和服务端版本要一致。本部署架构是最小化版本适用于开发测试环境 rocketmq-client 地址:https://search.maven.org/artifact/org.apache.rocketmq/rocketmq-client rocketmq-spring-boot-starter 注意看内部依赖的rocketmq-client版本 地址:https://search.mave

laker的博客 1081

rocketmq 的命令介绍

1、启动nameserver命令 进入到bin目录: nohup sh mqnamesrv & 2、查看nameserver日志命令 进入bin 目录:tail -f ~/logs/rocketmqlogs/namesrv.log 3、停止nameserver命令 进入bin目录:sh mqshutdown namesrv 4、启动 Broke......

qq_37469931的博客 2225

NameServer路由注册与发现

NameServer路由注册与发现

xhl1123456789的博客 667

NameServer

NameServer集群结构图 NamesrvStartup: NameServer的启动类; NamesrvController: NameServer的核心控制类; KVConfigManager: 读取或变更NameServer的配置属性,加载NamesrvConfig中配置的配置文件到内存; KVConfigSerializeWrapper: NameServer配置信息序列化包装类; RouteInfoManager: NameServer数据的载体,记录Broke...

wanli4717的博客 837

kafka 常见问题( 持续更新... ... )

kafka 常见问题 1. kafka中zk的作用,具体用在了哪些地方,zk可以用nacos替代吗 zk 记录集中的服务器数量,主题数量,分区信息,副本信息,集群控制器等信息。(数据不大,种类多,关注数据一致性,不要求速度高并发cp) nacos主要做服务发现,Kafka中的zk的作用是状态管理。(ap) 不能替换。 RocketMQ为什么不使用ZooKeeper而自己开发NameServer? 在服务发现领域,ZooKeeper 根本就不能算是最佳的选择。 注册中心是CP还是AP系统? 在分布式系统

chuanchengdabing的博客 1828

RocketMq使用(5.0)

这一部分我们可以结合一下管理控制台,先来理解下RocketMQ的一些重要的基础概念:官方文档-消息发送领域模型:https://rocketmq.apache.org/zh/docs/domainModel/01main整个消息流程(大致,错了勿怪)1、部署时Broker会根据配置的nameserver地址,将自身的名称,地址等信息注册到nameserver上,每个nameserver上都具备了全量的broker信息。一般只要一台nameserver和一台broker master 节点正常,整个集群就可以

我的技术博客 5732
上一篇: 五年从程序员到架构师!这是我见过史上最好程序员的职业规划
下一篇: 膜拜!阿里自爆十万字Java面试手抄本,脉脉一周狂转50w/次
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值