springCloud 微服务集成mqtt,启动之后一直打印异常消息

环境

  • EMQX 版本:5.7.2
  • 操作系统版本:centos 7.9

重现此问题的步骤

Docker 部署微服务和emqx集群,emqx集群通过nginx进行负载均衡,emqx管理后台和集群状态正常,并且通过MQTTX工具能够正常连接到emqx,但是微服务日志一直打印报错
错误信息: [ scheduling-1] .m.i.MqttPahoMessageDrivenChannelAdapter : Error connecting or subscribing to [default/#]

org.eclipse.paho.client.mqttv3.MqttException: MqttException
at org.eclipse.paho.client.mqttv3.internal.wire.MqttWireMessage.decodeUTF8(MqttWireMessage.java:369) ~[org.eclipse.paho.client.mqttv3-1.2.5.jar!/:na]
at org.eclipse.paho.client.mqttv3.internal.wire.MqttConnect.(MqttConnect.java:61) ~[org.eclipse.paho.client.mqttv3-1.2.5.jar!/:na]
at org.eclipse.paho.client.mqttv3.internal.wire.MqttWireMessage.createWireMessage(MqttWireMessage.java:205) ~[org.eclipse.paho.client.mqttv3-1.2.5.jar!/:na]
at org.eclipse.paho.client.mqttv3.internal.wire.MqttWireMessage.createWireMessage(MqttWireMessage.java:182) ~[org.eclipse.paho.client.mqttv3-1.2.5.jar!/:na]
at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMessage(MqttInputStream.java:119) ~[org.eclipse.paho.client.mqttv3-1.2.5.jar!/:na]
at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:137) ~[org.eclipse.paho.client.mqttv3-1.2.5.jar!/:na]
at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_312]
Caused by: java.io.EOFException: null
at java.io.DataInputStream.readFully(DataInputStream.java:197) ~[na:1.8.0_312]
at java.io.DataInputStream.readFully(DataInputStream.java:169) ~[na:1.8.0_312]
at org.eclipse.paho.client.mqttv3.internal.wire.MqttWireMessage.decodeUTF8(MqttWireMessage.java:363) ~[org.eclipse.paho.client.mqttv3-1.2.5.jar!/:na]
… 6 common frames omitted

emqx配置:
emqx:

是否启用emqx消息推送

open: true
config:
# 认证配置
auth:
# 是否开启密码jwt认证,默认false
openJWT: true
# Secret是否使用 Base64 编码,默认false
openBase64: true
# 签名 当使用Base64编码,则使用base64编码的字符串(和服务配置一致)
secret: XXXXX
# API配置 Basic认证
api:
# 认证名
apiKey: XXXXXX
# 认证密码
secretKey: XXXXXX
# api接口地址 http://ip:port/api/v5
apiUrl: http://XXXX-nginx:18083/api/v5/
# 客户端配置
client:
# 账号&密码为选填字段,可不填
username: admin
password: XXXXX
# tcp连接地址
url: tcp://XXXXX:8883
# 订阅主题
subTopic: default/#
# 消息传递质量:
# QoS 0:最多一次,即<=1。这个级别的消息可能会被传递多次,或者可能根本不会被传递。这种级别适用于对数据要求不高的情况,丢几个数据影响不大的项目。
# QoS 1:至少一次,即>=1。这个级别的消息至少会被传递一次,但如果设备在传递消息时出现故障,消息可能会被重发。这种级别适用于一些对消息传递可靠性要求较高的场景,但会增加网络传输的开销和延迟。
# QoS 2:一次,即=1。这个级别的消息只会被传递一次,而且保证了消息的顺序性。在这个级别下,消息代理会进行两阶段的握手确认。只有在收到最终确认后,消息代理才会认为消息传递完成。QoS 2级别提供了最高的可靠性,但相应地增加了更多的网络开销和延迟。
qos: 0
# 默认qos(发布端)
defaultQos: 0
# 默认主题(发布端)
defaultTopic: default
# 多线程配置
executor:
# 是否使用线程池接受入站消息
isOpen: true
# 核心线程数
corePoolSize: 8
# 最大线程数
maxPoolSize: 16
# 等待队列
queueCapacity: 9999
# 自定义线程前缀
thread-name-prefix: emqx-executor-
# 拓展配置
expand:
# 批量获取客户端状态线程池固定线程数(默认5)
getStatusThreadsNum: 5

emqx日志:
2025-03-27T16:55:50.641848+08:00 [notice] TLS server: In state hello at tls_record.erl:561 generated SERVER ALERT: Fatal - Unexpected Message, - {unsupported_record_type,16}
2025-03-27T16:55:50.642519+08:00 [notice] supervisor: {esockd_connection_sup,<0.19192.0>}, errorContext: ssl_error, reason: {tls_alert,{unexpected_message,“TLS server: In state hello at tls_record.erl:561 generated SERVER ALERT: Fatal - Unexpected Message\n {unsupported_record_type,16}”}}, offender: [{pid,<0.19192.0>},{name,connection},{mfargs,{emqx_connection,start_link,[#{listener => {ssl,default},limiter => #{connection => #{initial => 0,rate => infinity,burst => 0}},zone => default,enable_authn => true}]}}]
2025-03-27T16:55:53.076668+08:00 [notice] TLS server: In state hello at tls_record.erl:561 generated SERVER ALERT: Fatal - Unexpected Message, - {unsupported_record_type,16}
2025-03-27T16:55:53.077302+08:00 [notice] supervisor: {esockd_connection_sup,<0.19197.0>}, errorContext: ssl_error, reason: {tls_alert,{unexpected_message,“TLS server: In state hello at tls_record.erl:561 generated SERVER ALERT: Fatal - Unexpected Message\n {unsupported_record_type,16}”}}, offender: [{pid,<0.19197.0>},{name,connection},{mfargs,{emqx_connection,start_link,[#{listener => {ssl,default},limiter => #{connection => #{initial => 0,rate => infinity,burst => 0}},zone => default,enable_authn => true}]}}]
2025-03-27T16:55:53.379559+08:00 [notice] TLS server: In state hello at tls_record.erl:561 generated SERVER ALERT: Fatal - Unexpected Message, - {unsupported_record_type,16}
2025-03-27T16:55:53.380108+08:00 [notice] supervisor: {esockd_connection_sup,<0.19202.0>}, errorContext: ssl_error, reason: {tls_alert,{unexpected_message,“TLS server: In state hello at tls_record.erl:561 generated SERVER ALERT: Fatal - Unexpected Message\n {unsupported_record_type,16}”}}, offender: [{pid,<0.19202.0>},{name,connection},{mfargs,{emqx_connection,start_link,[#{listener => {ssl,default},limiter => #{connection => #{initial => 0,rate => infinity,burst => 0}},zone => default,enable_authn => true}]}}]

不好意思,我不会 java,但是你这里的 8883 不是 tcp 的。他是 tls 的。
emqx 的日志也是在警告这个信息。
如果是想使用 tcp(我看你并没有配置 tls 证书相关的东西),那你得使用 1883 端口。这才是 tcp

这个是因为emqx内部使用的http端口(1883、8083)通信,nginx负责https的安全连接,监听的8883和8084,现在知道是因为docker环境下微服务启动加载emqx配置使用的是docker 服务名,识别不了

不好意思,我没明白。
不过EMQX 内部使用的 http 端口应该是 18083,不是 1883 和 8083.

你找到原因就好 :heart:,虽然我还是不知道什么导致的