服务保护方案Sentinel

微服务雪崩问题

微服务调用链路中某个服务故障,导致tomcat资源耗尽,引起整个链路中的所有微服务都不可用,这就是微服务的雪崩。

解决方案

请求限流

线程隔离

服务熔断

Sentinel

认识Sentinel

下载jar包

可以下载jar包,window运行,运行命令如下

复制代码
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar 
//此处是jar包的名称,若是你本地的jar包不与这个相同,则填写自己的jar包名称
sentinel-dashboard.jar

整合微服务

在微服务模块中整合sentinel,连接sentinel-dashboard控制台,步骤如下:

1)引入sentinel依赖

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

2)配置控制台

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

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

簇点链路

簇点链路,就是单机调用链路,是一次请求进入服务后经过的每一个被Sentinel监控的资源。默认情况下,Sentinel会监控SpringMVC的每一个Endpoint(接口)。

因此,我们看到/carts这个接口路径就是其中一个簇点,我们可以对其进行限流、熔断、隔离等保护措施。

不过,需要注意的是,我们的SpringMVC接口是按照Restful风格设计,因此购物车的查询、删除、修改等接口全部都是/carts路径,默认情况下Sentinel会把路径作为簇点资源的名称,无法区分路径相同但请求方式不同的接口,查询、删除、修改等都被识别为一个簇点资源,这显然是不合适的。

所以我们可以选择打开Sentinel的请求方式前缀,把请求方式 + 请求路径作为簇点资源名:

首先,在cart-service的application.yml中添加下面的配置:

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

请求限流

线程隔离

需要注意的是,默认情况下SpringBoot项目的tomcat最大线程数是200,允许的最大连接是8492,单机测试很难打满。所以我们需要配置一下cart-service模块的application.yml文件,修改tomcat连接:

复制代码
server:
  port: 8082
  tomcat:
    threads:
      max: 50 # 允许的最大线程数
    accept-count: 50 # 最大排队等待数量
    max-connections: 100 # 允许的最大连接

FallBack服务降级

OpenFeign整合Sentinel

修改微服务模块的application.yml文件,开启Feign的sentinel功能,将FeignClient作为Sentinel的簇点资源:

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

步骤一

在hm-api模块中给ItemClient定义降级处理类,实现FallbackFactory:

复制代码
@Slf4j
public class ItemClientFallback implements FallbackFactory<ItemClient> {
    @Override
    public ItemClient create(Throwable cause) {
        return new ItemClient() {
            @Override
            public List<ItemDTO> queryItemByIds(Collection<Long> ids) {
                log.error("远程调用ItemClient#queryItemByIds方法出现异常,参数:{}", ids, cause);
                // 查询购物车允许失败,查询失败,返回空集合
                return CollUtils.emptyList();
            }

            @Override
            public void deductStock(List<OrderDetailDTO> items) {
                // 库存扣减业务需要触发事务回滚,查询失败,抛出异常
                throw new BizIllegalException(cause);
            }
        };
    }
}

步骤二

配置类添加这个Bean,ItemClientFallback注册为一个Bean,交给spring

步骤三

ItemClient接口中使用ItemClientFallbackFactory:

服务熔断

等等

其他的可以参照官网

复制代码
https://sca.aliyun.com/docs/2023/user-guide/sentinel/quick-start/?spm=5176.29160081.0.0.74801d28u7TDCi
相关推荐
喵个咪2 小时前
开箱即用的GO后台管理系统 Kratos Admin - 定时任务
后端·微服务·消息队列
工业互联网专业9 小时前
基于springcloud微服务架构的巡游出租管理平台
java·vue.js·spring cloud·微服务·毕业设计·源码·课程设计
陌言不会python10 小时前
谷粒微服务高级篇学习笔记整理---thymeleaf
笔记·学习·微服务
喻米粒062213 小时前
RabbitMQ消息相关
java·jvm·spring boot·spring·spring cloud·sentinel·java-rabbitmq
极客先躯1 天前
高级java每日一道面试题-2025年3月21日-微服务篇[Nacos篇]-什么是Nacos?
java·开发语言·微服务
程序员ys1 天前
微前端是什么?
微服务·架构·前端框架
kill bert1 天前
第32周Java微服务入门 微服务基础
java·开发语言·微服务
Mia@2 天前
网络通信&微服务
微服务·云原生·架构
Julian.zhou2 天前
MCP服务:五分钟实现微服务治理革命,无缝整合Nacos/Zookeeper/OpenResty
人工智能·微服务·zookeeper·交互·openresty
冰 河2 天前
《Mycat核心技术》第21章:高可用负载均衡集群的实现(HAProxy + Keepalived + Mycat)
分布式·微服务·程序员·分布式数据库·mycat