Don*_*mmy 5 java apache-kafka docker spring-boot spring-kafka
我通过以下方式在本地运行 kafka:
docker-compose.yml
zookeeper:
image: 'bitnami/zookeeper:latest'
ports:
- 2181:2181
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
kafka:
image: 'bitnami/kafka:latest'
ports:
- 9092:9092
environment:
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_ADVERTISED_PORT=9092
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
Run Code Online (Sandbox Code Playgroud)
我的 Spring Boot 应用程序运行:
应用程序.yml:
spring:
application:
name: testkafka
kafka:
bootstrap-servers: localhost:9092
server:
port: 8080
Run Code Online (Sandbox Code Playgroud)
当我运行它并尝试发送到 kafka 上的主题时,我得到:
org.springframework.kafka.KafkaException: Reply timed out
at org.springframework.kafka.requestreply.ReplyingKafkaTemplate.lambda$sendAndReceive$0(ReplyingKafkaTemplate.java:196) ~[spring-kafka-2.1.10.RELEASE.jar:2.1.10.RELEASE]
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE]
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[na:na]
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264) ~[na:na]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java) ~[na:na]
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Run Code Online (Sandbox Code Playgroud)
如果我从 docker 容器内部运行 spring boot(使用一个 docker compose 文件),那么它确实可以工作:
在同一个 Compose 中运行两者:
version: "3.0"
services:
service1:
build: ./Service
ports:
- 8080:8080
- 5005:5005
links:
- zookeeper
- kafka
zookeeper:
image: 'bitnami/zookeeper:latest'
ports:
- 2181:2181
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
kafka:
image: 'bitnami/kafka:latest'
ports:
- 9092:9092
environment:
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_ADVERTISED_PORT=9092
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
Run Code Online (Sandbox Code Playgroud)
如何让 kafka 容器允许来自外部/docker 的连接?
编辑:尝试了这些更改:
kafka:
image: 'bitnami/kafka:latest'
ports:
- 9092:9092
environment:
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_ADVERTISED_PORT=9092
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092
Run Code Online (Sandbox Code Playgroud)
和:
spring:
application:
name: testkafka
kafka:
bootstrap-servers: kafka:9092
server:
port: 8080
Run Code Online (Sandbox Code Playgroud)
这仍然超时
如果我从 docker 容器内运行 spring boot(使用一个 docker compose 文件),那么它确实可以工作
实际上,它不应该起作用。Kafka 不作为应用程序的一部分运行,因此本节不指向 Kafka 容器。
kafka:
bootstrap-servers: localhost:9092
Run Code Online (Sandbox Code Playgroud)
它需要kafka:9092在 Docker 网络内。
而且
bootstrap-servers: kafka:9092……还是超时
那是因为你还有 KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
在 Docker 网络内部和外部,通过指定KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092,您是说您的客户端将 Kafka 引导程序连接接收为localhost:9092,这只能在 Docker 网络外部工作,因为您已经进行了端口转发并且您的容器在本地主机上运行,然而,多克尔网络内部,如前所述,本地主机就意味着是应用程序容器,而不是经纪人。
解决方案是通过该属性创建两个端口映射,正如这篇博客文章中详细讨论的那样
此外,Confluent 提供了一个完全配置的 Docker Compose,其中包含适用于 Docker 内部和外部的适当映射
kafka:
bootstrap-servers: localhost:9092
Run Code Online (Sandbox Code Playgroud)
对于 Docker 网络内的应用程序,使用kafka:9092,对于外部应用程序,使用localhost:29092
编辑bitnami 配置变量已更改。请参阅自述文件的这一部分
| 归档时间: |
|
| 查看次数: |
4315 次 |
| 最近记录: |