Spring boot 获得;经纪人可能不在”;spring引导容器尝试连接kafka容器时出错
我在spring boot kafka docker上遇到了问题,尝试了下面链接中提到的所有方法,但问题仍然存在 附加我的docker-compose.ymlSpring boot 获得;经纪人可能不在”;spring引导容器尝试连接kafka容器时出错,spring-boot,docker,apache-kafka,Spring Boot,Docker,Apache Kafka,我在spring boot kafka docker上遇到了问题,尝试了下面链接中提到的所有方法,但问题仍然存在 附加我的docker-compose.yml version: '2' services: zookeeper: image: wurstmeister/zookeeper container_name: zookeeper ports: - "2181:2181" kafka: image: wurstmeist
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
container_name: kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
my-app:
image: my-app
container_name: my-app
ports:
- "8081:8081"
depends_on:
- zookeeper
- kafka
错误日志
-1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.
my-app | 2020-11-03 08:10:21.444 WARN 1 --- [| adminclient-1] org.apache.kafka.clients.NetworkClient : [AdminClient clientId=adminclient-1] Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.
我正在运行wrustmiester/kafka和wrustmiester/zookeeper。
如果我在本地运行spring boot应用程序,一切都会顺利运行。当我尝试构建spring boot应用程序的映像并运行该映像时,问题就出现了。则错误是代理可能不可用。
如果有人能给我指路,请告诉我 添加我的应用程序.yml
spring:
kafka:
consumer:
bootstrap-servers: localhost:9092
group-id: group_id
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
#org.apache.kafka.common.serialization.StringDeserializer
properties.spring.json.trusted.packages: com.myapp.pojo
producer:
bootstrap-servers: localhost:9092
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
#org.apache.kafka.common.serialization.StringSerializer
server:
port: 8000
spring:
kafka:
bootstrap-servers: localhost:9094
consumer:
auto-offset-reset: false
template:
default-topic: process-topic
.....
将my docker-compose.yml更新为
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
network_mode: bridge
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
container_name: kafka
network_mode: bridge
ports:
- "9092:9092"
hostname: kafka
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
# KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9094
# KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
# KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
KAFKA_ADVERTISED_PORT: 9092
links:
- zookeeper
my-app:
image: my-app
container_name: my-app
network_mode: bridge
ports:
- "8081:8081"
depends_on:
- zookeeper
- kafka
spring:
kafka:
consumer:
bootstrap-servers: kafka:9092
group-id: group_id
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
#org.apache.kafka.common.serialization.StringDeserializer
properties.spring.json.trusted.packages: com.myapp.pojo
producer:
bootstrap-servers: kafka:9092
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
#org.apache.kafka.common.serialization.StringSerializer
将my application.yml更新为
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
network_mode: bridge
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
container_name: kafka
network_mode: bridge
ports:
- "9092:9092"
hostname: kafka
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
# KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9094
# KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
# KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
KAFKA_ADVERTISED_PORT: 9092
links:
- zookeeper
my-app:
image: my-app
container_name: my-app
network_mode: bridge
ports:
- "8081:8081"
depends_on:
- zookeeper
- kafka
spring:
kafka:
consumer:
bootstrap-servers: kafka:9092
group-id: group_id
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
#org.apache.kafka.common.serialization.StringDeserializer
properties.spring.json.trusted.packages: com.myapp.pojo
producer:
bootstrap-servers: kafka:9092
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
#org.apache.kafka.common.serialization.StringSerializer
错误日志相同
WARN 1 --- [| adminclient-1] org.apache.kafka.clients.NetworkClient : [AdminClient clientId=adminclient-1] Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.
my-app | 2020-11-03 17:05:39.585 WARN 1 --- [| adminclient-1] org.apache.kafka.clients.NetworkClient : [AdminClient clientId=adminclient-1] Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.
我用几乎相同的方式做了同样的事情(差别很小),只要看一下下面的撰写文件,如果这对你有用的话
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- 2181:2181
kafka:
image: wurstmeister/kafka
ports:
- 9092:9092
hostname: kafka
environment:
- KAFKA_ADVERTISED_HOST_NAME=kafka
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_ADVERTISED_PORT=9092
links:
- zookeeper
您的错误来自AdminClient,因此如果您没有在代码中手动创建该客户端的实例,则需要为
spring.kafka.admin.*
添加一个配置部分,其中还设置了引导服务器
或者,如果所有三个客户端都与同一个集群通信,则从生产者和消费者中删除引导服务器,并使用spring.kafka.bootstrap server
因为您使用的是Docker网络,所以地址必须是Kafka容器的主机名。还要注意的是,链接
是一种不推荐使用的组合功能,不应该依赖它您能试一下吗
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
container_name: kafka
ports:
- "9092:9092"
hostname: kafka
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
# KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9094
# KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
# KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
KAFKA_ADVERTISED_PORT: 9092
links:
- zookeeper
my-app:
image: my-app
container_name: my-app
ports:
- "8081:8081"
depends_on:
- zookeeper
- kafka
networks:
default:
external:
name: bridge
我能够解决我的问题 这是我更新的docker-compose.yml,它可以工作,其余配置与上面相同
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- 9092:9092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
my-app:
image: my-app
container_name: my-app
environment:
SPRING_KAFKA_BOOTSTRAPSERVERS: kafka:29092
ports:
- "8081:8081"
depends_on:
- kafka
所做的更改是
也许我可以稍后再试,并更新我的答案。我通过在Spring Boot应用程序中配置KafkaAdmin bean并传递bootstrap servers属性进行了修复:
@SpringBootApplication
public class CpoExecutorApplication {
@Value("${spring.kafka.template.default-topic}")
private String topicName;
@Value("${spring.kafka.bootstrap-servers}")
private String bootstrapAddress;
@Bean
public KafkaAdmin kafkaAdmin() {
Map<String, Object> configs = new HashMap<>();
configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress);
return new KafkaAdmin(configs);
}
@Bean
public NewTopic processTopic() {
return TopicBuilder.name(topicName).partitions(2).build();
}
....
这样,我就不需要在docker compose.yml中传递SPRING_KAFKA_BOOTSTRAPSERVERS环境变量。请看,仅仅提供一个链接没有帮助,请告诉我我在哪里犯了错误。如博客中所述,连接到本地主机是不正确的。在应用程序容器中,它指的是应用程序容器,而不是代理。您的制作人和消费者无法连接到app container中的任何内容我是否应该在application.yml中提及引导服务器的主机名:localhost:9092,而不是localhost->kafkaNo您需要使用服务或容器名称访问kafka在本例中为kafka,因此,基本上您应该在应用程序中使用kafka:9092.yml文件是的,我已经将localhost:9092替换为kafka:9092。但问题仍然存在persist@Ajinkya然后编辑您的问题以反映更改和新错误message@OneCricketeer,我已更新问题,错误保持不变。您提到的所有细节都无法帮助我解决问题。你能分享一些代码片段并指出我在配置中的错误吗。此外,没有3个客户端。我有一个spring boot rest应用程序与Apache Kafka通信“您的错误来自AdminClient,因此如果您没有在代码中手动创建该应用程序的实例,则需要为spring.Kafka.admin.*添加一个配置部分,并在其中设置引导服务器”->在docker上运行Kafka和zookeeper图像的情况下,当我在本地运行spring boot应用程序时,同样的代码也会起作用,所以我认为在创建管理实例时没有任何问题。请阅读我的问题,如果我遗漏了任何其他细节,请告诉我。我确实阅读了你的问题。您无法将“在本地运行”与在Docker中运行所有内容进行比较。这么简单——如果您试图将容器部署到其他任何地方(使用Docker的主要目的),它也不会起作用。这个错误清楚地表明,
localhost
仍然在代码中的某个地方被使用,并且没有实际看到您的完整spring应用程序,很难说会在哪里,因为您的配置文件没有显示它(除非admin属性默认为localhost,并且您没有提到它的部分)。如果您可以在本地运行所有内容,那么不要在本地使用DockerRunning意味着Spring boot在本地运行,但是Kafka和zookeeper在docker上运行。因此,基本上我的spring boot应用程序与docker图像进行通信。此外,如果你需要任何其他详细信息或配置文件,我准备发布它,让我知道。此外,如果需要,我可以共享我的项目GitHub链接。我的意思是,通常Kafka会在远程集群环境中。(例如,亚马逊MSK)。在这种情况下,您的代码也会有相同的错误。但是是的,这对于完整的stacktrace和创建/使用AdminClient的代码是必要的