项目中使用 kafka 做为数据源,所以内网要搭建一个 kafka 做测试。因为对 kafka 不是很了解,还是花了蛮多时间的。这里几个笔记。
ssl 类似 https 中的 ssl,作用是一样的, ssl 的作用是把传输的信息加密。
sasl 的作用就是用户名密码验证,只是在建立连接的时候一次性验证。
docker-compose 中 zookeeper 和 kafka 两个服务,也有人把 kafka 叫做 broker。
listeners 用作内部访问,advertised_listeners用作外部访问。
比如在阿里云上部署了一个 kafka,那么 advertised_listeners 填的就是阿里云服务器的外网ip和端口,listeners填的内部的ip和端口
docker-compose.yml
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181"
restart: always
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.0.2
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_PORT: 9092
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- "zookeeper"
restart: always
理论上直接 docker-compose up -d 就能直接用了,但是实际中我发现内网会报错
xxx Connection to node 1001 (xxx) could not be established. Broker may not be availabel.
这个报错的意思是连接补上 kafka 服务,我对这个报错很奇怪,为什么 kafka 服务自己会报连不上自己的错。只能进行一些猜测,连接自己的话他可能是通过宿主机的端口连接自己,我这边内网默认情况下容器内不能访问宿主机的,所以我把防火墙开起来就可以了。
之后就用官方提供的bin目录中的脚本测试就可以了。
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181"
restart: always
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_LISTENERS: SASL_PLAINTEXT://:9092
KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://192.168.0.2:9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf"
KAFKA_INTER_BROKER_LISTENER_NAME: SASL_PLAINTEXT
KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./kafka_server_jaas.conf:/etc/kafka/kafka_server_jaas.conf
depends_on:
- "zookeeper"
restart: always
另外创建一个 kafka_server_jaas.conf 文件:
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin-secret"
user_admin="admin-secret"
user_alice="alice-secret";
};
Client {};
这样就启用了 sasl 验证。
需要添加一个配置文件,比如创建一个 file.properties
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \
username="admin" \
password="admin-secret";
注意最后的分号要写上。
在cli 指定这个配置文锦啊就可以连上了
消费者例子:
./kafka-console-consumer.sh --topic t --bootstrap-server 192.168.0.2:9092 --consumer.config /path/to/file.properties
生产者例子:
./kafka-console-producer.sh --topic t --bootstrap-server 192.168.0.2:9092 --producer.config /path/to/file.properties