Minishift中Spring Boot无法向Strimzi Kafka集群发送消息
问题根因
该连接故障由三个配置错误共同导致:
- 监听器暴露方式与访问地址不匹配
你当前配置的两个Kafka监听器均为internal类型,该类型监听器只会在OpenShift集群内部生成ClusterIP类型Service,仅支持集群内通过内部DNS域名访问,不会自动创建OpenShift Route对外暴露。你使用的*.nip.io是OpenShift Router的默认泛域名,Router默认仅转发80/443端口的HTTP/HTTPS流量,9092端口的Kafka原生TCP流量没有对应的转发规则,连接必然失败。 - 连接地址格式错误
Kafka使用自定义TCP二进制协议通信,bootstrap.servers配置不需要加http://前缀,错误添加前缀会导致客户端地址解析异常。 - 客户端与服务端版本不兼容
你使用的Spring Kafka 3.1.1内置Kafka客户端版本为3.1.1,按照Kafka官方版本兼容规则,客户端与服务端大版本差不能超过1,3.x版本客户端对接2.7.0版本服务端跨2个大版本,存在API不兼容问题,即便网络连通也会出现请求异常。
排查解决步骤
- 同项目内访问场景修正
由于你的Spring Boot应用和Kafka集群部署在同一个OpenShift项目下,不需要走外部Route访问,直接将bootstrap.servers配置修改为my-cluster-kafka-bootstrap:9092,删除原有地址的http://前缀和nip.io后缀,同命名空间下短域名可直接解析到Kafka内部Service。 - 集群外访问场景修正
如果需要从OpenShift集群外部访问Kafka,需要在Kafka自定义资源中新增route类型的外部监听器,配置参考如下:
等待Strimzi Operator完成调谐、自动创建好对应Route后,使用Route生成的访问地址作为listeners: - name: plain port: 9092 type: internal tls: false - name: tls port: 9093 type: internal tls: true - name: external port: 9094 type: route tls: falsebootstrap.servers值,同样不要添加http://前缀。 - 版本兼容问题修正
二选一调整即可:- 将Spring Kafka版本降级到2.8.x系列,该版本内置Kafka 2.8.x客户端,可兼容2.7.0版本服务端
- 将Strimzi管理的Kafka服务端版本升级到3.1.x,与现有客户端版本匹配
- 连通性校验
配置修改完成后,先在Spring Boot应用所在Pod内执行端口连通性测试:
确认端口连通后再启动应用,观察是否还存在连接断开报错。nc -zv my-cluster-kafka-bootstrap 9092
内容的提问来源于stack exchange,提问作者iperezmel78
相关产品推荐
相关产品推荐

