服务发现与配置管理高可用最佳实践|学习笔记(二)

简介: 快速学习服务发现与配置管理高可用最佳实践

开发者学堂课程【服务发现与配置管理高可用最佳实践服务发现与配置管理高可用最佳实践】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/968/detail/14889


三、服务发现高可用

服务发现包含两个角色服务消费者( Consumer ) 和服务提供者( Provider )。

(1) 消费者( Consumer ):

通过 MSE 提供推空保护、服务降级能力达到容灾的目的。

推空保护应对开头的案例,服务空列表推送到Consumer 时,可以自动缓存数据,不会报到下游,没有实例异常。

服务消费者会从注册中心上订阅服务提供者的实例列表。当遇到突发情况(例如,可用区断网,Provider端无法上报心跳)或注册中心(变配、重启、升降级)出现非预期异常时,都有可能导致订阅异常,影响服务消费者的可用性。

为了应对不可预知的情况下订阅列表异常,可以在Consumer侧配置推空保护。

(2) 服务提供者 ( Provider ):

可以通过注册中心和服务治理提供的容灾保护,离群摘除,无损下线能力,提升整体服务的可用性。

服务提供者容灾保护主要是用于避免集群在异常流量下出现雪崩。

1. Consumer 端-推空保护:

(1)Consumer没有推空保护:

假如 Provider 出现注册失败的异常(网络.SDK.bug.dns )的故障;

在注册中心可能就判断Provider心跳过期,使自动下线;

Consumer定位到空列表,业务就会中断报错。

(3) 开启了推空保护:

Consumer定位到空列表,会把空列表的变更丢弃,直接使用缓存来保障业务服务的可用。

开启方式:

(4)配置项

sCA:

spring.cloud.nacos.discovery.namingPushEmptyProtection=true Dubbo

持久化缓存目录,避免重启后丢失:

${user.home}/nacos/naming/${namespaceld}

2.Consumer 端-服务降级

服务降级是当下游的某一个接口出现异常时可以做一些策略上的保护。

例如:这个接口可能是不重要的功能,可能在下游的这个服务上有更重要的业务,也需要调用这个服务,可以通过特定的规则进行配置,将这个接口进行降低保证重要的功能可用性。((将宝贵的下游 Provider 资源保留给重要的业务 Consumer 使用))

服务降级的具体策略:包含返回 Null 值、返回 Exception 异常、返回自定义 JSON 数据和自定义回调

image.png

3.Provider 端-容灾保护

Provider的高可用有容灾保护。

(1) 无容灾保护能力:

业务类似于大促,可能都会有突发的流量。在突发请求量过来时,如果流量超过了容量水位,个别 Provider 可能就会发生故障,例如 java 应用可能就会发生一些短期的故障,会增加请求的延迟。整个 Provider 处理能力,吞吐量就下降。在这个时候,这个节点可能会发生异常,心跳可能续不上;

image.png

注册中心会将故障的节点摘除,剩余的流量就会就给剩下的节点;

如果流量还是比较大,剩余的节点可能负载也会变高,可能也会出现故障;

最后不断的循环过程,注册中心会将大部分的节点都摘除,最后全部流量的都会压给剩余的少量节点。可能100%流量就给剩下的两个节点。可以看到就是前面4个节点都有两个节点异常。剩下的流量这两个节点的大概也无法负载。最后所有的服务都不可用,100%不能提供服务。

(2) 开启容灾保护;

可以设定一个阈值。发生这个情况时,当故障的节点数量达到保护阈值时,注册中心会做保护的操作,会将这些流量返回所有的实例列表。

作用:将所有的流量都平摊给所有的机器。不管这个机器是否故障,会将原先所有的实例都返回给上游。所有的流量就会平摊里所有机器,从下图看到剩余的两个节点,只接收50%流量。

目的:在发生较大故障时,可以保护集群不会完全雪崩,至少能够保留50%的可用性。

(3)开启方式:

命令控制行;控制台开启(即将推出)

(3) 容灾保护在紧急的情况下,能够保证服务的可用性在一定的水平之上,所以它是一种兜底的策略。

4. Provider 端-离群实例摘除

心跳续约的是注册中心感知实例可用性的基本的一种方法,在注册中心也没有其他能力做探测。

(1) 在特定的情况下,会有心跳正常,但是服务不可用的情况

例如:专门处理业务请求的线程线程池满。Java 的进程是存活的,并且虚拟机没有异常,心跳是正常,只是线程池是满的,所以本质上是不可用的,但是注册中心还是会将他的可用性暴露给他的上游;

依赖的底层的 RDS 连接异常或者渗透慢,它可用性有损,但心跳不能完全感知到。

(2)微服务治理中心-离群实例摘除

基于异常检测的摘除策略:包含网络异常和网络异常+业务异常(HTTP 5xx);

设置异常阈值、 QPS 下限、摘除比例下限。

(3) 离群实例摘除对于可用性探测是一种补充,能够根据特定的接口的调用异常的特征去衡量服务可用性,所以它应该是更完备的机制补充心跳和可用性的标准。

5.Provider 端-无损下线(平滑下限)

(1)有损下线:

Provider 变更,升级或者是重启,下线的过程中,心跳在注册中心存约以及变更生效都有一定的时间,并且在存约失效之后,变更推送到它的上游也有一定的时间,所以在这个时间内,如果 Consumer的订阅列表没有更新,如果把 Provider 直接停止服务。那么 Consumer 的请求就会有一定的流量报错,直接损失。

(2)无损下线:

保障在下线的过程中不会有流量出现异常,有很多不同的解决方案,包括一些注册中心本身也是存在能力

通过推送些机制(对应用进行停止、部署、回滚、缩容、重置等操作),能够减少变更生效的时间,但是微服务治理中心提供无损下线的能力是侵入性最低的,并且能够让我们无感的去整合到发布的流程中,完全自动执行。

免去繁琐的运维脚本逻辑的维护。

 

四、配置管理高可用

配置管理主要包含配置订阅和配置发布两类操作。

配置管理:解决在多环境,多机器的配置发布以及配置动态实时更新推送的问题。

1.微服务基于配置管理做高可用的方案:

(1)发布环境管理:

通过基于配置环境管理的能力可以一致性管理上百个的机器,不同的环境如何能够正确的推送,能够避免些人为的误操作,或者是在出现线上问题的时候,能够将这些问题快速的回滚;发布的过程中可以做一些灰度。

(2) 业务开关动态推送:

实时的,能够推送到业务系统上,例如:一些功能或者活动页面的开关,

(3) 内置容灾降级预案:

预案通过配置直接推送下发,包括流量的阈值能实时通过配置去调整。

(4)双11大促配置管理高可用解决方案:

例如:消耗比较大的非核心的业务做降级;对一些服务配置白名单(一些重要的业务,在大促期间要做变更);禁用一些高风险的操作;调整日志采样;在系统压力大的时候去降级一部分的功能和一部分请求做限流。

image.png

2.配置管理客户端容灾方案:

例如:客户端本地的目录,主要分为两级,高优先级的是容灾目录,低优先级的是缓存目录。

当配置中心不可用的时候,本地的客户端的会优先查看容灾目录的配置,否则使用之前拉取到的配置。

(1)缓存目录∶每次客户端和配置中心进行数据交互后,会保存最新的配置内容至本地缓存目录中,当服务端不可用状态下,会使用本地缓存目录中内容。

(2)容灾目录:因为缓存目录里面可能不一定会有,或者业务可能需要紧急的变更配置,开启预案或者措施。如果这个时候配置中心不可用,需要容灾目录帮助业务绕开该配置中心的问题,解决配置下发的问题。总的来说,不管发生什么样的风险,我们都要能够使配置的客户端能够读取到正确的配置,从而保证微服务(整个系统)的可用性。

image.png

3.在配置中心高可用的方案:

(1)配置中心高可用:

针对读写的限流,例如:

限制连接数:特定的单机限流,可以支持特定的 IP 限流;

限写接口:特定的配置或发布操作的限流。

(2)配置发布:

控制人的风险,人做配置发布或者配置管理的过程中,可能会有一些误操作,例如环境看错或配置写错。配置发布也有一些、置是可灰度的,可以追溯它的发布历史,并且能够一键快速回滚。

相关文章
|
Ubuntu Linux
Linux常用发行版本软件包安装指南
Linux操作系统以其开源、灵活和高度定制的特性而备受欢迎。然而,对于初学者来说,熟悉不同发行版的软件包管理系统可能是一个挑战。本文将介绍在常见的Linux发行版(Ubuntu、CentOS、Alpine)上安装软件包的基本指南,以帮助用户轻松应对软件管理任务。
405 2
Linux常用发行版本软件包安装指南
|
Kubernetes 容器
K8S的Service的LoadBanlance之Metallb解决方案
本文介绍了如何在Kubernetes中使用MetalLB来实现Service的LoadBalancer功能,包括MetalLB的部署、配置、以及通过创建地址池和部署服务来测试MetalLB的过程。
535 2
K8S的Service的LoadBanlance之Metallb解决方案
|
10月前
|
机器学习/深度学习 数据采集 监控
如何使用机器学习模型来自动化评估数据质量?
如何使用机器学习模型来自动化评估数据质量?
|
11月前
|
消息中间件 存储 弹性计算
云消息队列 RabbitMQ 版实践解决方案评测
随着企业业务的增长,对消息队列的需求日益提升。阿里云的云消息队列 RabbitMQ 版通过架构优化,解决了消息积压、内存泄漏等问题,并支持弹性伸缩和按量计费,大幅降低资源和运维成本。本文从使用者角度详细评测这一解决方案,涵盖实践原理、部署体验、实际优势及应用场景。
|
XML Java 数据格式
【Spring】全面讲解IOC、AOP、注入方式、bean的生命周期、aop通知应用 spring与web容器整合
Spring是一个开源的轻量级Java应用开发框架,它提供了一种简单、高效、灵活的方式来构建企业级应用程序。Spring框架的核心特点是依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented Programming),它通过一组模块化的组件提供全面的支持,使开发人员能够快速搭建可扩展、可维护的应用。
|
存储 缓存 监控
Redis高可用之主从复制、哨兵、cluster集群
Redis高可用之主从复制、哨兵、cluster集群
365 0
|
算法 NoSQL 安全
Lettuce的特性和内部实现问题之Lettuce的多连接模式与连接池模式有何不同
Lettuce的特性和内部实现问题之Lettuce的多连接模式与连接池模式有何不同
298 2
|
Web App开发 数据安全/隐私保护 iOS开发
Mac 电脑如何安装Appium ?
Mac 电脑如何安装Appium ?
439 0
Mac 电脑如何安装Appium ?
|
存储 NoSQL 关系型数据库
MongoDB非关系型数据库实战
【5月更文挑战第6天】MongoDB,流行的NoSQL数据库,以其灵活的数据模型和高性能备受青睐。本文介绍了MongoDB的基础,包括文档型数据库特性、安装配置、数据操作。通过电商订单管理的实战案例,展示了MongoDB在处理复杂数据结构和大规模数据时的优势,适用于电商、游戏、视频直播等场景。MongoDB的索引、全文搜索和地理空间功能进一步增强了其实用性。注意性能优化和扩展性以确保系统稳定性和可靠性。
|
Dubbo Java 应用服务中间件
深度剖析:Dubbo使用Nacos注册中心的坑
2020年笔者在做微服务部件升级时,Dubbo的注册中心从Zookeeper切换到Nacos碰到个问题,最近刷Github又有网友提到类似的问题,就在这篇文章里做个梳理和总结。
深度剖析:Dubbo使用Nacos注册中心的坑