SpringCloud 运用(5)—— sentinel限流与seata分布式事务

发布于:2025-07-12 ⋅ 阅读:(20) ⋅ 点赞:(0)

阿里巴巴 Sentinel 是一个强大的、面向分布式服务架构的高可用流量防护组件,主要用于保障微服务架构下的系统稳定性。它主要提供了以下几个方面的功能:

  1. 流量控制:Sentinel 可以根据不同的条件(如QPS、线程数等)对流量进行控制,防止系统被瞬时的流量高峰冲垮,确保系统的稳定性和可用性。

  2. 熔断降级:当检测到某个服务出现异常或响应时间过长时,Sentinel 可以自动对该服务进行熔断,减少对其它服务的影响,并在一定时间后尝试恢复。

  3. 系统自适应保护:通过监控系统当前的负载情况(如CPU使用率),Sentinel 能够动态调整流量控制策略,保护系统免受过多请求的影响。

  4. 实时监控和规则管理:Sentinel 提供了丰富的监控数据视图以及灵活的规则配置方式,方便用户及时了解系统运行状态并对流量控制策略进行调整。

Sentinel 支持多种编程语言,包括Java、Go等,并且可以很好地与Spring Cloud、Dubbo等流行的微服务框架集成,为开发者提供了一站式的流量防护解决方案。

sentinel下载地址:

https://github.com/alibaba/Sentinel/releases

通过java -jar命令运行sentinel 

http://localhost:8080/#/login

启动成功后,打开sentinel,默认的账号密码为sentinel

SpringCloud项目需要导入sentinel依赖,连接sentinel服务器

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

配置sentinel服务器的地址,sentinel服务器默认情况下,调用接口后才会进行连接,为了启动时就进行连接,需要在配置中手动开启

spring:
  application:
    name: service-order #项目名称
    sentinel:
      transport:
        dashboard: localhost:8080 #sentinel控制台的访问地址
      eager: true #启动时加载sentinel规则

 定义/order请求每秒只能接受一个请求,如果请求数量超过一个将会阻塞

上面是sentinel默认的异常阻塞信息,我们可以在order微服务中自定义限流异常信息

package com.atguigu.exception;

import com.alibaba.csp.sentinel.adapter.spring.webmvc_v6x.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;

import java.io.PrintWriter;

@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, String resourceName, BlockException e) throws Exception {
        response.setContentType("application/json;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.write(resourceName + "被Sentinel限流了,原因"+e.getClass());
        writer.flush();
        writer.close();
    }
}

 这里是我们自定义返回的阻塞信息

但上面请求中,我们仅仅是对controller请求进行限流,那么我们如何给Service层方法进行限流呢? 

 @SentineResource用于对非controller层进行限流,blockHandler定义限流后返回的数据,若未定义回调数据,高并发环境下会被全局异常处理器拦截,如果都没有定义,在高并发环境下会抛出500异常

Seata 是一个由阿里巴巴开源的分布式事务解决方案,旨在解决微服务架构下的分布式事务问题。它提供了高性能和易于使用的分布式事务服务,支持多种分布式事务模式,帮助企业快速构建可靠的分布式应用。


apache-incubator-seata-2.1.0安装包下载_开源镜像站-阿里云

启动seata

账号密码,默认为seata

在resources下创建一个file.conf文件,配置seata的地址

service {
 vgroupMapping.default_tx_group = "default"
 default.grouplist = "127.0.0.1:8091"
 enableDegrade = false
 disableGlobalTransaction = false
}

重启服务器,可以查看到seata连接成功


在需要使用事务的方法中使用 @GlobalTransactional注解,即可实现分布式事务。


网站公告

今日签到

点亮在社区的每一天
去签到