项目部署到容器中,并访问kafka,samara报错:
fail to start consumer, err:init kafka consumer error: kafka: client has run out of available brokers to talk to: dial tcp: address tcp/9092": unknown port
很蠢的一个问题。原因是
node1:
image: fabric-edgenode:latest
ports:
- "7080:8080"
- "7083:8083"
volumes:
- ./cfg/org1conf.yaml:/conf/config.yaml
- ./fixtures/channel-artifacts:/fixtures/channel-artifacts
- ./fixtures/crypto-config:/fixtures/crypto-config
- ./kafka_crypto:/kafka_crypto
environment:
- KAFKA_ADDR="kafka1:9092"
- COUDB_ADDR="http://admin:123456@couchdb0:5984"
- PEER_NODE_NAME="peer0.org1.example.com:7051"
- ORG_ID = "org1"
- KEY_PATH = "/fixtures/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/keystore/priv_sk"
- CENTER_ADDR = "center_kafka:9091"
depends_on:
- kafka.peer0.org1.example.com
- couchdb0
networks:
- fixtures_test
在KAFKA_ADDR中我使用了引号。。。在docker-compose中的env不需要加引号。
读者如果还有其他问题,还可以关注一下 kafka配置的advertise_listener。
下文引用了Why Can’t I Connect to Kafka? | Troubleshoot Connectivity (confluent.io)
的图:
client访问broker首先会请求metadata,相当于找一个类似代理获取真实的访问地址。这个访问地址就由advertised.listener提供。
在容器中,如果advertised.listener配置的是localhost 的话,client就会访问localhost。又因为容器的网络是隔离的,所以实际上容器是访问了自己的9092端口。所以会导致访问错误。