Windows下Kafka集群环境搭建及代码验证

一、背景

  1. kafka应用场景很多,比如:日志收集、消息系统、大数据流式处理等;
  2. 项目中刚好需要消息中间件、Spark流式处理,所以非常有必要深入了解下kafka原理与运行机制;

二、分析

  1. 先搞清楚Kafka的部署结构(物理结构):kafka由Kafka中间件(独立安装部署)、生产者、消费者三部分组成;
  2. Kafka中间件支持集群安装部署,生产者可以独立部署到产生消息的业务模块中去,消费者则独立部署到消费消息的业务模块中去,三者可以完全独立;
  3. 鉴于本人使用的是Windows 10,准备在此系统基础上搭建较简洁的Kafka集群环境,并在命令行中验证,同时还通过Springboot项目验证;
  4. kafka(版本:2.12-2.3.0)集群需要zookeeper,为了简化说明,使用kafka内置的zookeeper;

三、步骤

  1. 官网下载Windows安装包:kafka_2.12-2.3.0.tgz,解压缩;
  2. 把解压缩后的文件复制3份,分别命名:kafka_1、kafka_2、kafka_3;
  3. 新建kafka_1同级目录kafka_slaves,并在kafka_slaves下新建data和logs二级目录;
  4. 在data和logs二级目录下都新建1、2、3这三个三级目录;
  5. 在data/(1-3)/路径下新建myid,值为三级目录的目录名(1-3);
  6. 修改kafka_(1-3)的config/server.properties文件,以kafka_1为例详加说明:
#对应myid的值
broker.id=1
#日志路径,kafka2和3的最后一级目录分别为2、3
log.dirs=G:\\software\\java\\kafka_slaves\\logs\\1
#本机的非回环IP+端口,kafka2和3对外端口号依次+1
listeners=PLAINTEXT://192.168.7.197:9091
#zookeeper配置都一样
zookeeper.connect=localhost:2181,localhost:2182,localhost:2183
  1. 修改kafka_(1-3)的config/zookeeper.properties文件,以kafka_1为例详加说明:
dataDir=G:\\software\\java\\kafka_slaves\\data\\1
#zookeeper端口,kafka2和3对外端口号依次+1
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:4888:5888
server.3=127.0.0.1:6888:7888
  1. 启动全部的zookeeper(每个一个管理员执行的CMD窗口):
G:\software\java\kafka_1\bin\windows\zookeeper-server-start.bat G:\software\java\kafka_1\config\zookeeper.properties
G:\software\java\kafka_2\bin\windows\zookeeper-server-start.bat G:\software\java\kafka_2\config\zookeeper.properties
G:\software\java\kafka_3\bin\windows\zookeeper-server-start.bat G:\software\java\kafka_3\config\zookeeper.properties
  1. 启动全部的kafka(每个一个管理员执行的CMD窗口):
G:\software\java\kafka_1\bin\windows\kafka-server-start.bat G:\software\java\kafka_1\config\server.properties
G:\software\java\kafka_2\bin\windows\kafka-server-start.bat G:\software\java\kafka_2\config\server.properties
G:\software\java\kafka_3\bin\windows\kafka-server-start.bat G:\software\java\kafka_3\config\server.properties 
  1. 所有配置文件路径见github

四、验证

  1. 创建监听
G:\software\java\kafka_1\bin\windows\kafka-topics.bat --create --zookeeper  localhost:2181 --replication-factor 2 --partitions 3 --topic test
  1. 查看topic:
G:\software\java\kafka_1\bin\windows\kafka-topics.bat --describe --zookeeper localhost:2181
  1. 生产消息
G:\software\java\kafka_1\bin\windows\kafka-console-producer.bat --broker-list localhost:9091 --topic test
  1. 消费消息
G:\software\java\kafka_3\bin\windows\kafka-console-consumer.bat --bootstrap-server  192.168.7.197:9091 --from-beginning --topic test
  1. 效果图如下:kafka效果图
  2. 生产者代码:
@Service
public class KafkaProducer
{
    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    @Value("${kafka.topic.topic-name}")
    private String defaultTopic;

    /**
     * 发送消息
     *
     * @param msg
     */
    public void send(String msg)
    {
        String topic = defaultTopic;
        LOGGER.info("current default topic:{}", topic);
        this.send(topic, msg);
    }

    /**
     * 发送带Topic的消息
     *
     * @param topic
     * @param msg
     */
    public void send(String topic, String msg)
    {
        LOGGER.info("current topic:{},msg:{}", topic, msg);
        ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(topic, msg);
        future.addCallback(new ListenableFutureCallback<SendResult<String, String>>()
        {
            @Override
            public void onFailure(Throwable ex)
            {
                LOGGER.error("failed to send [{}] msg:{}.", topic, msg, ex);
            }

            @Override
            public void onSuccess(SendResult<String, String> result)
            {
                LOGGER.info("send jms msg success:{}", result);
            }
        });
    }

    private static Logger LOGGER = LogManager.getLogger(KafkaProducer.class);
}
  1. 消费者代码:
@Service
public class KafkaConsumer
{
    @KafkaListener(topics = {"test-topic"}, groupId = "test-group")
    public void process(ConsumerRecord<String, String> msg)
    {
        LOGGER.info("receive msg:{}", msg.value());
    }

    private static final Logger LOGGER = LogManager.getLogger(KafkaConsumer.class);
}
  1. kafka配置:
###Kafka Consumer
# 指定一个默认的组名
spring.kafka.consumer.group-id=test-group
# earliest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
# latest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
# none:topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.enable-auto-commit=true
spring.kafka.consumer.auto-commit-interval=100
# key/value的反序列化
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
###Kafka Producer
# key/value的序列化
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
# 批量抓取
spring.kafka.producer.batch-size=65536
# 缓存容量
spring.kafka.producer.buffer-memory=524288
###Global Configuration
kafka.topic.topic-name=test-topic
  1. controller入口:
@RestController
public class ProducerController
{
    @Autowired
    private KafkaProducer producerService;

    @GetMapping("/kafka/send")
    @ResponseBody
    public String send(String aaa)
    {
        producerService.send(aaa);
        return "ok";
    }
}
  1. 验证1:通过java代码生产一个test-topic消息,在命令行的消费者可以消费到:
    在这里插入图片描述
  2. 验证2:在命令行生产一个test-topic消息,在java端的消费者可以消费到:
    在这里插入图片描述
  3. 完整java代码详见github

五、总结

  1. 听过kafka跟自己会不会使用kafka完全是两码事,kafka也不同于spring等这些三方件,需要独立安装部署kafka通道,java侧只需要单独引用其生产者或者消费者即可;
  2. kafka新旧版本的命令有差异,尤其是kafka-console-consumer.bat --bootstrap-server 192.168.7.197:9091 命令,旧版本是kafka-console-consumer.bat --zookeeper 127.0.0.1:2181,127.0.0.1:2182,完全不是一回事,需要多参考,并会分辨;

六、参考

[1]https://blog.csdn.net/m0_38075425/article/details/81353738
[2]https://zhuanlan.zhihu.com/p/64319010
[3]https://docs.spring.io/spring-kafka/reference/html/
[4]https://blog.csdn.net/lingbo229/article/details/80761778
[5]https://blog.csdn.net/weixin_34205076/article/details/90618163
[6]https://blog.csdn.net/panchang199266/article/details/82113453

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值