在 spring boot 中使用 sentinel 非常方便,spring cloud alibaba 提供了 spring-cloud-starter-alibaba-sentinel
组件,可以快速将 sentinel 集成到你的 spring boot 应用中,并利用其强大的流量控制和容错能力。
下面是一个详细的步骤指南
步骤 1: 添加 sentinel 依赖
首先,需要在你的 pom.xml
文件中添加 spring cloud alibaba sentinel 的依赖。确保你已经配置了 spring cloud alibaba 的依赖管理 (spring-cloud-alibaba-dependencies
)。
<dependency> <groupid>com.alibaba.cloud</groupid> <artifactid>spring-cloud-starter-alibaba-sentinel</artifactid> </dependency>
如果你需要使用 sentinel 的持久化功能,例如将规则持久化到 nacos 配置中心,还需要添加相应的依赖,例如:
<dependency> <groupid>com.alibaba.cloud</groupid> <artifactid>spring-cloud-starter-alibaba-nacos-config</artifactid> </dependency> <dependency> <groupid>com.alibaba.csp</groupid> <artifactid>sentinel-datasource-nacos</artifactid> </dependency>
步骤 2: 配置 sentinel
在 application.properties
或 application.yml
文件中配置 sentinel 的基本信息。 至少需要配置 sentinel 控制台的地址,以便你可以通过控制台查看监控数据和管理规则。
spring: application: name: your-spring-boot-app # 应用名称,sentinel 控制台中会显示 cloud: sentinel: transport: dashboard: localhost:8080 # sentinel 控制台的地址 (默认端口 8080) port: 8719 # sentinel 客户端与控制台通信的端口,默认 8719,可以自定义,避免冲突 # 如果需要持久化规则到 nacos,还需要配置 nacos 相关信息 # nacos: # config: # server-addr: your-nacos-server-address:8848
注意: 你需要先启动 sentinel 控制台,才能在控制台中看到你的 spring boot 应用的监控数据和配置规则。 你可以从 sentinel 的 github 仓库下载 sentinel 控制台的 jar 包并启动。
步骤 3: 定义受保护的资源
在 spring boot 中,你可以使用以下方式来定义需要 sentinel 保护的资源:
方式一:使用 @sentinelresource
注解
这是最常用的方式,通过在方法上添加 @sentinelresource
注解,可以声明该方法为一个受保护的资源。
import com.alibaba.csp.sentinel.annotation.sentinelresource; import com.alibaba.csp.sentinel.slots.block.blockexception; import org.springframework.stereotype.service; @service public class myservice { @sentinelresource(value = "myresource", blockhandler = "handleblock") public string dosomething() { // 业务逻辑 return "success"; } // blockhandler 方法,用于处理 blockexception,即限流、熔断等 block 情况 public string handleblock(blockexception e) { return "blocked by sentinel: " + e.getclass().getsimplename(); // 返回被 sentinel 拦截的提示信息 } }
@sentinelresource(value = "myresource")
:value
属性指定资源的名称,在 sentinel 控制台中会显示这个名称。blockhandler = "handleblock"
:blockhandler
属性指定了当资源被限流、熔断等 block 时,应该调用的 blockhandler 方法。handleblock
方法的签名需要和被保护的方法一致,但最后一个参数必须是blockexception
类型。blockhandler
方法负责处理 block 逻辑,例如返回友好的提示信息或执行降级操作。
方式二:编程式 api 定义资源
除了注解,你也可以使用 sentinel 提供的编程式 api 来定义资源,这种方式更加灵活,可以更细粒度地控制资源的入口和出口。
import com.alibaba.csp.sentinel.entry; import com.alibaba.csp.sentinel.sphu; import com.alibaba.csp.sentinel.tracer; import com.alibaba.csp.sentinel.slots.block.blockexception; import org.springframework.stereotype.service; @service public class myservice { public string dosomethingprogrammatically() { entry entry = null; try { entry = sphu.entry("myprogrammaticresource"); // 定义资源名 // 被保护的业务逻辑 return "success from programmatic resource"; } catch (blockexception e) { // 处理 blockexception,例如限流、熔断等 return "blocked by sentinel (programmatic): " + e.getclass().getsimplename(); } catch (exception ex) { // 业务逻辑异常,需要记录到 sentinel 的异常统计中 tracer.traceentry(entry, ex); throw ex; } finally { if (entry != null) { entry.exit(); // 保证 exit() 被调用,否则会导致统计数据不准确 } } } }
sphu.entry("myprogrammaticresource")
:sphu.entry()
方法用于定义一个资源入口,参数为资源名称。 它会返回一个entry
对象,用于标记资源的入口。entry.exit()
: 在finally
块中调用entry.exit()
,表示资源调用结束。 必须确保entry.exit()
被调用,否则会导致 sentinel 的统计数据不准确。blockexception
捕获: 需要捕获blockexception
异常,并处理限流、熔断等 block 情况。tracer.traceentry(entry, ex)
: 如果业务逻辑发生异常,需要使用tracer.traceentry()
方法将异常信息记录到 sentinel 的异常统计中。
步骤 4: 配置流控规则
定义了受保护的资源后,你需要配置流控规则,告诉 sentinel 如何对这些资源进行保护。 你可以通过以下方式配置规则:
方式一:在 sentinel 控制台配置
这是最推荐的方式,通过 sentinel 控制台,你可以可视化地配置和管理规则,实时生效,无需重启应用。
- 访问 sentinel 控制台: 访问你在
application.properties
中配置的spring.cloud.sentinel.transport.dashboard
地址(默认http://localhost:8080
)。 - 找到你的应用: 在控制台的 “簇点链路” 或 “机器列表” 中找到你的 spring boot 应用。
- 配置规则: 在 “流控规则”、“降级规则”、“热点规则” 等菜单中,为你的资源配置相应的规则。 例如,为 “myresource” 配置一个 qps 为 2 的流控规则。
- 按如下操作
添加“流控”规则
添加“熔断”机制
方式二:在代码中编程式配置规则
你也可以在代码中编程式地配置规则,这种方式更适合自动化配置或单元测试。
import com.alibaba.csp.sentinel.slots.block.ruleconstant; import com.alibaba.csp.sentinel.slots.block.flow.flowrule; import com.alibaba.csp.sentinel.slots.block.flow.flowrulemanager; import org.springframework.boot.commandlinerunner; import org.springframework.stereotype.component; import java.util.arraylist; import java.util.list; @component public class flowruleconfig implements commandlinerunner { @override public void run(string... args) throws exception { initflowrules(); } private void initflowrules() { list<flowrule> rules = new arraylist<>(); flowrule rule = new flowrule(); rule.setresource("myresource"); // 资源名称,与 @sentinelresource 注解中的 value 对应 rule.setgrade(ruleconstant.flow_grade_qps); // 流控类型:qps rule.setcount(2); // qps 阈值为 2 rules.add(rule); flowrulemanager.loadrules(rules); // 加载规则 } }
flowrule
:flowrule
对象表示一个流控规则。rule.setresource("myresource")
: 指定规则应用于哪个资源,需要与@sentinelresource
注解或编程式 api 中定义的资源名称一致。rule.setgrade(ruleconstant.flow_grade_qps)
: 设置流控类型为 qps (每秒请求数)。rule.setcount(2)
: 设置 qps 阈值为 2,即每秒钟只允许 2 个请求通过。flowrulemanager.loadrules(rules)
: 加载配置好的规则列表。
步骤 5: 启动 sentinel 控制台和 spring boot 应用
- 启动 sentinel 控制台: 下载 sentinel 控制台的 jar 包,并使用
java -jar sentinel-dashboard.jar
命令启动。 默认访问地址为http://localhost:8080
,默认用户名密码都是sentinel
。 - 启动 spring boot 应用: 启动你的 spring boot 应用。
步骤 6: 测试和监控
- 访问受保护的接口: 访问你应用中被
@sentinelresource
或编程式 api 保护的接口。 - 观察 sentinel 控制台: 在 sentinel 控制台中,你可以看到你的应用的监控数据,例如 “簇点链路” 中会显示资源的请求量、通过量、拒绝量、平均响应时间等指标。
- 测试流控效果: 尝试以超过你配置的流控阈值的速率访问受保护的接口,你会看到部分请求被 sentinel 拦截,并返回你在
blockhandler
方法中定义的提示信息。
高级特性 (可选)
sentinel 还提供了很多高级特性,你可以根据实际需求进行探索和使用,例如:
- 降级规则 (degrade rule): 配置熔断降级规则,当服务的错误率或响应时间超过阈值时,自动熔断,防止故障扩散。
- 热点参数限流 (hot-spot param flow control): 根据请求的热点参数进行限流,例如根据用户 id、商品 id 等。
- 系统规则 (system rule): 从系统全局负载角度进行保护,例如根据 cpu 使用率、load、内存使用率等进行自适应限流。
- 授权规则 (authority rule): 进行黑白名单授权控制,限制特定来源的请求访问。
- 持久化规则 (rule persistence): 将规则持久化到 nacos、zookeeper、redis 等配置中心,实现规则的动态更新和集群共享。
- 自定义 blockhandler 和 fallback: 更灵活地处理 blockexception 和业务异常,实现更精细的降级策略。
- 集群流控 (cluster flow control): 对集群中的多个实例进行统一的流量控制。
总结
使用 spring cloud alibaba sentinel 在 spring boot 中实现限流、熔断降级是非常简单的。 通过添加依赖、配置 sentinel 控制台地址、定义受保护的资源、配置规则,你就可以快速为你的 spring boot 应用增加一层强大的保护屏障,提升系统的稳定性和容错能力。 sentinel 提供的可视化控制台和丰富的特性,也使得流量控制和容错管理更加便捷高效。
到此这篇关于springboot 中使用sentinel的详细步骤的文章就介绍到这了,更多相关springboot 使用sentinel内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论