在分布式环境下,如果不用SpringCloud,那么可以用Zookeeper来完成:
注册中心
配置集中管理
集群管理
分布式锁、分布式任务
队列的管理
Zookeeper就是一个文件系统+监听通知机制
1、Zookeeper
1、安装zookeeper
安装视频:https://www.bilibili.com/video/BV15e411W75G?p=198
docker-compose.yml文件内容
version: "3.1"
services:
zk:
image: daocloud.io/daocloud/zookeeper:latest
restart: always
container_name: zk
ports:
- 2181:2181
2、 Zookeeper理论知识点
1、Zookeeper结构
每一个节点都称为znode
每一个znode中都可以存储数据(没有目录、文件之分)
在同一级节点,名称不允许重复
2、znode的4种类型
1、持久节点
永久的保存在Zookeeper
2、持久有序节点
永久的保存在Zookeeper,zookeeper会给节点添加一个有序的序号
eg:添加一个节点xx,会存储成xx000001
3、临时节点
当存储的客户端与Zookeeper服务断开连接时,这个临时节点自动删除
4、临时有序节点
当存储的客户端和Zookeeper服务断开连接时,这个临时节点自动删除
序号与持久有序节点的序号类似
3、Zookeeper的监听通知机制
客户端可以监听Zookeeper中的Znode节点
Znode改变时,会通知监听当前Znode的客户端
4、Zookeeper常用命令
3、 Zookeeper集群安装
安装视频:https://www.bilibili.com/video/BV15e411W75G?p=206
不要用dacloud.io的镜像,会在java项目中使用时,因为curator-recipes版本问题,导致加锁出错
可以参考https://blog.csdn.net/pyl574069214/article/details/105593946配置镜像加速daemon.json中
docker-compose.yml文件内容
version: "3.1"
services:
zk1:
image: zookeeper
restart: always
container_name: zk1
ports:
- 2181:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
zk2:
image: zookeeper
restart: always
container_name: zk2
ports:
- 2182:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
zk3:
image: zookeeper
restart: always
container_name: zk3
ports:
- 2183:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
2、Redis
1、redis解决的问题
redis实现:数据共享、分布式锁、分布式session共享
https://www.bilibili.com/video/BV15e411W75G?p=22
2、安装redis
安装视频:https://www.bilibili.com/video/BV15e411W75G?p=25
docker-compose.yml文件内容
version: "3.1"
services:
redis:
image: daocloud.io/library/redis:5.0.7
restart: always
container_name: redis
environment:
- TZ=Asiz/Shanghai
ports:
- 6379:6379
3、RabbitMQ
1、RabbitMQ消息的可靠性
1、如果消息已经到达了RabbitMQ,但是RabbitMQ宕机了,消息时不会丢的
因为RabbitMQ的消息队列(Queue)有持久化机制
2、消费者在消费消息时,如果执行了一部分,还没有执行完,消费者宕机了,消息也不会丢
因为有手动ACK,当消费者告诉RabbitMQ已经消费完,才会删除消息
3、生产者发送消息时,由于网络问题,导致消息没发送到RabbitMQ,消息也不会丢
因为RabbitMQ提供了事务。保证消息100%传递(事务操作效率太低,比不加事务慢100倍)
RabbitMQ还提供了Confirm确认机制(比事务效率高很多,比不加事务的还是要慢一点点)
2、Confirm的3种方式
RabbitMQClient
//1. 获取Connection
Connection connection = RabbitMQClient.getConnection();
//2. 创建Channel
Channel channel = connection.createChannel();
1、普通Confirm方式
2、批量Confirm方式
3、异步Confirm方式