Nginx代理Kafka集群

背景

项目是需要从生产单位上传数据到集团,由于公司生产环境网络端口个数限制,因此考虑用Nginx代理出Kafka集群。便 于理解,附上系统部署架构图如下:
在这里插入图片描述

动手搞起来

hosts 配置

kafka的监听配置中,用主机名进行配置与IP配置相比好处有以下:
. 1. 弹性扩展

  • 动态节点管理
    当集群需要横向扩展(新增 Broker)时,只需为新节点分配一个主机名并更新 DNS 记录,无需修改 Kafka 配置文件中的 IP 列表。这对云原生环境(如 Kubernetes、AWS EC2)尤其友好。
  • 负载均衡集成:
    主机名可以与负载均衡器(如 Nginx、云厂商的负载均衡服务)结合,自动将流量分发到多个 Broker 节点,提高吞吐量和可用性(主机名可以指向多个IP,实现请求的分发)

2 可读性好
主机名比IP地址更具可读性和可维护性。管理员可以通过修改主机名来轻松管理集群中的节点,而无需记住复杂的IP地址。

3 增强稳定性
主机名相对于IP地址来说更加稳定。 - 主机名相对于IP地址来说更加稳定。即使某个节点的IP地址发生变化(如重启后分配了新的IP),只要主机名不变,集群中的其他节点仍然可以正常通信
配置hosts,通过命令vi /etc/hosts进行配置;

192.168.1.50 kafka1
192.168.1.51 kafka2
192.168.1.52 kafka3

PS: VI 常用小命令
在ESC的情况下:

  • 回到内容起始: gg
  • 全选 :ggVG
  • 复制: ggyG
  • 显示行号:: set number
  • 保存 wq
  • 退出q!

kafka配置

配置如下所示:

listeners=INTERNAL://192.168.1.50:9092,EXTERNAL://kafka1:9090
inter.broker.listener.name=INTERNAL
advertised.listeners=INTERNAL://192.168.1.50:9092,EXTERNAL://kafka1:9090
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
  • listeners
    先看第一个配置项:listeners。这里有两个监听器,INTERNAL和EXTERNAL,分别指向内网的IP和主机名加端口。这说明这个Broker同时监听两个端口,一个给内部网络,另一个给外部。内网使用具体的IP,而外部可能通过主机名解析到不同的IP,比如可能有负载均衡或者不同子网的情况。

  • inter.broker.listener.name
    inter.broker.listener.name=INTERNAL。这应该是指定了Broker之间通信使用的监听器名称。因为Kafka的Broker需要与其他Broker通信来同步元数据和消息,所以这里设置成INTERNAL,意味着它们会使用内网的监听器地址进行通信。通常内网监听器的地址应该是可靠的,不会变化,适合服务间通信。

  • advertised.listeners
    这里同样配置了INTERNAL和EXTERNAL。广告监听器是告诉客户端这个Broker的地址,客户端会根据自己所在的监听器类型来连接。比如,内部客户端可能会连接到INTERNAL的地址,而外部客户端则连接到EXTERNAL的。注意这里的EXTERNAL用的是主机名kafka1,可能需要DNS解析或者负载均衡来指向正确的IP

  • listener.security.protocol.map
    INTERNAL和EXTERNAL监听器都映射到PLAINTEXT协议。这意味着这两个监听器都不加密通信,适用于测试环境,但在生产环境中应该使用SSL或SASL等安全协议 。

总结一下:
用户可能的疑问包括:为什么需要两个监听器?如何区分内部和外部客户端?安全协议的选择有什么影响?另外,用户可能在配置过程中遇到了连接问题,比如客户端无法正确连接到EXTERNAL监听器,或者Broker之间的通信失败。需要确保DNS配置正确,防火墙开放相应端口,并且安全协议配置与客户端匹配。
还需要提醒用户,如果EXTERNAL使用主机名,要确保该主机名在客户端能够正确解析到对应的IP地址。此外,在配置多个监听器时,要注意端口不要冲突,并检查Kafka的日志是否有相关错误信息。对于生产环境,建议启用安全协议,避免数据泄漏。

还需要提醒一下,如果EXTERNAL使用主机名,要确保该主机名在客户端能够正确解析到对应的IP地址。此外,在配置多个监听器时,要注意端口不要冲突,并检查Kafka的日志是否有相关错误信息。对于生产环境,建议启用安全协议,避免数据泄露或中间人攻击。

配置效果总结

场景客户端连接地址实际通信端口安全协议
内部 Broker 通信INTERNAL://192.168.1.50:90929092 (内网 IP)PLAINTEXT
外部客户端访问EXTERNAL://kafka1:9090解析后的 IP:9090PLAINTEXT

注意事项

  1. DNS 解析
    • 外网客户端需能通过 kafka1 主机名解析到正确的 IP 地址。
    • 建议在生产环境中使用负载均衡器(如 Nginx)或云服务(如 AWS ELB)绑定 kafka1 名称。

  2. 防火墙规则
    • 开放内网端口 9092 和外网端口 9090(根据实际安全需求调整)。

  3. 安全性
    PLAINTEXT 协议不加密数据,建议仅在测试环境中使用。
    • 生产环境中必须启用安全协议(如 SSL/TLS 或 SASL)。

  4. 配置一致性
    listenersinter.broker.listener.nameadvertised.listeners 需保持一致,否则会导致连接失败。


典型应用场景

混合网络架构:内网 Broker 通过固定 IP 互联,外网客户端通过域名访问。
隔离测试环境:内网开发/测试使用 IP,外网生产环境通过域名暴露服务。
负载均衡集成:外网监听器绑定到负载均衡器,隐藏 Broker 实际节点信息。

如果有具体问题(如连接报错),可以结合日志和网络工具(如 digtelnet)进一步排查。

Nginx配置

假设nginx布在了60服务器上,首先也是需要配置hosts文件,解析kafka主机名的

192.168.1.50 kafka1
192.168.1.51 kafka2
192.168.1.52 kafka3
#以下配置kafka 映射
stream{upstream kafka{server kafka1:9090;server kafka2:9090;server kafka3:9090;}server{listen 9090;proxy_pass kafka;}#以下是模拟了两层Nginx代理,即再用一台Nginx将9090的Nginx代理出来。比较简单,就不赘述了server{listen 8090;proxy_pass 192.168.1.60:9090;}

配置好Nginx要重启,reload不生效~~~,要重启~~重启

测试

通过kafka命令进行生产、消费测试即可
生产者写数据

kafka-console-producer.sh --bootstrap-server 192.168.1.60:9090 --topic tesstByZl

消费者读数据

kafka-console-consumer.sh --bootstrap-server 192.168.1.60:9090 --topic tesstByZl

自己测试下吧,下班

相关新闻

2025-03-04 学习记录--C/C++-PTA 练习5-3 字符金字塔

2025-03-04 学习记录--C/C++-PTA 练习5-3 字符金字塔

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 二、解题步骤 ⭐️ 第1步、把字符和一个空格看作整体,即"G_"; 第2步、外…

2026/7/16 3:46:13 阅读更多 →
一、Prometheus架构

一、Prometheus架构

Prometheus 云原生十二要素是一套最佳实践和规范,旨在帮助开发人员更好地构建云原生应用 这十二个要素分别是: 单一职责独立部署无状态声明式API服务发现容错处理自适应算法自动化运维响应式编程通信协议服务注册与发现数据持久化一、Prometheus 是什么 Prometheus 是一个…

2026/7/17 20:24:32 阅读更多 →
深入理解动态绑定与多态

深入理解动态绑定与多态

动态绑定介绍 Java中的动态绑定,是一种在程序运行时确定方法执行版本的过程。它与多态紧密联系。 在Java中,动态绑定通常发生在以下情况: 方法覆盖:当子类重写父类的一个方法时,调用该方法的行为会根据对象的实际类…

2026/7/17 10:35:42 阅读更多 →
贝叶斯优化调优Word2Vec提升音乐推荐效果

贝叶斯优化调优Word2Vec提升音乐推荐效果

1. 项目概述:为什么音乐推荐需要“调参老手”而不是“暴力穷举”Word2Vec不是新东西,但把它用在音乐推荐上,很多人第一反应还是——“直接跑个skip-gram,向量一抽,余弦相似度一算,完事”。我试过&#xff0…

2026/7/19 19:57:48 阅读更多 →
Python密码安全与流程控制实战技巧

Python密码安全与流程控制实战技巧

1. Python密码安全与流程控制实战指南作为一门广泛应用于自动化脚本、Web开发和数据分析的编程语言,Python在用户认证和流程控制方面有着丰富的应用场景。本文将深入探讨密码加密存储的实现方式,以及if-else条件判断、while和for循环等核心控制结构的实战…

2026/7/19 19:57:48 阅读更多 →
《我的世界》整合包开发指南:从环境搭建到模组兼容性实战

《我的世界》整合包开发指南:从环境搭建到模组兼容性实战

在游戏模组开发领域,整合包(Modpack)是提升玩家体验的重要方式,它将多个模组、资源包、配置文件和脚本有机组合,形成一个统一、稳定的游戏环境。《我的世界》作为全球最受欢迎的沙盒游戏之一,其模组生态极为…

2026/7/19 19:57:48 阅读更多 →
5个生产级机器学习自动化脚本:轻量MLOps落地实践

5个生产级机器学习自动化脚本:轻量MLOps落地实践

1. 项目概述:这5个脚本不是“玩具”,而是我每天在产线里真正在用的自动化杠杆 “5 Killer Machine Learning Automation Scripts”——这个标题乍看像极了那些标题党技术博客里常见的“速成秘籍”,但如果你真把它当成了五段可复制粘贴的代码&…

2026/7/19 19:57:48 阅读更多 →
OMAP34xx硬件可观测性:从寄存器配置到信号捕获的嵌入式调试实战

OMAP34xx硬件可观测性:从寄存器配置到信号捕获的嵌入式调试实战

1. 项目概述:为什么我们需要硬件可观测性? 在嵌入式系统开发,尤其是像TI OMAP34xx这类复杂的多核、多域(Domain)应用处理器上,最让人头疼的往往不是写代码,而是当系统行为异常时,你根…

2026/7/19 19:57:48 阅读更多 →
Android JNI开发实战:跨语言交互与性能优化

Android JNI开发实战:跨语言交互与性能优化

1. JNI技术全景解析:跨语言交互的桥梁 在Android开发领域,JNI(Java Native Interface)就像一位精通多国语言的翻译官,它让Java和C/C这两种原本"语言不通"的编程体系能够流畅对话。我最早接触JNI是在2014年一…

2026/7/19 19:56:08 阅读更多 →
鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析 前言 Emoji Idiom Guess 是一个基于鸿蒙 ArkTS 编写的单页互动应用,核心围绕 表情线索、答案输入、首字母提示和收藏关卡 展开。项目没有依赖复杂服务端,也没有把逻辑…

2026/7/19 0:00:03 阅读更多 →
Unity与Python本地通信:基于Flask的跨语言数据交换实战

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/19 0:00:04 阅读更多 →
科研课题设计全流程:从选题到成果落地的实战指南

科研课题设计全流程:从选题到成果落地的实战指南

1. 课题设计全流程解析:从选题到成果落地的实战指南课题设计是科研工作者、高校师生以及企业研发人员日常工作中的核心环节。一个优秀的课题设计不仅决定了研究的方向和质量,更直接影响最终成果的学术价值和应用前景。作为在科研一线摸爬滚打多年的从业者…

2026/7/19 0:00:04 阅读更多 →
鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析 前言 Emoji Idiom Guess 是一个基于鸿蒙 ArkTS 编写的单页互动应用,核心围绕 表情线索、答案输入、首字母提示和收藏关卡 展开。项目没有依赖复杂服务端,也没有把逻辑…

2026/7/19 0:00:03 阅读更多 →
Unity与Python本地通信:基于Flask的跨语言数据交换实战

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/19 0:00:04 阅读更多 →
科研课题设计全流程:从选题到成果落地的实战指南

科研课题设计全流程:从选题到成果落地的实战指南

1. 课题设计全流程解析:从选题到成果落地的实战指南课题设计是科研工作者、高校师生以及企业研发人员日常工作中的核心环节。一个优秀的课题设计不仅决定了研究的方向和质量,更直接影响最终成果的学术价值和应用前景。作为在科研一线摸爬滚打多年的从业者…

2026/7/19 0:00:04 阅读更多 →
ai agent框架spring ai/alibaba 源码原理分析(六) agent和组件

ai agent框架spring ai/alibaba 源码原理分析(六) agent和组件

简介 saa是java的ai agent框架,本系列将深入剖析 Spring AI Alibaba 的源码实现与核心原理,不仅可以指导agent的开发,更可以改造框架,增加新特性 系列内容: 系列(一) 架构 完成 系列(三) 调用 I 工具 完成 II M…

2026/7/19 0:01:20 阅读更多 →
终极指南:如何用Steam-auto-crack实现Steam游戏自动破解

终极指南:如何用Steam-auto-crack实现Steam游戏自动破解

终极指南:如何用Steam-auto-crack实现Steam游戏自动破解 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack Steam-auto-crack是一款功能强大的Steam游戏自动破解工具&#xff…

2026/7/19 9:10:31 阅读更多 →
移动端游戏功耗测试实战:电流、功率、亮度和场景对比

移动端游戏功耗测试实战:电流、功率、亮度和场景对比

移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…

2026/7/19 19:29:48 阅读更多 →