微服务保护

雪崩问题

原因分析

一个微服务崩掉,导致调用这个微服务的其他微服务也崩掉,依次类推,造成大量微服务瘫痪

解决方案

保护服务提供者

请求限流:限制访问微服务的请求的并发量,避免服务因流量激增出现故障

隔离崩掉的服务

  1. 线程隔离:也叫做舱壁模式,通过限定每个业务能使用的线程数量而将故障业务隔离,避免故障扩散
  2. 服务熔断:由断路器统计请求的异常比例或慢调用比例,如果超出值则会熔断该业务,拦截该接口的请求。熔断期间,所有请求快速失败,全都走fallback逻辑

Sentinel

Sentinel是阿里巴巴开源的一款微服务流量控制组件,可以做到上述的方案

搭建sentinel控制台

下载jar包

下载地址:Releases · alibaba/Sentinel

运行

将jar包放在任意非中文、不包含特殊字符的目录下,重命名为sentinel-dashboard.jar

然后运行如下命令启动控制台:

bash 复制代码
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

-Dserver.port=8090:默认端口为8080,与原项目冲突,所以改为8090

-Dcsp.sentinel.dashboard.server=localhost:8090:修改控制台的端口

-Dproject.name=sentinel-dashboard:项目名称

其它启动时可配置参数可参考官方文档:启动配置项 · alibaba/Sentinel Wiki · GitHub

访问

访问 localhost:8090,如下

账号密码均为:sentinel

微服务整合

引入sentinel依赖

XML 复制代码
<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

配置控制台

修改application.yaml文件,添加下面内容:

XML 复制代码
spring:
  cloud: 
    sentinel:
      transport:
        dashboard: localhost:8090

调用几次整合好了的微服务模块,会出现对应的视图

簇点链路

簇点链路,就是单机调用链路,是一次请求进入服务后经过的每一个被Sentinel监控的资源链。默认Sentinel会监控SpringMVC的每一个Endpoint(http接口)。限流、熔断等都是针对簇点链路中的资源设置的。而资源名默认就是接口的请求路径:

Resful风格的API请求路径一般都相同,这会导致簇点资源名称重复。因此我们要修改配置,把请求方式+请求路径作为簇点资源名称:

XML 复制代码
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8090
      http-method-specify: true # 开启请求方式前缀

成功后如图:

请求限流

在簇点链路后面点击流控按钮,即可对其做限流配置:

阈值类型选择QPS,其他按照自己的需求配置

线程隔离

配置

在簇点链路后面点击流控按钮

阈值类型选择并发线程数,其他按照自己的需求配置

fallback

虽然实现了线程隔离,但是当服务线程被占满后又有新的请求来时,会直接拒绝这个请求并且报错然后卡住,用户体验就不好

当服务线程被占满后,新请求被拒绝后不报错,而是走fallback,提升用户体验

以下是实现步骤

将FeignClient作为Sentinel的簇点资源

修改对应微服务模块的application.yaml

XML 复制代码
feign:
  sentinel:
    enabled: true # 开启feign对sentinel的支持

编写fallback逻辑

使用FallbackFactory

在client对应的模块中

①自定义类,实现FallbackFactory,编写对某个FeignClient的fallback逻辑

②将刚刚定义的ItemClientFallbackFactory注册为一个Bean(在配置类中)

③在ItemClient接口中使用ItemClientFallbackFactory

重启服务,此时sentinel中为

这个时候我们就可以只对client的请求设置线程隔离,而不用对整个GET:/carts进行线程隔离了

服务熔断

熔断降级是解决雪崩问题的重要手段。思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出值则会熔断该服务,即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。

根据需求配置即可

相关推荐
AI成长日志1 天前
【AI原生开发实战】1.2 传统开发 vs AI原生开发:思维转变与架构差异
服务器·架构·ai-native
戮戮1 天前
Spring Cloud Gateway 零拷贝参数校验:一种高性能网关架构实践
java·网络·架构·gateway
LONGZETECH1 天前
汽车故障诊断仿真教学软件【哈弗M6PLUS】:技术架构、功能实现与落地实践
架构·汽车·职业教育·汽车仿真教学软件·汽车故障诊断
minji...1 天前
Linux 线程同步与互斥(二) 线程同步,条件变量,pthread_cond_init/wait/signal/broadcast
linux·运维·开发语言·jvm·数据结构·c++
xinlianyq1 天前
2026 边缘智能的崛起:端云协同架构下的“词元”调度艺术
人工智能·架构·api
2301_780789661 天前
零信任架构在云安全落地过程中的最佳实践
服务器·人工智能·游戏·架构·零信任
梓䈑1 天前
高性能 C++ 日志实战:spdlog 核心架构解析与最佳实践指南
c++·架构
提子拌饭1331 天前
番茄时间管理:鸿蒙Flutter 实现的高效时间管理工具
android·flutter·华为·架构·开源·harmonyos·鸿蒙
the sun341 天前
从 QEMU 直接启动到 U-Boot 引导:嵌入式 Linux 启动流程的本质差异
linux·运维·服务器
三思守心1 天前
从 0 到 1 搭建自动化内容工厂:深度测评楼兰AI及其在全平台发帖中的表现
运维·服务器·自动化