前端带你学后端系列 ⑧【Nacos、Sentinel】
Ⅰ Nacos系列
① 什么是 Nacos?
Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理。
Nacos 的关键特性包括:
1.服务注册、服务发现
服务注册:就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去。
服务发现:就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。
服务注册的原理:客户端
向这个服务端发起http请求
,服务端接收到请求之后
,会将这个instance实例加入到这个阻塞队列里面
,然后客户端
会异步的开启一个线程来读取这个实例以及实例的各个参数
,并且通过写时复制的方法,将这个实例注册到一个双重注册表里面的一个set集合
里面去。
服务发现的原理:在进行服务注册之后
,该服务就会去这个服务注册中心里面拉取
全部的微服务实例,会将全部的实例存在本地的缓存里面
,并且同时会去开启一个定时任务
,每隔几秒就会去拉取
一次最新的微服务实例。
2.动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
Nacos 提供了一个简洁易用的UI
(控制台样例 Demo) 帮助您管理所有的服务和应用的配置
。
动态配置消除
了配置变更
时重新部署
应用和服务的需要,让配置管理变得更加高效和敏捷。
3.动态 DNS 服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。
4.服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
① 服务注册、服务发现细节
- 自动注册:Nacos提供了无缝的服务注册机制。
当新服务启动时
,它会自动向Nacos注册中心注册
自身,使得服务的存在状态实时可感知。 - 动态发现:当一个服务需要调用其他服务时,它可以
通过Nacos主动地动态地获取可用服务的列表
,而不必事先硬编码或手动配置服务地址
。 - 实时健康检查:Nacos不仅能够发现服务的存在,还能够实时监测服务的健康状况。通过定期的健康检查,Nacos可以
及时发现并剔除不可用的服务节点
,确保系统的稳定性和可用性。 - 命名空间与分组:Nacos的
命名空间和分组特性
为多租户
和复杂系统提供了更细粒度的管理。
② 动态配置管理细节
- 配置注册与获取:自动注册以后,数据会被客户端收到。各个服务端会把数据主动获取并缓存到本地。
- 多环境配置:Nacos支持
命名空间
的概念,可以在不同的命名空间中管理不同环境的配置
。这样就可以在开发、测试、生产
等不同环境中使用不同的配置。 - 配置组和配置集:配置可以按照
配置组
进行管理,例如,可以将相同业务线的配置放在同一个组中
。配置集是配置的唯一标识
。 - 版本管理与回滚:Nacos支持配置的版本管理,可以查看历史版本的配置,并恢复到先前的某个版本。
③ 动态DNS细节
- 权重路由:权重路由是一种
根据权重值来分配流量
的方式。在动态DNS服务中,可以为同一个域名配置多个IP地址,并为每个地址分配一个权重值。权重越高
的地址,接收到的流量就越多
。这种方式可以用于实现负载均衡,确保流量更均匀地分布到不同的服务器上
。 - 流量控制:流量控制是指根据一定的策略和规则来管理流量的过程。在动态DNS服务中,可以通过调整DNS记录的权重、TTL(Time to Live)等参数来实现流量的控制。
④ 服务及其元数据管理细节
- 服务的描述与生命周期管理:Nacos允许对
每个服务进行详细的描述
,包括服务的名称、版本、描述等信息,以便更好地理解和标识服务。Nacos支持对服务的生命周期进行管理,包括服务的注册、注销、健康检查等阶段,确保服务的正常运行和动态变更。 - 服务的静态依赖分析:Nacos提供了服务之间的
依赖关系分析
,可以查看服务的静态依赖关系,帮助了解服务之间的关联。 - Metrics统计数据:Nacos集成了Metrics统计数据,可以收集和展示服务的关键性能指标,帮助进行性能监控和故障排除。
Ⅱ Sentinel系列
① 什么是Sentinel?
随着分布式系统变得越来越流行,服务之间的可靠性变得比以往任何时候都更加重要。如果A服务调用B服务不通的话,很可能导致内存溢出,甚至服务雪崩等效果。Sentinel以“流”为切入点,并在流控制, 流量整形,电路中断和系统自适应保护等多个领域工作,以确保微服务的可靠性和弹性。
② 了解服务雪崩以及常用的容错方案
常见的容错思路有隔离(各个独立,互不影响)
、超时(设置最大响应时间,超时主动断开)
、限流(到达阈值减少流量)
、熔断(达到阈值,上游主动切断)
、降级(服务崩了保底操作)
等
③ Sentinel的主要功能
流量控制和熔断降级
④ 控制台功能的使用
① 簇点链路
列表:用于展示服务所有接口,包含通过QPS、拒绝QPS、线程数、平均RT、分钟通过、分钟拒绝等信息。可以点击按钮,跳到对应操作的界面。
② 流控规则
监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
① 【阈值类型】基于QPS限流
QPS:
就是每秒请求的数量。
对于test接口每秒请求量大于1的时候开始限流。
② 【阈值类型】基于并发线程数限流
一个HTTP请求就是一个线程
。
比如咱们test请求,是sleep10分钟。当我们发送第三个请求过去的时候,就限流了。
③ 知识补充:流控模式与流控效果
① 流控模式
sentinel中,流控模式共三种:
直接、关联、链路
直接模式
对资源的请求达到设置的规则阈值时直接对该资源触发流量控制。
关联模式
当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢
,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流
来避免具有关联关系的资源之间过度的争抢,举例来说,read_db 和 write_db 这两个资源分别代表数据库读写,我们可以给 read_db 设置限流规则来达到写优先的目的
:设置 strategy 为 RuleConstant.STRATEGY_RELATE 同时设置 refResource 为 write_db。这样当写库操作过于频繁时,读数据的请求会被限流。
链路模式
这个模式很好理解,尤其是在微服务间相互调用情况下尤为常见(a->b->d)
假设我以a为入口资源,d为终点资源,对这条链路进行限制的话,则资源a,b,d均会被限制访问。
② 流控效果
sentinel中,流控效果共三种:
快速失败、Warm Up(预热)、排队等待
快速失败
当QPS或线程数超过任意规则的阈值后,新的请求就会被立即拒绝
,拒绝方式为抛出FlowException。
Warm Up(预热)
当流量突然增大的时候,我们常常会希望系统从空闲状态到繁忙状态的切换的时间长一些
。即如果系统在此之前长期处于空闲的状态,我们希望处理请求的数量是缓步的增多
,经过预期的时间以后,到达系统处理请求个数的最大值。Warm Up(冷启动,预热)模式就是为了实现这个目的的。
排队等待
严格控制请求通过的间隔时间,让请求以均匀的速度通过,对应的是漏桶算法。 只能对请求进行排队等待
④ 【流控模式】基于关联与链路的限流
关联
当接口test1每秒访问量达到5时,/test接口将被限流无法访问。
链路
例如:A、B两个接口都调用某一资源C,A->C、B->C可以看成两个简单的链路,此时可以针对C配置链路限流,比如限制A调用C,而B调用C则不受影响。
访问http://localhost:10001/test发现已被限流,而http://localhost:10001/test1则不受影响
⑥ 【流控效果】基于快速失败与预热/冷启动与排队等待的限流
快速失败:默认的。
预热/冷启动
排队等待
⑦ 这三种模式排列组合的使用。
流控模式与流控效果必须相结合使用
,在未显示的指定模式与效果的时候,默认是直接模式+快速失败
效果
根据排列组合,一共可以使用 。
233=18种模式
这些大家自由发挥吧,就不过多介绍了。
③ 熔断降级规则
① 【熔断策略】基于慢调用比例限流
选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
② 【熔断策略】基于异常比例限流
当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
③ 【熔断策略】基于异常数限流
当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
④ 热点规则
快速访问http://localhost:10002/test2?userId=111111多次发现被限流,访问http://localhost:10002/test2?userId=22222222则正常;
看我们的配置
⑤ 授权规则
⑥ 系统规则
CPU 阈值0.1。 超过以后被限流