微服务架构下的服务治理
RPC
远程过程调用(Remote Procedure Call)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。
RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。【来自维基百科】
流程:
- 客户端调用客户端stub(client stub)。这个调用是在本地,并将调用参数push到栈(stack)中。
- 客户端stub(client stub)将这些参数包装,并通过系统调用发送到服务端机器。打包的过程叫 marshalling。(常见方式:XML、JSON、二进制编码)
- 客户端本地操作系统发送信息至服务器。(可通过自定义TCP协议或HTTP传输)
- 服务器系统将信息传送至服务端stub(server stub)。
- 服务端stub(server stub)解析信息。该过程叫 unmarshalling。
- 服务端stub(server stub)调用程序,并通过类似的方式返回给客户端。
Apache Dubbo
框架产生原因:
- 大规模服务化后,当服务提供者出现故障或需要动态扩容时,需要更新相关配置,维护成本非常高。实现服务的上下动态线感知及服务地址的动态维护就显得极为重要。
- 服务指标监控,需要根据不同服务的访问情况来合理的调控及分配服务器资源,提高机器利用率。
ZooKeeper
ZooKeeper是一个高性能的分布式协调中间件,主要解决分布式环境中各个服务进程的访问控制问题。ZooKeeper并不是注册中心,只是基于ZooKeeper本身的特性可以实现注册中心这个业务场景而已。
- Znode
- 安装注意:
- 默认下载的
zk_sample.cfg
,拷贝一份并命名为zk.cfg
- 在版本高于
3.5
时,8080
端口会被ZooKeeper Admin Server
占用,需要在zk.cfg
中配置admin.serverPort
进行配置。
- 默认下载的
- 数据结构【结构化层级存储】
- 安装注意:
ZooKeeper树中每个节点被称为 Znode
, Znode
维护了一个 stat
的状态信息,其中包含数据变化的时间和版本等。每个 Znode
可以设置一个 value
值,且每个节点的数据是允许读和写的。读:获得指定 Znode
上的 value
数据;写:修改指定 Znode
上的 value
数据。
- 类型【同级目录下,节点的名称必须是唯一的,根节点:/dubbo】
- 持久化节点:节点数据需要持久化到磁盘disk。
- 临时节点:节点的生命周期和创建该节点客户端生命周期保存一致。客户端会话结束,该临时节点会被自动删除。
- 有序节点:创建的节点后边会增加一个递增的序列,该序列在同一级父节点之下是唯一的。持久化节点或者临时节点也可以设置为由有序节点。
- 容器节点(3.5.3+):当容器节点下的最后一个子节点被删除时,容器节点就会被自动删除。
- TTL节点(3.5.3+):针对持久化节点或者持久化有序节点,可以设置存活时间,如果存活时间之内该节点没有任何修改并且没有任何子节点,就会被自动删除。
- Watcher机制【
Znode
的订阅/通知机制】- 设置观察操作API:
exists
,getChildren
,getData
- 触发观察操作API:
create
,delete
,setData
- 触发机制的说明:事件触发都是一次性的,客户端设置观察注册监听后,若服务节点发生数据修改,客户端会收到通知。但是当服务节点再次发生数据修改时,客户端无法收到Watcher事件。因此,客户端必须要在收到事件通知回调中再次注册事件。
- 设置观察操作API:
- 应用场景
- 分布式锁:分布式架构中,多进程对同一个共享资源的访问存在数据安全问题,需要通过锁的形式解决。结合锁的排他性,在获得锁、释放锁的的过程中实现多进程共享资源访问的控制。
- Master选举
- 同一级节点不能重复创建一个已经存在的节点,类比分布式锁。非Master节点注册Watcher事件,当有节点处于非存活状态下时,重新进行Master选举。
- 通过临时有序节点实现选举,临时节点具有时效性,有序节点会存在递增序列,在单次回话中借助递增序列,每个节点会按序排列,在按照后者看前者的原则,注册Watcher事件,当前置节点被删除时,当前节点的下一个节点则被选举为Master节点。
- RPC通信较为尖锐的问题:
- 服务动态上下线感知:维护服务配置管理,动态处理
- 负载均衡:结合实际情况,对服务配置资源进行合理的调度分配及管理
Apache Dubbo 高级应用
- 支持多种协议的服务发布,默认是
dubbo://
,还支持rest://
、webservice://
、thrift://
等。 - 支持多种不同的注册中心,如
Nacos
、ZooKeeper
、Redis
等。 - 支持多种序列化技术,如
avro
、fst
、fastjson
等。
服务治理应用举例:
- 集群容错:服务异常的优雅解决方案【实际应用中,查询操作建议使用默认的Failover策略,增删改操作建议使用Failfast策略】
- Failover:失败自动切换,默认重试次数 2,适用于读操作,事务性操作会带来数据重复的问题
- Failfast:快速失败,只发起一次调用,适用于幂等性的写操作,及时止损
- Failsafe:失败安全,忽略异常
- Failback:失败后自动回复,定时重发,适用于消息通知操作
- Forking:并行调用集群中多个服务,成功一个就返回
- Broadcast:广播调用所有服务的提供者,出现失败即为调用失败,适用于通知服务提供者更新服务或本地缓存资源
- 负载均衡:平衡服务提供方压力及请求转发
- Random:随机算法,针对性能优秀的服务器设置较大权重值,有更大几率随机选中
- RoundRobin:轮训,按照约定后的权重设置轮训比例
- LeastActive:最少活跃,处理较慢、性能较差会收到更少的请求
- ConsistentHash:一致性哈希,相同参数的请求会被分配到同一个服务提供者
- 服务降级:系统保护策略,根据业务场景将非必要服务进行关闭或降级
- 按照是否自动化可分为自动降级和人工降级
- 按照功能可分为读服务降级和写服务降级