1、什么是微服务的注册中心?
- 什么是注册中心
注册中心:服务管理,核心是有个服务注册表,心跳机制动态维护
服务提供者provider:启动的时候向注册中心上报自己的网络信息
服务消费者consumer:启动的时候向注册中心上报自己的网络信息,拉取provider的相关网络信息 - 为什么要用注册中心?
微服务应用和机器越来越多,调用方需要知道接口的网络地址,如果靠配置文件的方式去控制网络地址,对于动态新增机器,维护带来很大的问题 - 主流的注册中心
zookeeper、Eureka、consul、etcd等
2、分布式应用CAP理论知识
- CAP理论
指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可同时获得。 - 一致性(C)
在分布式系统中的所有数据备份,在同一时刻是否同样的值。(所有节点在同一时间的数据完 全一致,越多节点,数据同步越耗时)
强一致性(strong consistency)。任何时刻,任何用户都能读取到近一次成功更新的数据。
单调一致性 (monotonic consistency)。任何时刻,任何用户一旦读到某个数据在某次更新后的值,那么就不会再读到比这个值更旧的值。也 就是说,可获取的数据顺序必是单调递增的。
会话一致性(session consistency)。任何用户在某次会话中,一旦读到某个数据在某次更新后的值,那么在 本次会话中就不会再读到比这值更旧的值会话一致性是在单调一致性的基础上进一步放松约束,只保证单个用 户单个会话内的单调性,在不同用户或同一用户不同会话间则没有保障。
最终一致性(eventual consistency)。用户只能读到某次更新后的值,但系统保证数据将终达到完全一致 的状态,只是所需时间不能保障。
弱一致性(weak consistency)。用户无法在确定时间内读到新更新的值 - 可用性(A)
负载过大后,集群整体是否还能响应客户端的读写请求。(服务一直可用,而且是正常响应时间)。 - 分区容错性(P)
分区容忍性,就是高可用性,一个节点崩了,并不影响其它的节点(100个节点,挂了几 个,不影响服务,越多机器越好) 。 - CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。而由于当前的网络硬件肯定会出现延迟丢包 等问题,所以分区容忍性是我们必须需要实现的。所以我们只能在一致性和可用性之间进行权衡。
3、win、linux双环境安装zookeeper
- 简介:介绍如何在windows和linux环境下面安装zookeeper,方便开发调试以及正式部署
- 下载zookeeper zookeeper.apache.org/
- 配置jdk 参考以下博客配置 blog.csdn.net/qq_35246620…
- 解压下载好的zk 重命名conf目录下的zoo_sample.cfg 文件为zoo.cfg 并修改里面的内容,直接运行bin目录下的zkServer
- 主要配置项
tickTime 心跳基本时间单位,毫秒级,ZK基本上所有的时间都是这个时间的整数倍。
initLimit 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的多心跳数
syncLimit 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的多心跳数
dataDir 内存数据库快照存放地址,如果没有指定事务日志存放地址(dataLogDir),默认也是存放在这个 路径 下,建议两个地址分开存放到不同的设备上。 - centos下安装zk
tar -zxvf zookeeper-3.4.12.tar.gz -C /usr/local/
cd /usr/local/zookeeper-3.4.12/conf
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
# 修改dataDir /usr/local/zookeeper-3.4.12/data 将整个文件夹所属权赋予zookeeper用户
useradd zookeeper
chown -R zookeeper:zookeeper /usr/local/zookeeper-3.4.12
#切换到zookeeper用户
su zookeeper
cd /usr/local/zookeeper-3.4.12/bin
./zkServer.sh start
# 防火墙设置
firewall-cmd --zone=public --add-port=2181/tcp --permanent
firewall-cmd --reload
补充知识:centos7如何关闭防火墙?
1、firewalld的基本使用
启动: systemctl start firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld
开机禁用 : systemctl disable firewalld
开机启用 : systemctl enable firewalld
2.配置firewalld-cmd
查看版本: firewall-cmd --version
查看帮助: firewall-cmd --help
显示状态: firewall-cmd --state
查看所有打开的端口: firewall-cmd --zone=public --list-ports
更新防火墙规则: firewall-cmd --reload
那怎么开启一个端口呢
添加
firewall-cmd --zone=public --add-port=80/tcp --permanent (–permanent永久生效,没有此参数重启后失效)
重新载入
firewall-cmd --reload
查看
firewall-cmd --zone= public --query-port=80/tcp
删除
firewall-cmd --zone= public --remove-port=80/tcp --permanent
4、ZooKeeper数据模型
- zookeeper的数据模型类似于linux下的文件目录
/usr/local
/usr/local/tomcat - 每一个节点都叫做zNode,可以有子节点,也可以有数据
- 每个节点都能设置相应的权限控制用户的访问
- 每个节点存储的数据不宜过大
- 每个节点都带有一个版本号,数据变更时,版本号变更(乐观锁)
- 节点分永久节点跟临时节点(一旦session断开,这个时候,临时节点就会删除)
5、zookeeper常用命令之zkCli
- zkCli.sh 不填后面的参数,默认连接的就是localhost:2181
win下面运行的是.cmd结尾的文件,linux下运行的是.sh结尾的文件 - 连接远程服务器
zkCli.sh -timeout 0 -r -server ip:port
zkCli.sh -server 192.168.1.101:2181
- zkCli.sh h 出现相应的帮助信息
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
- 创建节点
create [-s] [-e] path data acl -s表示创建顺序节点 -e表示创建临时节点 data表示创建的节点的数据内容
[zk: localhost:2181(CONNECTED) 3] create -s /xdclass xdclass
Created /xdclass0000000001
[zk: localhost:2181(CONNECTED) 4] create -s /xdclass1 xdclass1
Created /xdclass10000000002
- 查看 获取节点的子节点 ls path
[zk: localhost:2181(CONNECTED) 5] ls /
[dubbo, xdclass0000000001, zookeeper, xdclass10000000002]
- 获取节点的数据 get path
[zk: localhost:2181(CONNECTED) 12] get /xdclass10000000002
xdclass1
cZxid = 0x17
ctime = Tue Jun 11 03:42:01 EDT 2019
mZxid = 0x17
mtime = Tue Jun 11 03:42:01 EDT 2019
pZxid = 0x17
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0
- 查看节点状态 stat path
[zk: localhost:2181(CONNECTED) 7] stat /xdclass0000000001
cZxid = 0x16 --事务id
ctime = Tue Jun 11 03:41:16 EDT 2019 --节点创建的时候的时间
mZxid = 0x16 --后一 次更新时的事务id
mtime = Tue Jun 11 03:41:16 EDT 2019 --后一次更新的时间
pZxid = 0x16 – 该节点的子节点列表后一次被修改的事务id
cversion = 0 --子节点列表的版本
dataVersion = 0 --数据内容的版本
aclVersion = 0 – acl版本
ephemeralOwner = 0x0 用于临时节点,表示创建该临时节点的事务id,如果当前的节点不是临时 节点,该字段值为0
dataLength = 7 数据内容的长度
numChildren = 0 子节点的数量
- 获取节点的子节点以及当前节点的状态 ls2 path
[zk: localhost:2181(CONNECTED) 15] ls2 /xdclass0000000001
[]
cZxid = 0x16
ctime = Tue Jun 11 03:41:16 EDT 2019
mZxid = 0x16
mtime = Tue Jun 11 03:41:16 EDT 2019
pZxid = 0x16
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
[zk: localhost:2181(CONNECTED) 16] create -e /xdclass0000000001/wiggin wiggin
Created /xdclass0000000001/wiggin
[zk: localhost:2181(CONNECTED) 17] ls2 /xdclass0000000001
[wiggin]
cZxid = 0x16
ctime = Tue Jun 11 03:41:16 EDT 2019
mZxid = 0x16
mtime = Tue Jun 11 03:41:16 EDT 2019
pZxid = 0x18
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 1
- 修改节点的数据 set path data [version]
[zk: localhost:2181(CONNECTED) 19] get /xdclass0000000001
xdclass
cZxid = 0x16
ctime = Tue Jun 11 03:41:16 EDT 2019
mZxid = 0x16
mtime = Tue Jun 11 03:41:16 EDT 2019
pZxid = 0x18
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 1
[zk: localhost:2181(CONNECTED) 20] set /xdclass0000000001 updatedata
cZxid = 0x16
ctime = Tue Jun 11 03:41:16 EDT 2019
mZxid = 0x19
mtime = Tue Jun 11 03:55:49 EDT 2019
pZxid = 0x18
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 10
numChildren = 1
- 删除节点数据 delete path [version] 删除节点,如果此时该节点有子节点,则不允许删除
[zk: localhost:2181(CONNECTED) 25] delete /xdclass0000000001
Node not empty: /xdclass0000000001
- 递归删除整个节点 rmr path
[zk: localhost:2181(CONNECTED) 21] ls /
[dubbo, xdclass0000000001, zookeeper, xdclass10000000002]
[zk: localhost:2181(CONNECTED) 22] rmr /xdclass10000000002
[zk: localhost:2181(CONNECTED) 23] ls /
[dubbo, xdclass0000000001, zookeeper]
6、ZooKeeper Session机制
- 用于客户端与服务端之间的连接,可设置超时时间,通过心跳包的机制(客户端向服务端ping包请求)检查心跳结束,session就过期
- session过期的时候,该session创建的所有临时节点都会被抛弃
7、ZooKeeper Watcher机制
- 对节点的watcher操作 get stat
针对每一个节点的操作,都可以有一个监控者,当节点发生变化,会触发watcher事件
zk中watcher是一次性 的,触发后立即销毁所有有监控者的节点的变更操作都能触发watcher事件 - 子节点的watcher操作(监控父节点,当父节点对应的子节点发生变更的时候,父节点上的watcher事件会被触 发) ls ls2 增删会触发、修改不会,如果子节点再去新增子节点,不会触发(也就是说,触发watcher事件一 定是直系子节点)
8、zookeeper的acl(access control lists)权限控制
- 针对节点可以设置相关的读写等权限,目的是为了保证数据的安全性
- 权限permissions可以指定不同的权限范围及角色
- 常用的命令
- getAcl 获取节点权限
- setAcl 设置节点权限
- addauth 输入认证授权信息,注册时输入明文密码,但是在zk里, 以加密的形式保存
- acl的组成 [scheme id permissions]
- scheme 授权机制
world下只有一个id,也就是anyone,表示所有人 world:anyone:permissions
auth 代表认证登录,需要注册用户有权限才可以 auth:user:password:permissions digest 需要密码加密才能访问 digest:username:BASE64(SHA1(password)):permissions(跟auth区别在于, auth明文,digest为密文)
ip ip:localhost:psermissions super 代表超管,拥有所有的权限; - id:允许访问的用户
- permissions:权限组合字符串
cdrwa
c create 创建子节点
d delete 删除子节点
r read 读取节点的数据
w write 写入数据
a admin 可管理的权限
cdrwa cdr cdw
[zk: localhost:2181(CONNECTED) 14] create /xdclass xdclass
Created /xdclass
[zk: localhost:2181(CONNECTED) 15] ls /
[xdclass, zookeeper]
[zk: localhost:2181(CONNECTED) 16] getAcl /xdclass
'world,'anyone
: cdrwa
[zk: localhost:2181(CONNECTED) 20] setAcl /xdclass auth:xdclass:xdclass:cdrwa
Acl is not valid : /xdclass
[zk: localhost:2181(CONNECTED) 22] addauth digest xdclass:xdclass
[zk: localhost:2181(CONNECTED) 23] setAcl /xdclass auth:xdclass:xdclass:cdrwa
cZxid = 0x3b
ctime = Tue Jun 11 20:25:09 EDT 2019
mZxid = 0x3b
mtime = Tue Jun 11 20:25:09 EDT 2019
pZxid = 0x3b
cversion = 0
dataVersion = 0
aclVersion = 1
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
- acl的使用场景
开发环境跟测试环境,使用acl就可以进行分离,开发者无权去操作测试的节点
生产环境上控制指定ip的服务可以访问相关的节点