spring boot+kafka+docker的简易Demo搭建

前言:

博主目前就职于一家外包,开发金融行业的后台办公系统,平时接触到的都是管理系统的开发,对技术要求很低,基本工作内容就是CRUD,所有的技术架构都是行方设定好的,我们外包公司只需要具体的业务系统的功能模块实现。行内办公系统现行的技术体系为Spring cloud,我们就基于这种架构去开发业务系统。由于是微服务架构,就涉及到了服务的监控和治理等功能,sc也有一些相关的框架,admin之类的,具体的博主不太了解。只是知道行内现在在日志处理上使用了ELK(ES、logstash、kibana)的架构,来进行日志的收集、处理、以及展示,还运用的hadoop、spark等进行数据的处理。博主也是想向此方向去学习,所以在业余时间开始进行实践探索。目前仅仅进行到了能把kafka搭建起来并和spring boot联通的程度。

正文:

废话这么多,上代码。

需要搭建kafka和spring boot的联通,需要搭建的有:

docker、zookeeper、kafka、spring boot项目

docker:

这个不多说了,根据宿主机环境,自行百度。本人用的windows 10平台装的docker,通过cmd窗口即可启动zk和kafka的镜像。

zookeeper:

直接使用zookeeper的docker镜像,命令如下:

docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper

kafka:

也是直接用docker镜像启动即可,但是有几个参数需要注意,先看命令:

docker run  -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.204.128:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.204.128:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka 

这中间的几个参数,需要注意的是:

KAFKA_BROKER_ID=0 #这就是kafka集群的id
KAFKA_ZOOKEEPER_CONNECT=192.168.204.128:2181 #这里的ip为zookeeper的ip
KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.204.128:9092 #同上
KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 #这里0就可以,好像是可以开放ip访问

如果使用windows 10的docker起的zk,那么ip可以通过网络设置中访问,具体等下再写一个博客专门说。


截止这里,环境的搭建都已经完成了。如何测试呢...我使用的方式是直接使用spirng boot写测试方法。上代码:

import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.util.concurrent.ListenableFuture;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Classname KafkaController
 * @Description $END
 * @Date 2019/3/10 1:10
 * @Created by Sun
 */
@RestController
@Slf4j
@Api
public class KafkaController {

    @Autowired
    private KafkaTemplate kafkaTemplate;

    @GetMapping(value = "sendMessage")
    public void sendMessage(String message){
        ListenableFuture future = kafkaTemplate.send("test", message);
        future.addCallback(o -> log.info("send-消息发送成功:" + message), throwable -> log.info("消息发送失败:" + message));
    }
}

maven依赖如下:

        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>1.0.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.12</version>
        </dependency>

其他spring boot相关依赖不再赘述。

还有配置:

spring:
    kafka:
        bootstrap-servers: 10.0.75.1:9092

跑完测试类看到日志如下:

这里贴上失败的日志,原因是我docker先起kafka后期的zk,导致kafka容器启动失败,项目启动也看不出来没连上。。。

成功的如下:


至此,消息的发送已经完成。接下来是消息的监听,监听配置会多一点点:

spring:
    kafka:
        bootstrap-servers: 10.0.75.1:9092
        consumer:
            bootstrap-servers: 10.0.75.1:9092
            group-id: 0

这个groupid随便给,但是必须有,kafka的特性。

监听类:


import lombok.extern.slf4j.Slf4j;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

/**
 * @Classname KafkaListener
 * @Description $END
 * @Date 2019/3/10 1:38
 * @Created by Sun
 */
@Service
@Slf4j
public class KafkaListenerService {

    @KafkaListener(topics = {"test"})
    public void listener(String message){
        log.info("收到消息:"+message);
    }

}

topics:需要和发送时写的一样,

接收消息不需要做操作,发送成功后自动触发。截图如下:

日志参数:[app_log-0],app_log为topics的name,0为groupid或者broker id。未考证。


至此整个demo已经搭建完成。由于搭建工程中,记录不全,可能有为描述到的。可以查看我的参考博客。

参考一:使用docker安装kafka

参考二:SpringBoot整合SpringKafka实现生产者史上最简代码实现

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章