分布式服务治理
从RPC走向服务化
- 具体分布式业务场景里,除了能够调用远程方法RPC,我们还要考虑什么?
- 多个服务如何管理?
- 服务的注册发现机制?
- 如何负载均衡,路由集群?
- 熔断,限流等治理能力
- 心跳,重试等策略
-
RPC与分布式服务化区别
RPC
远程过程调用
- 需要考虑性能优化、易用性优化(spring-boot-starter封装)
-
分布式服务化
服务是业务语义,偏向于业务与系统的集成
- 关键的一部分是如何设计分布式的业务服务
-
分布式服务化与SOA/ESB的区别



RPC之上的增强
- 有状态的部分,放到配置/注册/元数据中心
- 无状态的部分,放到应用侧(具体来说是框架和配置部分,尽量不影响业务代码)
配置/注册/元数据中心
三大中心
- 配置中心
- ConfigCenter
- 管理系统需要的配置参数信息
- port/threads
- 注册中心
- RegistryCenter
- 管理服务注册/发现/协调
- 目前可用的服务
元数据中心
相同点
- 都需要保存和读取数据/状态
- 都支持变更通知
不同点
大规模集群下,如何管理配置信息,特别是批量更新问题
- 大公司和金融行业,要求开发、测试、运维分离(物理隔离)
-
解决方案
zookeeper
- etcd
- nacos
-
注册中心
背景
让消费者动态知道生产者集群的状态变化
-
解决方案
早起服务拉起后 echo “ok” > hello.html,消费者请求这个页面
- DNS
- VIP
- LVS
-
元数据中心
一般情况下,没有也没问题,有了更好
-
如何实现
核心要素
- 需要有存取数据的能力(配置中心、元数据中心),特别是临时数据(注册中心)
- 数据有更新时有实时通知机制,全量或增量两种方式
- 主流的基座,一般都可以使用namespace的概念,用来顶层隔离不同环境
- zk没有,但我们一般用第一个根节点作为namespace/group
ZK
- 集群大了会有性能问题
- 一般不使用zk的client,而是使用curator,其带了Guava的Cache,可以不用实时与zk交互
-
服务的注册/发现
注册
服务
- 启动时将自己注册到注册中心的临时节点
- 停止或宕机时,临时节点消失
数据格式
客户端
- 从注册中心代表服务的主节点拿到多个代表提供者的临时节点列表,并本地缓存
- 根据router和loadbalance算法从其中的某一个执行调用
- 如果可用的提供者集合发生变化,注册中心通知消费者刷新本地缓存的列表
-
服务的集群/路由
集群
对于完全相同能力的多个服务,希望协同工作,分摊处理流量
跟网关的路由一样
Random(dubbo默认)
- RoundRobin
- LeastActive
-
服务的过滤/流控
过滤
所有复杂的处理,都可以抽象为管道+过滤器模式(Channel+Filter)
可以用来实现额外的增强处理,也可以中断当前处理流程,返回特定的数据
流控
FlowControl
- 系统的容量是有限的
- 当系统有故障时可以选择保障部分关键服务的能力
- 需要流控的本质原因是输入请求大于处理能力
- 级别
- 限流
- 内部线程数
- 外部调用数
- 数据量大小
- 可用redis实现
- 降级
- 去掉不必要的业务逻辑
- 只保留核心逻辑
- 熔断
- 过载保护
- 系统短时间不提供新的业务处理,积压处理完后再恢复
- 推荐框架 sentinel,shiro
- 限流
