微服务01 ZooKeeper, Kafka

news/2024/10/14 19:08:29

1.4 微服务

1.4.6 Spring Cloud

JAVA 微服务技术

Dubbo是2014年之前阿里退出的分布式系统的技术(不属于微服务)。现在主流是 Spring Cloud

Spring Cloud

 

官网地址: https://spring.io/projects/spring-cloud 
官网上实现方法有很多种,目前主流是阿里巴巴实现的方法

Spring Boot 和 Spring cloud

Spring Boot用于单体开发; Spring cloud基于Spring Boot开发,关注多个小服务开发

1.5 服务网格 Mesh

k8s里每个pod里放一个公用容器, 用于连数据库, 服务配置, 限流等功能, 叫边车。开发无需关注这些功能

1.6 无服务架构 Serverless

用于云端,用户只要写业务代码。其他买云服务,交给云厂商

1.7 微服务还是单体

单体在绝大部分时候是更好的选择,即单体优先

 

2 ZooKeeper

2.2 ZooKeeper 工作原理

2.2.1 ZooKeeper 功能

2.2.1.1 命名服务

2.2.1.2 状态同步

2.2.1.3 配置中心

2.2.1.4 集群管理

zookeeper自身也有集群功能, 保证自身高可用

2.2.2 ZooKeeper 服务流程

 ZooKeeper没monitor功能, 没提供图形web界面,无法监控程序之间调用关系,nacos解决了这一问题

2.3 ZooKeeper 安装

zookeeper基于java开发

2.3.1 ZooKeeper 单机部署

2.3.1.2 部署 ZooKeeper

2.3.1.2.1 包安装

范例:包安装

#不要求版本,直接安装
[root@ubuntu2204 ~]#apt list zookeeper
zookeeper/jammy 3.4.13-6ubuntu4 all
[root@ubuntu2204 ~]#apt -y install zookeeper    #如果没java会把java安装了#启动
[root@ubuntu2204 ~]#/usr/share/zookeeper/bin/zkServer.sh start
#查看状态
[root@ubuntu2204 ~]#/usr/share/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /etc/zookeeper/conf/zoo.cfg
Mode: standalone    #单机模式

[root@ubuntu ~]#ss -lntp    #打开2181端口
LISTEN  0       50                   *:2181               *:*      users:(("java",pid=3810,fd=27)) 

如果要安装最新版本,就下载最新的包二进制安装

2.3.1.2.2 二进制安装

#可以从apache基金会官网进入
https://zookeeper.apache.org/
#版本: stable 和 current ,生产建议使用stable版本
#有source release是源码要编译,没有表示编译好了#历史版本下载
https://archive.apache.org/dist/zookeeper/
#下载带bin表示二进制版,如apache-zookeeper-3.9.2-bin.tar.gz  

[root@ubuntu ~]#wget https://archive.apache.org/dist/zookeeper/current/apache-zookeeper-3.9.2-bin.tar.gz#先装java环境,否则zookeeper起不来
[root@ubuntu ~]#apt update && apt -y install openjdk-11-jdk
#检查下版本
[root@ubuntu ~]#java -version#解压zookeeper安装包
[root@ubuntu ~]#tar xf apache-zookeeper-3.9.2-bin.tar.gz -C /usr/local/
[root@ubuntu local]#cd apache-zookeeper-3.9.2-bin/
[root@ubuntu local]#ln -s apache-zookeeper-3.9.2-bin/ zookeeper
#准备配置文件
[root@ubuntu local]#cd zookeeper/conf/
[root@ubuntu conf]#cp zoo_sample.cfg zoo.cfg#默认配置可不做修改
[root@ubuntu1804 ~]#vim /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000  #"滴答时间",用于配置Zookeeper中最小的时间单元长度,单位毫秒,是其它时间配置的基础  
initLimit=10   #初始化时间,包含启动和数据同步,其值是tickTime的倍数
syncLimit=5    #正常工作,心跳监测的时间间隔,其值是tickTime的倍数
dataDir=/usr/local/zookeeper/data/ #配置Zookeeper服务存储数据快照的目录(把目录创建出来),基于安全 (默认tmp目录ubuntu一重启会清空)
dataLogDir=/usr/local/zookeeper/logs  #指定日志路径,默认与 dataDir 一致,事务日志对性能影响非常大,强烈建议事务日志目录和数据目录分开,如果后续修改路径,需要先删除中dataDir中旧的事务日志,否则可能无法启动
clientPort=2181 #配置当前Zookeeper服务对外暴露的端口,用户客户端和服务端建立连接会话

autopurge.snapRetainCount=3 #3.4.0中的新增功能:启用后,ZooKeeper 自动清除功能,会将只保留此最新3个快照和相应的事务日志,并分别保留在dataDir 和dataLogDir中,删除其余部分,默认值为3,最小值为3
autopurge.purgeInterval=24  #3.4.0及之后版本,ZK提供了自动清理日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是 0,表示不开启自动清理功能#修改PATH变量
[root@ubuntu ~]#echo 'PATH=/usr/local/zookeeper/bin:$PATH' > /etc/profile
[root@ubuntu ~]#. /etc/profile#启动(默认会读取配置文件zoo.cfg)
[root@ubuntu ~]#zkServer.sh start
#查看状态
[root@ubuntu ~]#zkServer.sh status
#查版本
[root@ubuntu ~]#zkServer.sh version
#停止
[root@ubuntu ~]#zkServer.sh stop

2.3.1.5 service 文件

[root@ubuntu2204 ~]#cat > /lib/systemd/system/zookeeper.service <<EOF
[Unit]
Description=zookeeper.service
After=network.target[Service]
Type=forking
ExecStart=/usr/local/zookeeper/bin/zkServer.sh start
ExecStop=/usr/local/zookeeper/bin/zkServer.sh stop
ExecReload=/usr/local/zookeeper/bin/zkServer.sh restart[Install]
WantedBy=multi-user.target
EOF[root@ubuntu2204 ~]#systemctl daemon-reload
[root@ubuntu2204 ~]#systemctl enable --now zookeeper.service

2.4 ZooKeeper 客户端访问

2.4.1 命令行客户端访问 ZooKeeper (了解)

#访问zookeeper
[root@ubuntu ~]#zkCli.sh    #默认连到本机2181端口
#按tab键查看命令列表
#查看文件
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /zookeeper 
[config, quota]
#zookeeper和文件系统区别:zookeeper的文件夹自身也可以存放文件,即文件夹也可同时作为文件
#获取zookeeper文件夹自己的数据
[zk: localhost:2181(CONNECTED) 2] get /zookeeper
#创建文件夹
[zk: localhost:2181(CONNECTED) 3] create /app1
[zk: localhost:2181(CONNECTED) 5] ls /
[app1, zookeeper]
[zk: localhost:2181(CONNECTED) 7] create /app1/name
#对app1文件夹存放数据
[zk: localhost:2181(CONNECTED) 8] set /app1 myapp
#获取数据
[zk: localhost:2181(CONNECTED) 11] get /app1 
myapp
#app1路径下的内容保持不变
[zk: localhost:2181(CONNECTED) 12] ls /app1 
[name]
#查看已知节点元数据
[zk: 10.0.0.103:2181(CONNECTED) 9] stat /zookeeper
#删除
[zk: 10.0.0.103:2181(CONNECTED) 7] delete /app1
#退出
quit

2.4.3 图形化客户端 ZooInspector

github链接

https://github.com/zzhang5/zooinspector
https://gitee.com/lbtooth/zooinspector.git

注意:此软件因年代久远不再更新,当前只支持在Ubuntu18.04和Rocky8编译安装,不支持更高版本,如Ubuntu20.04等

#注意:只支持JDK8,不支持JDK11
[root@ubuntu ~]#apt update && apt install -y openjdk-8-jdk
[root@ubuntu ~]#apt install maven -y    #如果没有java,会装jdk11#镜像加速
[root@ubuntu ~]#vim /etc/maven/settings.xml<mirrors><!--阿里云镜像--><mirror><id>nexus-aliyun</id><mirrorOf>*</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror></mirrors>#国内镜像
[root@zookeeper-node1 ~]#git clone https://gitee.com/lbtooth/zooinspector.git
#编译,此步骤需要较长时间下载,可能数分钟
[root@ubuntu ~]#cd zooinspector/
[root@ubuntu zooinspector]#mvn clean package -Dmaven.test.skip=true
#把target下大的jar包拷贝走,需要里面的脚本
[root@ubuntu zooinspector]#cp target/zooinspector-1.0-SNAPSHOT-pkg.tar /opt
[root@ubuntu zooinspector]#cd /opt/
[root@ubuntu opt]#tar xf zooinspector-1.0-SNAPSHOT-pkg.tar
#里面两个脚本,linux下用和windows下用
[root@ubuntu opt]#ls zooinspector-1.0-SNAPSHOT/bin/
zooinspector.bat  zooinspector.sh
[root@ubuntu zooinspector-1.0-SNAPSHOT]#bin/zooinspector.sh#把zooinspector-1.0-SNAPSHOT-pkg.tar传到windows上,解压
[root@ubuntu opt]#sz zooinspector-1.0-SNAPSHOT-pkg.tar
#运行zooinspector.bat即可
#这个工具以后一直能用

2.4.4 Python 访问 ZooKeeper

[root@zookeeper-node1 ~]#apt update && apt -y install python3 python3-kazoo
[root@zookeeper-node1 ~]#cat zookeepe_test.py 
#!/usr/bin/python3
from kazoo.client import KazooClientzk = KazooClient(hosts='10.0.0.101:2181')
zk.start()
# 创建节点(并写数据):makepath设置为True,父节点不存在则创建,其他参数不填均为默认
zk.create('/zkapp/test',b'this is a test',makepath=True)
# 操作完后关闭zk连接
data=zk.get('/zkapp/test')
print(data)
zk.stop()[root@zookeeper-node1 ~]#chmod +x ./zookeepe_test.py
[root@zookeeper-node1 ~]#./zookeepe_test.py

2.4.2 nc 访问 ZooKeeper

[root@ubuntu ~]#telnet 10.0.0.151 2181
#常见命令列表
conf #输出相关服务配置的详细信息
cons #列出所有连接到服务器的客户端的完全的连接/会话的详细信息
envi #输出关于服务环境的详细信息
dump #列出未经处理的会话和临时节点
stat #查看哪个节点被选择作为Follower或者Leader
ruok #测试是否启动了该Server,若回复imok表示已经启动
mntr #输出一些运行时信息
reqs #列出未经处理的请求
wchs #列出服务器watch的简要信息
wchc #通过session列出服务器watch的详细信息
wchp #通过路径列出服务器watch的详细信息
srvr #输出服务的所有信息
srst #重置服务器统计信息
kill #关掉Server,当前版本无法关闭
isro #查看该服务的节点权限信息#可以管道直接传输
[root@ubuntu ~]#echo conf | nc 10.0.0.200 2181

命令的安全限制

#默认情况下,这些4字命令有可能会被拒绝,提示如下报错
xxxx is not executed because it is not in the whitelist.#解决办法:在 zoo.cfg文件中添加如下配置,如果是集群需要在所有节点上添加下面配置
# vim conf/zoo.cfg
4lw.commands.whitelist=*    #允许所有4字命令
#在服务状态查看命令中有很多存在隐患的命令,为了避免生产中的安全隐患,要对这些"危险"命令进行一些安全限制,只需要编辑服务的zoo.cfg文件即可# vim conf/zoo.cfg
4lw.commands.whitelist=conf,stat,ruok,isro[root@ubuntu ~]#systemctl restart zookeeper.service

2.3.2 ZooKeeper 集群部署

2.3.2.1 ZooKeeper 集群介绍

zookeeper不需要设定谁是主谁是从,会自动选举主节点,从节点

2.3.2.1.1 集群结构

 对于n台server,每个server都知道彼此的存在。只要有>n/2台server节点可用,整个zookeeper系统保持可用。因此zookeeper集群通常由 奇数台Server节点组成

集群中节点数越多,写性能越差,读性能越好。节点越少写性能越好,读性能越差

2.3.2.1.2 集群角色

2.3.2.1.3 选举过程

节点角色状态:

LOOKING:寻找 Leader 状态,处于该状态需要进入选举流程
LEADING:领导者状态,处于该状态的节点说明是角色已经是Leader 
FOLLOWING:跟随者状态,表示 Leader已经选举出来,当前节点角色是follower 
OBSERVER:观察者状态,表明当前节点角色是 observer

选举 ID:

1.ZXID(zookeeper transaction id):每个改变 Zookeeper状态的操作都会自动生成一个对应的zxid。ZXID最大的节点优先选为Leader
2.myid:服务器的唯一标识(SID),通过配置 myid 文件指定,集群中唯一,当ZXID一样时,myid大的节点优先选为Leader

2.3.2.2 ZooKeeper 集群部署

2.3.2.2.1 环境准备

#三台ubuntu18.04,20.04,22.04
zookeeper-node1.wang.org 10.0.0.151
zookeeper-node2.wang.org 10.0.0.152
zookeeper-node3.wang.org 10.0.0.153
#在三个节点都安装JDK8或JDK11
#在三个节点都安装zookeeper
[root@ubuntu ~]#bash install_zookeeper_single_node.sh    #装完是单机版,要改配置为集群版

2.3.2.2.3 准备配置文件

#3台机器修改配置文件 (追加下面3行)
[root@ubuntu ~]#vim /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000  #服务器与服务器之间的单次心跳检测时间间隔,单位为毫秒
initLimit=10  #集群中leader 服务器与follower服务器初始连接心跳次数,即多少个 2000 毫秒
syncLimit=5  #leader 与follower之间连接完成之后,后期检测发送和应答的心跳次数,如果该follower在设置的时间内(5*2000)不能与leader 进行通信,那么此 follower将被视为不可用。
dataDir=/usr/local/zookeeper/data #自定义的zookeeper保存数据的目录
dataLogDir=/usr/local/zookeeper/logs
clientPort=2181 #客户端连接 Zookeeper 服务器的端口,Zookeeper会监听这个端口,接受客户端的访问请求
maxClientCnxns=128 #单个客户端IP 可以和zookeeper保持的连接数
autopurge.snapRetainCount=3 #3.4.0中的新增功能:启用后,ZooKeeper 自动清除功能,会将只保留此最新3个快照和相应的事务日志,并分别保留在dataDir 和dataLogDir中,删除其余部分,默认值为3,最小值为3
autopurge.purgeInterval=24  #3.4.0及之后版本,ZK提供了自动清理日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是 0,表示不开启自动清理功能#格式: server.MyID服务器唯一编号=服务器IP:Leader和Follower的数据同步端口(只有leader才会打开):Leader和Follower选举端口(L和F都有)
server.1=10.0.0.151:2888:3888
server.2=10.0.0.152:2888:3888
server.3=10.0.0.153:2888:3888
#如果添加节点,只需要在所有节点上添加新节点的上面形式的配置行,在新节点创建myid文件,并重启所有节点服务即可#创建dataDir文件
[root@ubuntu ~]#mkdir -p /usr/local/zookeeper/data

2.3.2.2.4 在各个节点生成ID文件

注意: 各个myid文件的内容要和zoo.cfg文件相匹配

#10.0.0.151
[root@zookeeper-node1 ~]#echo 1 > /usr/local/zookeeper/data/myid
#10.0.0.152
[root@zookeeper-node2 ~]#echo 2 > /usr/local/zookeeper/data/myid
#10.0.0.153
[root@zookeeper-node3 ~]#echo 3 > /usr/local/zookeeper/data/myid

2.3.2.2.5 各服务器启动 Zookeeper

#3台机器都停止
[root@ubuntu ~]#systemctl stop zookeeper.service
#3台机器都启动
[root@ubuntu ~]#systemctl start zookeeper.service
#查看集群角色
[root@ubuntu ~]#zkServer.sh status#测试,reboot其中一台,查看两外两台,其中一台变为主节点

2.3.3 容器化部署

范例: 单实例

docker run --name some-zookeeper -p 2181:2181 --restart always -d zookeeper

范例: 集群部署

#基于docker-compose部署集群(部署在同一台机器,坏了就崩了,这样部署也就玩一玩)
version: '3.1'
services:zoo1:image: zookeeperrestart: alwayshostname: zoo1ports:- 2181:2181environment:ZOO_MY_ID: 1ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181zoo2:image: zookeeperrestart: alwayshostname: zoo2ports:- 2182:2181environment:ZOO_MY_ID: 2ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181zoo3:image: zookeeperrestart: alwayshostname: zoo3ports:- 2183:2181environment:ZOO_MY_ID: 3ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181

Zookeeper作为配置中心,也可以作为注册中心。具体怎么用,那就是java程序写代码了

 

3 Kafka

3.2 Kafka 介绍

java写的

3.3 常用消息队列对比

kafka动态扩容依赖zookeeper,但是最新版不依赖它了

3.5 Kafka 角色和流程

3.5.1 Kafka 概念

Producer:Producer即生产者,消息的产生者,是消息的入口。负责发布消息到Kafka broker。Consumer:消费者,用于消费消息,即处理消息Broker:Broker是kafka实例,每个服务器上可以有一个或多个kafka的实例,假设每个broker对应一台服务器。每个kafka集群内的broker都有一个不重复的编号,
如: broker
-0、broker-1等……Controller:是整个 Kafka 集群的管理者角色,任何集群范围内的状态变更都需要通过 Controller 进行,在整个集群中是个单点的服务,可以通过选举协议进行故障转移,
负责集群范围内的一些关键操作:主题的新建和删除,主题分区的新建、重新分配,Broker的加入、退出,触发分区 Leader 选举等,每个Broker里都有一个Controller实例,
多个Broker的集群同时最多只有一个Controller可以对外提供集群管理服务,Controller可以在Broker之间进行故障转移,Kafka 集群管理的工作主要是由Controller来完成的,
而 Controller 又通过监听Zookeeper 节点的变动来进行监听集群变化事件,Controller 进行集群管理需要保存集群元数据,监听集群状态变化情况并进行处理,
以及处理集群中修改集群元数据的请求,这些主要都是利用 Zookeeper 来实现Topic :消息的主题,可以理解为消息的分类,一个Topic相当于数据库中的一张表,一条消息相当于关系数据库的一条记录,或者一个Topic相当于Redis中列表数据类型的一个Key,
一条消息即为列表中的一个元素。kafka的数据就保存在topic。在每个broker上都可以创建多个topic。 虽然一个 topic的消息保存于一个或多个broker 上同一个目录内, 物理上不同 topic 的消息分开存储在不同的文件夹,但用户只需指定消息的topic即可生产或消费数据而不必
关心数据存于何处,topic 在逻辑上对record(记录、日志)进行分组保存,消费者需要订阅相应的topic 才能消费topic中的消息。Consumer group: 每个consumer 属于一个特定的consumer group(可为每个consumer 指定 group name,若不指定 group name 则属于默认的group),
同一topic的一条消息只能被同一个consumer group 内的一个consumer 消费,类似于一对一的单播机制,但多个consumer group 可同时消费这一消息,
类似于一对多的多播机制
Partition :是物理上的概念,每个 topic 分割为一个或多个partition,即一个topic切分为多份, 当创建 topic 时可指定 partition 数量,
partition的表现形式就是一个一个的文件夹,该文件夹下存储该partition的数据和索引文件,分区的作用还可以实现负载均衡,提高kafka的吞吐量。
同一个topic在不同的分区的数据是不重复的,一般Partition数不要超过节点数,注意同一个partition数据是有顺序的,但不同的partition则是无序的。 Replication: 同样数据的副本,包括leader和follower的副本数,基本于数据安全,建议至少2个,是Kafka的高可靠性的保障,和ES的副本有所不同,
Kafka中的副(leader
+follower)数包括主分片数,而ES中的副本数(follower)不包括主分片数 #副本放的位置kafka自己实现

3.5.2 Kafka 工作机制

注意:Kafka 2.8.0版本开始,增加了KRaft(KRaft是Kafka Raft协议模式的简称)模式,这个模式下Kafka不再需要ZooKeeper,而是使用内 置的Raft协议来进行元数据的管理和领导者选举。Raft协议是一种为分布式系统提供一致性的算法,它更易于理解和实施,同时也保证了系 统的可用性和数据的一致性。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71562.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Swarm 框架登场:OpenAI 第 3 阶段「敲门砖」;马斯克的 Teslabot 实际有人远程操控丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

[2024领航杯] Pwn方向题解 babyheap

[2024领航杯] Pwn方向题解 babyheap 前言: 当然这个比赛我没有参加,是江苏省的一个比赛,附件是XiDP师傅在比赛结束之后发给我的,最近事情有点多,当时搁置了一天,昨天下午想起来这个事情,才开始看题目,XiDP师傅说是2.35版本的libc,确实高版本libc的却棘手,我经验太浅了…

高级语言程序设计第三次个人作业

班级网址:https://edu.cnblogs.com/campus/fzu/2024C 作业网址:https://edu.cnblogs.com/campus/fzu/2024C/homework/13284 姓名:袁湘湘 学号:102400109 一,第四章编程练习: 1,4.8.2问题:忘记怎么算名字的宽度 解决:翻阅书本,使用strlen()函数 2,4.8.3问题:无法运行…

智媒AI写作助手轻松写作热点文章,为你提升流量!

在信息爆炸的时代,内容创作成为了吸引用户、提升流量的关键。然而,对于许多创作者来说,持续产出高质量的热点文章是一项挑战。正是在这样的背景下,智媒AI写作助手应运而生,它不仅能够帮助创作者轻松捕捉热点,还能提升文章的质量,从而有效提升流量。以下是智媒AI写作助手…

C++异步调用 future async promise packaged_task

背景:C++ 异步调用是现代 C++ 编程中的一种重要技术,它允许程序在等待某个任务完成时继续执行其他代码,从而提高程序的效率和响应性。 C++11 引入了 std::async、std::future 和 std::promise 等工具,使得异步编程变得更加方便和直观。以下是关于 C++ 异步调用的详细介绍,…

WPF - 项目样例

WPF - 项目样例1. 创建项目: 参考:https://www.cnblogs.com/1285026182YUAN/p/184623962. 修改App.xaml<Application x:Class="ModelFileMigrate.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schema…

Spring 实现 3 种异步流式接口,干掉接口超时烦恼

大家好,我是小富~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地向客户端响应处…

世界空间到观察空间的矩阵

1)世界空间到观察空间的矩阵2)Addressable在不同工程中如何实现打包和加载3)如何设计角色在下蹲时允许跳跃4)如何实时编辑玩家的近裁剪面距离这是第403篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习…