文档教程后端【免费下载链接】CodeGuide:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总旨在为大家提供一个清晰详细的学习教程侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助请给予支持(关注、点赞、分享)项目地址https://gitcode.com/gh_mirrors/code/CodeGuide点击查看免费下载本篇是 Lottery 分布式抽奖系统系统运维篇章的第 3 节实战指南。核心目标是在云服务器上借助 Docker 容器化技术安装并配置 Kafka 消息中间件含其依赖的 Zookeeper在 Kafka 后台为抽奖系统创建所需的 Topic 主题并最终在本地程序中完成消息的生产与消费联调测试。读完本文你将掌握从镜像拉取、容器启动、主题创建到 SpringBoot 程序验证的完整 Kafka 部署链路并理解这套 MQ 环境如何在抽奖系统中承担抽奖与发货流程解耦的关键职责。在 Lottery 抽奖系统基于 DDD 领域驱动设计的四层架构实践中Kafka 是连接抽奖与发奖两个领域的关键纽带——抽奖完成后通过 MQ 异步触达奖品发货流程避免流程过长导致用户长时间等待。本部署章节与 Part-2 第 15、16 节的代码实现章节相互呼应所搭建的 Kafka 环境正是为了让这套 MQ 机制真正跑起来。文档原文见 第03节部署环境 Kafka。一、为什么抽奖系统需要 Kafka 消息中间件在动手部署之前先明确这套环境在项目中的定位。Lottery 项目的核心技术栈包含 SpringBoot、MyBatis、Dubbo、MQ、Redis、MySQL、ELK、分库分表等见 Lottery 抽奖系统介绍其中 MQ 选型在项目初期采用 Kafka正如 第15节搭建MQ消息组件Kafka服务环境 中所说明的MQ 消息的使用不非得局限于 Kafka也可以使用 RocketMq但 Kafka 本身具备非常突出的特性可靠性Kafka 是分布式、分区、复制且容错的消息在集群内复制以防止数据丢失可扩展性消息系统可以轻松横向扩展且无需停机耐用性Kafka 使用分布式提交日志commit log消息会尽可能快地持久化到磁盘上性能对于消息的发布和订阅都具有高吞吐量即使存储了大量消息也能保持稳定性能。而 Kafka 在架构上构建在 Zookeeper 同步服务之上因此部署 Kafka 必然要一并部署 Zookeeper——这也是本部署章节第一步先启动 Zookeeper 的原因。Zookeeper 在 Kafka 集群中承担 broker 注册发现、控制器Controller选举、Topic/分区元数据维护等协调职责。在 Lottery 面试技能与问题汇总 中针对为什么使用 MQ 解耦发奖流程给出了清晰的项目答案把抽奖和发奖用 MQ 消息串联起来避免一个流程太长导致用户一直等待。这也正是本章节部署 Kafka 的最终业务价值所在。二、下载 Kafka 与 Zookeeper 镜像在 Docker 容器中安装 Kafka 的第一步是拉取镜像。原文档选用的是wurstmeister组织维护的 Kafka 与 Zookeeper 镜像可以在 Docker Hub 官网镜像市场搜索对应镜像名称获取详细信息。在云服务器终端执行如下两条命令分别拉取 Kafka 与 Zookeeper 镜像docker pull wurstmeister/kafka docker pull wurstmeister/zookeeper部署前提本文以云服务器 Docker 容器为部署环境。在 第01节在云服务器部署 Docker 中已经完成了 Docker 的安装与 Portainer 运维面板的部署。如果你的服务器拉取 Docker Hub 镜像时报错如error response from daemon: Get https://registry-1.docker.io/v2/...可以参考该节中配置registry-mirrors国内镜像加速的daemon.json写法后重启 Docker 再拉取。命令参数说明参数含义pull从 Docker Hub 拉取指定镜像到本地wurstmeister/kafkaKafka 镜像包含 Kafka Server 与配套脚本wurstmeister/zookeeperZookeeper 镜像用于支撑 Kafka 集群协调三、启动 Zookeeper 容器Kafka 依赖 Zookeeper 完成集群元数据管理因此必须先于 Kafka 启动 Zookeeper。原文档给出的启动命令如下docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper命令逐项拆解参数含义-d以守护进程后台方式运行容器容器日志可通过docker logs zookeeper或 Portainer 查看--name zookeeper为容器命名后续管理、停止、删除都可通过该名称操作-p 2181:2181端口映射将容器内 2181 端口映射到宿主机的 2181 端口供 Kafka 与外部客户端访问-t分配一个伪终端TTY便于查看交互式输出wurstmeister/zookeeper使用的镜像名称启动后Zookeeper 的默认监听端口即为 2181客户端连接端口。由于后续 Kafka 容器需要与 Zookeeper 通信且本地程序联调时也可能直接访问 Zookeeper这个端口映射至关重要。注意如果容器间需要互相通信Kafka 容器内访问 Zookeeper 既可以使用宿主机 IP如192.168.x.x:2181也可以让 Kafka 与 Zookeeper 处于同一 Docker 网络--network下通过容器名互访。云服务器部署场景下为了让本地程序能够远程连接还需要确保云厂商安全组中放行 2181、9092 等端口。四、启动 Kafka 容器并完成配置启动 Zookeeper 后即可创建并启动 Kafka 容器。由于 Kafka 容器需要感知集群信息与外部访问地址启动命令中需要注入关键环境变量docker run -d --name kafka \ -p 9092:9092 \ -e KAFKA_BROKER_ID0 \ -e KAFKA_ZOOKEEPER_CONNECT你的云服务器IP:2181 \ -e KAFKA_ADVERTISED_LISTENERSPLAINTEXT://你的云服务器IP:9092 \ -e KAFKA_LISTENERSPLAINTEXT://0.0.0.0:9092 \ wurstmeister/kafka核心环境变量说明环境变量作用KAFKA_BROKER_IDBroker 唯一标识单机部署可设为 0KAFKA_ZOOKEEPER_CONNECT指定 Kafka 连接的 Zookeeper 地址指向上面启动的 Zookeeper 容器宿主机 IP:2181KAFKA_ADVERTISED_LISTENERS对外公布的监听地址必须配置为客户端本地程序能够访问到的 IP否则本地程序会因拿到容器内部地址而连接失败KAFKA_LISTENERSBroker 实际监听的地址0.0.0.0:9092表示监听宿主机所有网卡的 9092 端口启动完成后可以通过 Portainer 运维面板直观地查看 kafka 容器的运行状态与日志例如 Kafka 的 GroupCoordinator消费者组协调器会持续输出消费者组加入、退出等协调日志。下图展示了 Portainer 中 kafka 容器日志页面日志中记录了抽奖系统lottery消费者组成员变化情况这正是后续本地测试程序接入消费后的真实运行痕迹原文档以运维日志形式记录了这一部署环节在 Docker 容器中安装和配置 Kafka 环境、在 Kafka 后台添加抽奖系统需要的 Topic 主题并在本地程序中进行测试。部署到这一步Kafka 环境已经具备承载 Topic 的能力。五、在 Kafka 后台创建抽奖系统需要的 TopicKafka 中的消息以 Topic主题为单位组织生产者向 Topic 写入消息消费者从 Topic 拉取消息。抽奖系统需要为发货单消息创建专属主题。在 第16节使用MQ解耦抽奖发货流程 中明确说明启动 kafka 新增 topiclottery_invoice 用于发货单消息当抽奖完成后则发送一个发货单再异步处理发货流程这个部分就是 MQ 的解耦流程使用。对应 Topic 创建命令如下本地 Kafka 安装包方式启动时的标准写法# 启动 Zookeeper若使用本地安装包而非 Docker bin/zookeeper-server-start.sh -daemon config/zookeeper.properties # 启动 Kafka bin/kafka-server-start.sh -daemon config/server.properties # 创建抽奖系统发货单主题 bin/kafka-topics.sh --create --zookeeper localhost:2181 \ --replication-factor 1 --partitions 1 --topic lottery_invoice参数说明参数含义--create创建新主题--zookeeper localhost:2181指定 Zookeeper 地址主题元数据由 Zookeeper 管理--replication-factor 1副本因子为 1单机部署时无需多副本--partitions 1分区数为 1单机场景下足以支撑抽奖系统的消息收发--topic lottery_invoice主题名称即抽奖发货单消息主题如果 Kafka 运行在 Docker 容器中也可以进入容器执行同样的脚本例如docker exec -it kafka bin/kafka-topics.sh --create \ --zookeeper 你的云服务器IP:2181 \ --replication-factor 1 --partitions 1 --topic lottery_invoice创建完成后可通过bin/kafka-topics.sh --list --zookeeper localhost:2181验证主题是否已存在。六、本地程序测试SpringBoot 整合 Kafka 验证生产与消费环境就绪后需要在本地程序中完成消息的生产与消费联调验证。这一部分对应 第15节搭建MQ消息组件Kafka服务环境 的分支211023_xfg_mq_kafka其核心工作是搭建 Kafka 环境配置消息主题、SpringBoot 整合 Kafka验证消息的生产和消费。1. 配置生产者与消费者在 SpringBoot 工程中引入 Kafka 依赖后主要配置分为三块生产者配置bootstrap.servers指向你的云服务器IP:9092即上文KAFKA_ADVERTISED_LISTENERS中公布的地址key.serializer与value.serializer配置为StringSerializer将消息对象序列化为字符串发送。消费者配置同样指向bootstrap.serverskey.deserializer与value.deserializer配置为StringDeserializergroup.id指定消费者组例如lotteryPortainer 日志中出现的lottery组即来源于此enable.auto.commit决定是否自动提交消费位点。Topic 确认消费者监听lottery_invoice主题收到发货单消息后进入发奖流程处理。2. 验证消息生产与消费本地程序启动后向lottery_invoice主题发送一条消息此时应能在消费者端日志中看到消息被成功接收。同时在 Portainer 的 kafka 容器日志页面中可以看到 GroupCoordinator 输出消费者组的加入与退出记录如前面 3-02 截图所示这是确认本地程序已成功接入 Kafka 集群的最直观证据。常见联调问题与排查方向现象可能原因排查方向生产/消费超时云服务器安全组未放行 9092 端口检查安全组入站规则消费者连不上 BrokerADVERTISED_LISTENERS配成了容器内地址改为云服务器公网可达 IP主题不存在未提前创建lottery_invoice按第五节命令创建主题七、抽奖系统中的 MQ 应用解耦抽奖与发货流程Kafka 环境验证通过后抽奖系统便真正具备了异步解耦能力。在 第16节使用MQ解耦抽奖发货流程 中这套机制在代码层面的落地点包括库表扩展在数据库表user_strategy_export中添加字段mq_state用于标记 MQ 消息是否发送成功——发送成功后更新库表状态若发送失败则通过定时任务补偿 MQ 消息保证消息最终可达。异步发货在ActivityProcessImpl#doDrawProcess活动抽奖流程编排中用户抽奖完成后发送 MQ 消息触达异步奖品发送流程抽奖接口立即返回用户无需等待发奖完成。流程闭环消费者收到lottery_invoice发货单消息后进入奖品发放的处理链路完成从抽奖到发奖的异步闭环。这一设计与 Lottery 面试技能与问题汇总 中的项目问答相互印证解耦抽奖流程把抽奖和发奖用 MQ 消息串联起来避免一个流程太长导致用户一直等待同时面试中还会考察消息丢失怎么办——mq_state状态字段 定时任务补偿正是该项目给出的答案。八、部署验证清单完成本章节部署后建议按以下清单逐项自检docker ps中 zookeeper 与 kafka 两个容器均为 Up 状态Portainer 容器列表可见两个容器kafka 日志无 ERROR 级报错kafka-topics.sh --list可列出lottery_invoice主题本地 SpringBoot 程序向lottery_invoice发送消息消费者端与 Portainer 日志中均有消费记录云服务器安全组已放行 2181Zookeeper与 9092Kafka端口。至此Lottery 抽奖系统的 Kafka 消息中间件环境搭建完成后续的 MQ 解耦发货流程、消息补偿等业务功能均可以在此基础上继续开发与联调。赞分享文档教程后端【免费下载链接】CodeGuide:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总旨在为大家提供一个清晰详细的学习教程侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助请给予支持(关注、点赞、分享)项目地址https://gitcode.com/gh_mirrors/code/CodeGuide点击查看免费下载相关推荐云服务器部署 Docker 实战为 Lottery 抽奖系统搭建容器环境与 Portainer 面板云服务器部署 Docker 实战为 Lottery 抽奖系统搭建容器环境与 Portainer 面板 在 Lottery 抽奖系统基于 DDD 四层架构的分文档教程后端log-lottery抽奖系统技术实现与部署指南log lottery抽奖系统技术实现与部署指南 技术架构解析 log lottery是一个基于现代前端技术栈构建的3D抽奖应用其核心架构采用分层设计理念。前前端桌面应用lottery抽奖系统终极部署指南5步快速搭建活动平台lottery抽奖系统终极部署指南5步快速搭建活动平台 在各类企业活动、年会庆典中如何打造一个既酷炫又高效的抽奖系统一直是活动策划者的痛点。lottery开后端前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
HuggingFace| Carbon静态工程评测:26个文件背后的基因组基础模型“极简主义”革命 HuggingFace| Carbon静态工程评测:26个文件背后的基因组基础模型“极简主义”革命评测快照:huggingface/carbon 10bbc4b
项目定位:HuggingFace开源的生成式基因组基础模型,用非重叠6-mer分词处理DNA序列
数据指标&… · 2026/9/25 20:03:49
Ragent 扩展指南:如何快速接入新模型供应商、检索通道与MCP工具 Ragent 扩展指南:如何快速接入新模型供应商、检索通道与MCP工具 【免费下载链接】ragent 企业级 Agentic RAG 智能体 - 全链路覆盖文档解析、多路检索、意图识别、问题重写、会话记忆、MCP 工具调用与深度思考。面向真实业务场景,从 0 到 1 完整工程实现… · 2026/9/25 20:03:43
微信小程序 image 组件 一、前言
在小程序开发中,图片展示是高频业务场景。很多开发者会遇到图片拉伸变形、图片显示不全、裁剪模式不生效等问题,本质是没有正确使用 image 组件的 mode 属性。
小程序 image 组件一共提供14 种显示模式:
缩放模式(5 种&a… · 2026/9/25 20:03:37
MinIO Java分片上传与断点续传实战:从5MB硬限制到生产级容错 简介:本资源是一套面向Java后端开发者与云存储集成工程师的MinIO高性能文件上传实战示例,聚焦分片上传与断点续传两大核心场景,解决大文件稳定上传、网络中断恢复及服务端资源优化等实际问题。压缩包共13个文件,含7个Java后端类&a… · 2026/9/25 23:39:02
传统机器学习图像分类实战:小样本、低算力、高可解释性方案 简介:本资源是一套面向机器学习初学者与图像处理开发者的实践型工具包,聚焦SVM与贝叶斯算法在图像分类任务中的工程实现,解决传统方法中特征提取、模型训练与效果对比等关键环节的落地难题。压缩包共216个文件,含102幅BMP格式样本… · 2026/9/25 23:37:45
Cygwin下编译运行Varnish Cache实战指南 简介:本资源是专为Windows开发者与系统管理员定制的Cygwin平台Varnish Cache适配方案,解决Varnish在原生Windows环境无法直接运行的核心兼容性问题。项目通过针对性修补源码(含文件路径、网络I/O、线程及信号处理等关键模块)&… · 2026/9/25 23:37:19
MinIO Java分片上传实战:断点续传与高并发优化 简介:本资源是一套面向Java后端开发者与云存储集成工程师的MinIO高性能文件上传实战示例,聚焦分片上传与断点续传两大核心场景,解决大文件稳定上传、网络中断恢复及服务端资源优化等实际问题。压缩包共13个文件,含7个Java类&#… · 2026/9/25 23:37:19
Netdiscover实战:用ARP扫描快速摸清局域网设备 简介:Netdiscover是一款开源的ARP网络扫描工具,主要面向网络管理员与安全测试人员,用于在无线网络或缺乏DHCP的环境中快速发现活跃设备、获取IP与MAC地址并推测网络拓扑。这份源码包为netdiscover-0.3-pre-beta7,共包含39个文件&a… · 2026/9/25 23:37:13
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37