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

源码版本

生产者一般使用

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

展开阅读全文

页面更新:2024-03-06

标签:源码   地址   发现   阿里   客户端   环境变量   参数   代码   方式   方法   系统

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top