物联网架构成长之路(28)-Docker练习之MQ中间件(Kafka)
0. 前言
消息队列MQ,这个在一般的系统上都是会用到的一个中间件,我选择Kafka作为练手的一个中间件,Kafka依赖Zookeeper。Zookeeper安装上一篇博客已经介绍过了。
1. Kafka Image构建
Dockerfile
FROM openjdk:8-jdk-alpine RUN apk add --no-cache bash && rm -rf /var/cache/apk/* && /bin/bash RUN wget http://mirrors.aliyun.com/apache/kafka/2.0.1/kafka_2.12-2.0.1.tgz && \
tar -zxvf kafka_2.12-2.0.1.tgz && \
rm -rf kafka_2.12-2.0.1.tgz && \
mv kafka_2.12-2.0.1 /var/app/ ENV PATH /var/app/bin:$PATH COPY env.sh /env.sh
RUN chmod +x env.sh EXPOSE 9092 ENTRYPOINT ["/env.sh"]
env.sh
#!/bin/sh BROKER_ID=${BRODER_ID:-"0"}
LISTENERS=${LISTENERS:-"PLAINTEXT://:9092"}
ZOOKEEPER_CONNECT=${ZOOKEEPER_CONNECT:-"localhost:2181"} sed -i "s/^broker.id=.*$/broker.id=$BROKER_ID/" /var/app/config/server.properties
sed -i "s;^#listeners=.*$;listeners=$LISTENERS;g" /var/app/config/server.properties
sed -i "s/^zookeeper.connect=.*$/zookeeper.connect=$ZOOKEEPER_CONNECT/" /var/app/config/server.properties sed -i "s#/tmp/kafka-logs#/data#g" /var/app/config/server.properties /var/app/bin/kafka-server-start.sh /var/app/config/server.properties
2. docker-compose配置Zookeeper、zkui、Kafka
docker-compose.yml
version: '3'
services:
zookeeper:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/zookeeper
ports:
- 2181:2181
zkui:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/zkui
ports:
- 9090:9090
environment:
- ZK_SERVER=zookeeper:2181
kafka:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/kafka
ports:
- 9092:9092
environment:
- BROKER_ID=1
- LISTENERS=PLAINTEXT://kafka:9092
- ZOOKEEPER_CONNECT=zookeeper:2181
volumes:
- /root/workspace/docker/kafka/kafka/data:/data
启动docker-compose、并通过zkui预览、注意由于kafka的监听是使用域名方式,因此需要往 /etc/hosts 中写入 127.0.0.1 kafka, 如果客户端开发,在Windows系统的,要往 C:\Windows\System32\drivers\etc\hosts 里写入 172.16.23.203 kafka
3. Kafka读写
创建主题(Topic)
./bin/kafka-topics.sh --create --zookeeper 172.16.23.203:2181 --replication-factor 1 --partitions 1 --topic wunaozai
查看主题(Topic)
./bin/kafka-topics.sh --list --zookeeper 172.16.23.203:2181 --list
发送消息(生产者)
./bin/kafka-console-producer.sh --broker-list 172.16.23.203:9092 --topic wunaozai
消费消息(消费者)
./bin/kafka-console-consumer.sh --bootstrap-server kafka:9092 --topic wunaozai
4. Kafka Java Client 测试
POM依赖
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.0.1</version>
</dependency>
生产者ProducerSample.java
package demo.kafka; import java.util.HashMap;
import java.util.Map; import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord; public class ProducerSample { public static void main(String[] args) {
Map<String, Object> props = new HashMap<>();
props.put("zk.connect", "172.16.23.203:2181");
props.put("bootstrap.servers", "172.16.23.203:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); String topic = "wunaozai";
Producer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<String, String>(topic, "key1", "value111"));
producer.send(new ProducerRecord<String, String>(topic, "key2", "value222"));
producer.send(new ProducerRecord<String, String>(topic, "key3", "value333"));
producer.close();
}
}
消费者 ConsumerSample.java
package demo.kafka; import java.time.Duration;
import java.util.Arrays;
import java.util.Properties; import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer; public class ConsumerSample { public static void main(String[] args) {
String topic = "wunaozai"; Properties props = new Properties();
props.put("bootstrap.servers", "172.16.23.203:9092");
props.put("group.id", "JLGroup");// Consumer Group Name
props.put("enable.auto.commit", "true");// Consumer 的 offset 是否自动提交
props.put("auto.commit.interval.ms", "1000");// 自动提交 offset 到 zookeeper
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
Consumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList(topic));
try {
while (true) {
//Duration timeout = Duration.ofMillis(10000);
Duration timeout = Duration.ofSeconds(5);
ConsumerRecords<String, String> records = consumer.poll(timeout);
for (ConsumerRecord<String, String> record : records)
System.out.printf("partition = %d, offset = %d, key = %s, value = %s%n", record.partition(), record.offset(), record.key(), record.value());
}
} catch (Exception e) {
e.printStackTrace();
}
consumer.close();
}
}
ProducerSample 生产消息,通过./bin/kafka-console-consumer.sh 消费消息
./bin/kafka-console-producer.sh 生产消息,通过ConsumerSample 消费消息
docker-compose 部分日志
5. 小结
一路练习下来,发现这个Kafka配置还是有点复杂的,就先了解到这里,以后再深入了解。一步一步慢慢来。
参考资料:
https://hub.docker.com/r/wurstmeister/kafka/
https://raw.githubusercontent.com/wurstmeister/kafka-docker/master/docker-compose.yml
https://github.com/wurstmeister/kafka-docker
https://github.com/apache/kafka
https://www.cnblogs.com/smail-bao/p/7794636.html
https://www.cnblogs.com/wunaozai/p/8249657.html
本文地址: https://www.cnblogs.com/wunaozai/p/9985054.html
物联网架构成长之路(28)-Docker练习之MQ中间件(Kafka)的更多相关文章
- 物联网架构成长之路(25)-Docker构建项目用到的镜像1
0. 前言 现在项目处于初级阶段,按照规划,先构建几个以后可能会用到的Image,并上传到阿里云的Docker仓库.以后博客中用到的Image,大部分都会用到这几个基础的Image,构建一个简单的物联 ...
- 物联网架构成长之路(24)-Docker练习之Compose容器编排
0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...
- 物联网架构成长之路(22)-Docker练习之Etcd服务搭建
0. 前言 时隔多日,前段时间忙完一个可有可无的项目后,又进入摸鱼时间,没有办法,非互联网公司,就是闲得蛋疼.又开始了自学之路.以前入门过Docker,然后又很久没有看了,最近重新看了一下,推荐一下这 ...
- 物联网架构成长之路(27)-Docker练习之Zookeeper安装
0. 前言 准备了解一下消息队列MQ,对比了一些开源的中间件,最后选择Kafka作为以后用到的消息队列,消息队列的应用场景及Kafka与其他消息队列的优缺点这里就不细说了,具体的可以参考其他博客说明. ...
- 物联网架构成长之路(26)-Docker构建项目用到的镜像2
0. 前言 前面介绍的都是一些标准的第三方中间件,基本都是有现成的Dockerfile或者Image,不需要我过多的关心,这一篇要介绍一些自己构建的Docker Image了.刚开始学,Dockerf ...
- 物联网架构成长之路(23)-Docker练习之Elasticsearch服务搭建
0. 前言 最近基本都是学一些环境配置,和一些中间件的安装与配置.没有实际编写代码.可能看起来有点水,我对自己的学习方式是,先要了解各个中间件的安装配置以及简单使用,理论应用场景,然后我在小项目中,逐 ...
- 物联网架构成长之路(44)-Docker私有仓库Harbor
0. 前言 安装docker.docker-compose,这些在我以前的博客讲过,这里就不继续说明了,有需要的可以参考我之前的博客. https://www.cnblogs.com/wunaozai ...
- 物联网架构成长之路(31)-EMQ基于HTTP权限验证
看过之前的文章就知道,我之前是通过搞插件,或者通过里面的MongoDB来进行EMQ的鉴权登录和权限验证.但是前段时间发现,还是通过HTTP WebHook 方式来调用鉴权接口比较适合实际使用.还是实现 ...
- 物联网架构成长之路(8)-EMQ-Hook了解、连接Kafka发送消息
1. 前言 按照我自己设计的物联网框架,对于MQTT集群中的所有消息,是要持久化到磁盘的,这里采用一个消息队列中间件Kafka作为数据缓冲,缓冲结果存到数据仓库中,以供后续作为数据分析.由于MQTT集 ...
随机推荐
- P3810 -三维偏序(陌上花开)cdq-分治
P3810 [模板]三维偏序(陌上花开) 思路 :按照 1维排序 二维 分治三维树状数组维护 #include<bits/stdc++.h> using namespace std; #d ...
- XamarinSQLite教程在Xamarin.Android项目中提取数据库文件
XamarinSQLite教程在Xamarin.Android项目中提取数据库文件 由于不能直接打开该文件,开发者需要先将数据库文件从Android系统中提取出来.操作步骤如下. (5)选择MyDoc ...
- class关键字
class的数据类型为function,可以看做构造函数的另一种写法.事实上,类的所有方法都定义在类的prototype属性上面.一.声明class class Animal { constructo ...
- BZOJ.4540.[HNOI2016]序列(莫队/前缀和/线段树 单调栈 RMQ)
BZOJ 洛谷 ST表的一二维顺序一定要改过来. 改了就rank1了哈哈哈哈.自带小常数没办法. \(Description\) 给定长为\(n\)的序列\(A_i\).\(q\)次询问,每次给定\( ...
- BZOJ.4052.[Cerc2013]Magical GCD(思路)
BZOJ \(Description\) 给定\(n\)个数的序列\(a_i\).求所有连续子序列中,序列长度 × 该序列中所有数的gcd 的最大值. \(n\leq10^5,\ a_i\leq10^ ...
- pip命令无法使用
今天在学习Python时需要安装Requests 使用命令:pip install requests 提示错误 我的解决办法是: cmd 切换到Python安装路径中的scripts ...
- 潭州课堂25班:Ph201805201 django框架 第十三课 自定义404页面,auth系统中的User模型,auth系统权限管理 (课堂笔记)
当 DEBUG=True 时,django 内部的404报错信息, 自带的报错信息, 要自定义404信息,要先把 DEBUG=False , 之后要自定义4040页面,有两种方法, 方法1,在创建40 ...
- 树莓派mariadb折腾
今天在树莓派之中安装mysql,结果被我安装了mariadb,这样做很讨厌,但是也可以将就用.记录一下折腾的过程. 安装就还是使用sudo apt install mysql 1.安装之后需要使用工具 ...
- 快速排序 [Qsort]
在做USACO1.4 等差数列的时候,我发现如果用结构体+sort就会超时,用二维数组+qsort就能AC,所以为了不忘记Quick Sort,我还是把代码贴出来以备以后要看吧. void qsort ...
- JS 数组方法
1.栈方法 ECMAScript 提供了一些让数组行为类似其他数据结构的方法 栈是一种后进先出(LIFO)的数据结构,也就是最新添加的项最早被移除:而栈中数据的添加和删除只发生在栈的顶部 数组可以对其 ...