本地通过docker启动了rocketMQ,用springboot项目连上mq的NameServer之后,发消息时提示无法连接Broker。
通过对代码的debug,找到了取Broker地址的代码是在这个位置,后续通过该地址连接的时候,提示无法连接。
对brokerAddr字段进行查看,发现该地址指向172.16.0.XX,利用宿主机去ping该地址确实无法ping通,因为不在一个网络里。
虽然利用docker启动容器,可以在启动的时候配置端口映射,利用127.0.0.1+映射端口的方式直接访问容器,但是在Broker的连接上,是通过NameServer来获取他的地址,并非通过自己的配置。而NameServer提供的是容器网络内的地址,所以导致在拿到Broker的地址后,无法通过宿主机连接。
这里只提供一个macos上我认为比较便利的方法
首先 Mac 端通过 brew 安装 docker-connector
brew install wenjunxiao/brew/docker-connector
然后执行以下命令把 docker 的所有 bridge 网络都添加到路由中
docker network ls --filter driver=bridge --format "{{.ID}}" | xargs docker network inspect --format "route {{range .IPAM.Config}}{{.Subnet}}{{end}}" >> /usr/local/etc/docker-connector.conf
也可以手动修改 /usr/local/etc/docker-connector.conf 文件中的路由,格式是,加上配置后,就可以访问容器ip在这个网络下的容器
route 172.16.0.0/255 ==> route ip/子网掩码
配置完成,直接启动服务(需要 sudo,路由配置启动之后仍然可以修改,并且无需重启服务立即生效)
sudo brew services start docker-connector 启动
sudo brew services restart docker-connector 重启
然后使用以下命令在 docker 端运行 wenjunxiao/mac-docker-connector,需要使用 host 网络,并且允许 NET_ADMIN
docker run -it -d --restart always --net host --cap-add NET_ADMIN --name connector wenjunxiao/mac-docker-connector
version: '2'
services:
namesrv:
image: rocketmqinc/rocketmq
container_name: rocketmq-nameserver
ports:
- 9876:9876
networks:
proxy:
ipv4_address: 172.16.0.86
command: sh mqnamesrv
broker:
image: rocketmqinc/rocketmq
container_name: rocketmq-broker
ports:
- 10909:10909
- 10911:10911
- 10912:10912
networks:
proxy:
ipv4_address: 172.16.0.87
command: sh mqbroker -n namesrv:9876 -c ../conf/broker.conf
depends_on:
- namesrv
environment:
- JAVA_HOME=/usr/lib/jvm/jre
console:
image: styletang/rocketmq-console-ng
container_name: rocketmq-console-ng
ports:
- 8087:8080
networks:
proxy:
ipv4_address: 172.16.0.88
depends_on:
- namesrv
environment:
- JAVA_OPTS= -Dlogging.level.root=info -Drocketmq.namesrv.addr=rmqnamesrv:9876
- Dcom.rocketmq.sendMessageWithVIPChannel=false
dockerconnect:
image: wenjunxiao/mac-docker-connector
container_name: docker-connect
restart: always
cap_add:
- NET_ADMIN
network_mode: host
networks:
proxy:
ipam:
config:
- subnet: 172.16.0.0/24