Xuchengen / rocketmq-docker-build

RocketMQ Docker Build
34 stars 11 forks source link

Windows Docker 部署能够连接上,但是推送消息timeout #4

Open huazaihuola opened 1 year ago

huazaihuola commented 1 year ago

环境:windows11、docker 部署rocketmq 异常:springboot 连接 rocketmq 没有问题,并获取到内网,并能够ping通docker内网:172.0.1.3:10911 但是生产者在创建消息并推送的时候超时。 异常现象是:连接超时,重试3次依旧失败。 查找原因过程是:通过console 页面找到cluster 地址是:172.0.1.3:10911 ,看网上帖子说,这块应该是对应的外网ip, 也就是应该是我当前windows 的ip地址,应该是192.168.3.2 , 所以想着修改这个,于是通过启动命令去修改对应的broker.conf 新增: brokerIP1: 192.168.3.2 namesrvAddr=192.168.3.2:9876 发现不能生效,原因是发现你的启动命令最后是运行一个 用户环境下的. CMD ["/bin/sh" "-c" "${USER_HOME}/.run.sh"] 于是找到对应的 .run.sh 但是这个文件是隐藏的,发现其中并没有 使用配置文件broker.conf 作为配置去启动 nohup $ROCKETMQ_HOME/bin/mqbroker -n localhost:9876 > /dev/null 2>&1 & 于是在你的命令里补充了,使用配置文件启动的命令 nohup $ROCKETMQ_HOME/bin/mqbroker -n localhost:9876 -c $ROCKETMQ_HOME/conf/broker.conf > /dev/null 2>&1 &

于是再次重启rocketmq , 然后能够正常,推送消息,并消费消息了。

以上是定位和发现的问题,希望对作者有启发。

AFatMan commented 1 year ago

这里的brokerIP1: 192.168.3.2 应该是brokerIP1=192.168.3.2吧?

beiming-org commented 1 year ago

我在ubuntu环境也遇到了同样的问题,我把版主的:换成 = 也是一样不能使用

wtjperi2003 commented 1 year ago

同样问题,依照版主方法搞定了

flyed commented 1 year ago

再描述中已经说出这个问题的解决方法”--net=host“可以看下启动参数是不是少了这个参数。

90uncle commented 1 year ago

host模式确实不存在无法连接问题,配置文件也确实没有加载,broker.conf里的设置不会生效

hitori-Janai commented 1 year ago

我用wsl的docker,添加--net=host 就不能用了,参考描述修改broker.conf brokerIP1: 127.0.0.1也可以。

andamiao commented 1 year ago

用了版主的办法解决了,确实.run.sh没有加载配置文件

jjcc123312 commented 1 year ago

如果不想更改run.sh文件后重新打镜像,可以挂载/home/app文件夹,在映射文件中修改完成run.sh文件后重启容器即可 docker run -itd --name=rocketmq -p 8080:8080 -p 9876:9876 -p 10909:10909 -p 10911:10911 -p 10912:10912 -v rocketmq_data:/home/app/data -v /etc/localtime:/etc/localtime -v /var/run/docker.sock:/var/run/docker.sock -v rocketmq_sh:/home/app --net=rocketmq xuchengen/rocketmq:latest

wpjCode commented 11 months ago

贡献一段自己写的shell小脚本吧,提供题主的思路,参数的自己修改即可

#!/bin/bash
# 参数:console端口
vport=9990
# 参数:java程序连接端口
mainPort=9876
# 参数:java程序连接IP
mainIp=127.0.0.1

cId=$(
    docker run -e NAMESRV_XMS=128m -e NAMESRV_XMX=128m -e NAMESRV_XMN=128m \
    -e BROKER_XMS=128m -e BROKER_XMX=128m -e BROKER_XMN=128m -e BROKER_MDM=128m \
    -e NAMESRV_ADDR=$mainIp:$mainPort \
    -itd --hostname rocketmq --restart=always \
    -p $vport:8080 -p $mainPort:$mainPort -p 10909:10909 -p 10911:10911 -p 10912:10912 \
    --name rocketmq xuchengen/rocketmq:latest
)
docker exec -it $cId /bin/bash -c "sed -i 's/localhost:9876/$mainIp:$mainPort \-c \$ROCKETMQ_HOME\/conf\/broker.conf /g' .run.sh"
docker exec -it $cId /bin/bash -c "echo \"namesrvAddr=$mainIp:$mainPort\" >> \$ROCKETMQ_HOME/conf/broker.conf"
docker exec -it $cId /bin/bash -c "echo \"brokerIP1=$mainIp\" >> /home/app/rocketmq/conf/broker.conf"
docker restart $cId
2300787046 commented 7 months ago

需要修改两处才可以使用jdk连接。

  1. 看源码中作者获取地址时候使用的localhost,默认情况下是用了容器的内部地址,jdk连接的是宿主机的地址。解决方法就是创建容器的时候用 @wpjCode 提供的脚本并且打开8081端口(代理默认端口 ) 即可。
  2. rocketmq 5.0之后需要使用代理连接,mqbroker 启动时候添加参数 即可。
easyfrog commented 7 months ago

需要修改两处才可以使用jdk连接。

  1. 看源码中作者获取地址时候使用的localhost,默认情况下是用了容器的内部地址,jdk连接的是宿主机的地址。解决方法就是创建容器的时候用 @wpjCode 提供的脚本并且打开8081端口(代理默认端口 ) 即可。
  2. rocketmq 5.0之后需要使用代理连接,mqbroker 启动时候添加参数 即可。

我这边使用 rocketmq-client-nodejs Consumer 连接, 报下面这个错误,是什么原因呢?

[class SimpleConsumer extends Consumer]
runGroupIndex ERROR: Error: Startup the rocketmq client failed, clientId=d1c7d477527b@29@14@lubgqg2n, error=Error: 1 CANCELLED: Call cancelled
    at SimpleConsumer.startup (/usr/rest-server/node_modules/rocketmq-client-nodejs/dist/client/BaseClient.js:83:25)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async run (eval at getApiHandlerFuncObject (/usr/rest-server/src/utils/utils.js:101:21), <anonymous>:194:9)
    at async eval (eval at getApiHandlerFuncObject (/usr/rest-server/src/utils/utils.js:101:21), <anonymous>:208:5)
    at async runGroupIndex (/usr/rest-server/src/routes/index.js:95:13) {
  cause: Error: 1 CANCELLED: Call cancelled
      at callErrorFromStatus (/usr/rest-server/node_modules/@grpc/grpc-js/build/src/call.js:31:19)
      at Object.onReceiveStatus (/usr/rest-server/node_modules/@grpc/grpc-js/build/src/client.js:192:76)
      at Object.onReceiveStatus (/usr/rest-server/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:360:141)
      at Object.onReceiveStatus (/usr/rest-server/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:323:181)
      at /usr/rest-server/node_modules/@grpc/grpc-js/build/src/resolving-call.js:99:78
      at process.processTicksAndRejections (node:internal/process/task_queues:77:11)
  for call at
      at ServiceClientImpl.makeUnaryRequest (/usr/rest-server/node_modules/@grpc/grpc-js/build/src/client.js:160:32)
      at ServiceClientImpl.queryRoute (/usr/rest-server/node_modules/@grpc/grpc-js/build/src/make-client.js:105:19)
      at /usr/rest-server/node_modules/rocketmq-client-nodejs/dist/client/RpcClient.js:54:20
      at new Promise (<anonymous>)
      at RpcClient.queryRoute (/usr/rest-server/node_modules/rocketmq-client-nodejs/dist/client/RpcClient.js:53:16)
      at RpcClientManager.queryRoute (/usr/rest-server/node_modules/rocketmq-client-nodejs/dist/client/RpcClientManager.js:66:32)
      at #fetchTopicRoute (/usr/rest-server/node_modules/rocketmq-client-nodejs/dist/client/BaseClient.js:178:54)
      at SimpleConsumer.updateRoutes (/usr/rest-server/node_modules/rocketmq-client-nodejs/dist/client/BaseClient.js:163:40)
      at #startup (/usr/rest-server/node_modules/rocketmq-client-nodejs/dist/client/BaseClient.js:92:20)
      at SimpleConsumer.startup (/usr/rest-server/node_modules/rocketmq-client-nodejs/dist/client/BaseClient.js:80:32) {
    code: 1,
    details: 'Call cancelled',
    metadata: Metadata { internalRepr: Map(0) {}, options: {} }
  }
}
qinqoushui commented 3 days ago

找通义写了一段脚本,让用户执行一次

#!/bin/bash

# 获取当前主机的所有 IP 地址
get_all_ip_addresses() {
    # 使用 hostname -I 命令获取所有 IP 地址
    ip_addresses=$(hostname -I)

    if [ -z "$ip_addresses" ]; then
        echo "无法获取任何 IP 地址"
        exit 1
    fi

    echo $ip_addresses
}

# 获取所有 IP 地址
all_ips=$(get_all_ip_addresses)

# 将 IP 地址列表分割成数组
IFS=' ' read -r -a ip_array <<< "$all_ips"

# 输出所有 IP 地址供用户选择
echo "请选择一个 IP 地址:"
for i in "${!ip_array[@]}"; do
    echo "$((i+1)): ${ip_array[$i]}"
done

# 读取用户选择
read -p "请输入选择的编号: " choice

# 检查用户输入是否有效
if [[ $choice =~ ^[0-9]+$ ]] && [ $choice -ge 1 ] && [ $choice -le ${#ip_array[@]} ]; then
    mainIp=${ip_array[$((choice-1))]}
else
    echo "无效的选择"
    exit 1
fi

echo "当前IP${mainIp}"
# 在此由用户确认是否继续 

# 设置默认的 Name Server 端口
mainPort=9876

# 设置 broker.conf 文件的路径
broker_conf_path="/home/patrol/rocketmq/data/rocketmq/conf/broker.conf"

# 检查 broker.conf 文件是否存在
if [ ! -f "$broker_conf_path" ]; then
    echo "broker.conf 文件不存在,请检查路径是否正确"
    exit 1
fi

# 修改 broker.conf 文件
sed -i "s/^brokerIP1=.*/brokerIP1=$mainIp/" $broker_conf_path
sed -i "s/^namesrvAddr=.*/namesrvAddr=$mainIp:$mainPort/" $broker_conf_path

# 输出修改后的配置文件内容
cat $broker_conf_path

echo "broker.conf 文件已成功修改,新的配置如下:"
echo "brokerIP1=$mainIp"
echo "namesrvAddr=$mainIp:$mainPort"

cId="rocketmq"
# 重启 RocketMQ 容器(如果有)
if [ -n "$cId" ]; then
    docker restart $cId
    echo "RocketMQ 容器已重启"
else
    echo "未提供容器 ID,跳过重启步骤"
fi