前言:
博主目前就职于一家外包,开发金融行业的后台办公系统,平时接触到的都是管理系统的开发,对技术要求很低,基本工作内容就是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