微服务框架下的服务治理
ApacheDubbo
ApacheDubbo是一个分布式服务框架,主要实现多系统之间的高性能,透明化服务调用。比普通的RPC框架体统了服务治理功能,如服务注册、监控、路由、容错等。
Dubbo配置
服务提供方
- 添加Dubbojar包
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.5</version>
</dependency>
- 配置文件说明
- 因为Dubbo的配置文件是根据Spring扩展的,所以内容基本上和Bean的xml一致。
- dubbo:application用来描述提供放的信息,比如应用名称、维护人、版本号等,应用名称必填,可以方便开发或维护人员定位问题。
- dubbo:registry配置服务提供者的协议信息,如果不需要注册中心,可以设置成N/A。Dubbo支持多种服务注册中心,如ZK,Nacos等
- dubbo:protocol配置服务提供者的协议信息,Dubbo支持多种协议,默认的是dubbo协议,还支持hessian等表示其他协议可以平滑迁移系统。
- dubbo:server用来描述要发布的服务接口,也就是本网络是可以供其他进程访问的服务。interface表示定义的接口,ref表示接口的具体实现。
- 加载Spring的xml可以使用 ClassPachXmlApplicationContext也可以通过Main.main(args)来启动,两者没有本质区别只是Dubbo做的一层封装。
- 启动之后可以在控制太看到启动信息就等于成功
服务消费者
- 注册dubbo和你需要使用的API
- dubbo:reference它会生成一个针对当前interface的远程服务的代理指的是发布方发布的Dubbo协议的URL地址
- 加载Spring配置文件,使用方式和Bean一样,通过IOC容器中获取一个代理对象,注意这个代理对象的底层是基于网络通信来实现的远程服务调用。
Zookeeper
Zookeeper安装
- 官网下载
- 解压到指定目录。conf是配置目录,bin是Zookeeper提供的可执行脚本
- ${Zookeeper_Home}\conf内提供了Zookeeper核心配置文件的样例文件zoo_sample.cfg,如果要将Zookeeper运行起来要将文件名称改成zoo.cfg
- ${Zookeeper_Home}\bin 目录下 执行sh zkServer.sh start启动服务
- 启动成功后可以通过默认的2181端口来进行访问,如果是同一台机器上,通过sh zkCli.sh即可连接到zk服务器,如果要在不同的机器上连接的命令是 sh zkCli.sh-server target-server-ip :2181.
Zookeeper的数据结构
- ZK的数据机构和分布式文件系统类似,是一种层次化的属性结构,但是ZK的数据是结构化存储的,在物理上没有体现出文件和目录。
- ZK的树中的每个节点被称为Znode,Znode会维护一个stat状态信息,其中包含了数据的变化和版本等信息,并且每一个Znode可以设置一个value值,但是Zk不是用来通信的数据库或大型对象存储的,所以value的值不建议设置太大,因为较大的值会需要更大的网络开销。他主要是用来做协调和管理有关数据。
- ZK没个节点都是支持读写的,读和写都是更改Znode的value的值,另外节点的创建和文件类型如果要创建3级节点必须保证他的前两级节点存在。
Zookeeper的特性
- Zookeeper下的Znode节点在创建的时候要设置几点类型
- 持久化节点,节点数据会持久化道硬盘上
- 临时节点,生命周期跟随应用,应用结束节点删除
- 有序节点,持久化节点和临时节点都是有序节点,
- 3.53 之后引入2种节点
- 容器节点,当容器节点下最后一个节点被删除,容器节点也会被删除
- TTL节点,针对持久化和临时节点我们可以设置一个存活时间,如果存活时间内节点内容没有被修改,节点就会被删除。
Watcher机制
Zookeeper提供针对Znode的监听机制
- getData():获取指定节点的value信息,并且可以注册监听,当监听的节点发生创建、修改、删除的时候会触发对应的事件。
- getChildren(),获取指定节点及下属所有自节点的信息,并且允许注册监听,当监听的节点发生创建、修改、删除的时候会触发对应的事件。
- exists,判断该节点是否存在,并且允许注册监听,监听类型和getData相同。
常见应用场景
分布式锁
- 分布式锁主要是利用临时节点和同层级下节点名称不能相同的特性来实现的。
- 获取锁的过程
- 在获得排他锁时,所有客户端都要去Zookeeper服务器上的/Exclusive_Locks上创建一个\lock。Zookeeper节点名称是唯一的,所以其他的客户端都会失败。
- 其他客户端通过watcher机制监听锁节点的变化来作出反应
- 释放锁的过程
- 获取锁的节点是临时节点,如果客户端断开了链接或者掉线,那么临时节点会被自动删除。
- 获取锁的客户端,完成使用,主动删除节点。
master选举
- 利用临时节点和同一基层节点名称不能重复的特性,来做master的选举。当master宕机之后其他的服务器,其他服务器会在master上创建一个/master_election节点,创建成功的服务器就是master,其他的监听/master_election节点来准备下一轮服务器选举。
- 利用临时有序节点,所有服务器都在Zookeeper上创建节点,编号最小的是master服务器,后边的监听前一个节点如图
ApacheDubbo集成Zookeeper实现服务注册
Zookeeper服务注册机制实现的原理
- Dubbo在服务注册到Zookeeper上之后会创建如图的树结构
- 这里URl是临时节点,这里使用临时节点的好处就是如果服务器掉线了,节点就会自动删除不需要我们自己关注。
- 当服务消费者启动时,就会对/providers节点下的所有子节点进行监听,这样可以随时感知上下线的动态,防止服务访问失败。并且消费者也会在/consumers中写下自己的url,这样可以便利查看Dubbo的服务正在被哪一个消费者使用。
- 这里可以看到服务注册和动态感知一共用到了,临时节点,持久化节点,监听等
- 基于临时节点的特性,可以用于服务器的自动上线和下线。
- 基于持久化节点的特性,可以在服务重启的时候自动恢复注册数据及订阅请求。
- 为了保证节点安全性问题,Zookeeper提供了ACL权限,Dubbo可以通过ACL设置验证信息。
- 根节点默认是/dubbo如果需要区分环境可以修改节点名称
Dubbo的高级功能
集群容错
容错模式
- Failover Cluster:失败自动切换,默认失败次数是2,如果失败了,服务器会自动去集群中切换服务器使用,失败次数可以通过retries来调整,但是次数越多性能消耗会加剧,这种容错模式一般用在读取中,因为其他操作会带来数据重复问题。
- Failfast Cluster:快速失败,失败之后立刻报错,也只会发起一次调用。通常用来幂等的写操作。比如新增操作,这是因为调用失败但是数据库写入可能已经成功了,失败是因为网络抖动等原因。
- Failsafe Cluster:失败安全,失败了不会抛出异常,直接忽略。
- Failback Cluster,失败后自动回复,失败后记录定时任务重新发起,这种用在消息通知模式,可以保证发送成功。
- Forking Cluster,并行调用,并行调用服务器中多个服务,只要有一个返回成功就终止。
- broadcast Cluster,广播通知所有服务器,主要用来提供服务提供者更新缓存和信息。
负载均衡
Dubbo提供4中负载均衡默认是Random
- Random ,随机算法,可以对性能较好的服务器设置较大权重,权重越高,几率越大。
- Random RoBin 轮询,按照公约后的权重比例轮询。
- LeastActive,最少活跃调用书,处理越慢的服务器调用次数越少。
- ConsistentHash,一致性Hash。相同参数的请求总是发送给同一个服务器。
服务降级
服务降级是指在特定时间提升主要服务的性能,降低边缘功能性能。
- 降级有多个层面
- 按照是否可自动化分为自动降级和人工降级。
- 按照功能可以分为读服务降级和写服务降级。
- 人工降级一般有前置性,自动降级更多来自系统的异常而自动触发的
- 故障降级:因为调用的服务挂了,网络波动,rpc返回异常,可以通过设置的兜底数据来返回。
- 限流降级,服务器提供的性能是有限,所以请求达到一定阈值时就会拒绝接下来的请求放到队列中排队。
Dubbo核心代码解析
- SPI机制
- 自适应扩展点。
- IOC和AOP
- Dubbo如何和Spring集成。
|