查了一些资料,终于改好了,整理一下发出来,记录一下,希望能帮到遇到问题的人
容器选择
本次使用bitnami/kafka,其实他们文档已经写得挺清楚了,但是我也是改了一段时间才改完,希望能方便不想看文档的兄弟们
docker-compose.yml
文件中除了宿主机外网ip需要改,其他地方基本不需要改
version: '3.0'
services:
zookeeper:
image: 'bitnami/zookeeper:latest'
ports:
- '2181:2181'
environment:
# 匿名登录
- ALLOW_ANONYMOUS_LOGIN=yes
# volumes:
# - ./zookeeper:/bitnami/zookeeper
kafka:
image: 'bitnami/kafka:2.8.0'
ports:
- '9092:9092'
environment:
# 配置broker id
- KAFKA_BROKER_ID=1
# 配置监听者的安全协议
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,OUTSIDE:PLAINTEXT
# 定义Kafka Broker的Listener的配置项,配置外部访问和内部访问
- KAFKA_CFG_LISTENERS=INTERNAL://:9093,OUTSIDE://:9092
# 将Broker的Listener信息发布到Zookeeper中,供Clients(Producer/Consumer)使用
- KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka:9093,OUTSIDE://宿主机外网ip:9092
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
# 全局消息过期时间
- KAFKA_CFG_LOG_RETENTION_HOURS=6
# volumes:
# - ./kafka:/bitnami/kafka
depends_on:
- zookeeper
内外网隔离配置
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP:监听器名称和安全协议的映射配置。每个监听器的名称只能在map中出现一次。
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME:用于配置broker之间通信使用的监听器名称
- KAFKA_CFG_LISTENERS:用于配置broker监听的URI以及监听器名称列表
- KAFKA_CFG_ADVERTISED_LISTENERS:将该地址发布到zookeeper供客户端使用
数据卷可以自己打开使用,这个容器时非root容器,所以创建挂载目录时候需要将文件夹权限打开!!
启动容器
docker-compose up
测试生产
使用kafka-client测试,client版本不能低于kafka版本,避免遇到各种意外
- 引入依赖
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.8.0</version>
</dependency>
- 写代码
public static void main(String[] args) throws ExecutionException, InterruptedException {
Map<String,Object> configs = new HashMap<>();
configs.put("bootstrap.servers","宿主机外网ip:9092");
configs.put("key.serializer", IntegerSerializer.class);
configs.put("value.serializer", StringSerializer.class);
KafkaProducer<Integer,String> producer = new KafkaProducer<Integer, String>(configs);
ProducerRecord<Integer,String> record = new ProducerRecord<>(
"topic_1",0,12,"shall"
);
Future<RecordMetadata> send = producer.send(record);
RecordMetadata recordMetadata = send.get();
String topic = recordMetadata.topic();
Integer partition = recordMetadata.partition();
long offset = recordMetadata.offset();
System.out.println("主题:"+topic + ",分区:" + partition + ",偏移量:" + offset);
producer.close();
}