以代码的方式实现在官方文档中都有详细的介绍,本小节主要就是以代码的方式实现流控规则和熔断降低规则。其他的可以参考官方文档。
Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。Dashboard就是Sentinel提供的web管理界面,核心库不依赖 Dashboard,但是结合 Dashboard 可以取得最好的效果。
Sentinel核心库就是我们java代码中需要引入的,我们可以不依靠Dashboard仅仅使用核心库来设置sentinel的一些规则。
使用 Sentinel 来进行资源保护,主要分为几个步骤:
- 定义资源
- 定义规则
- 检验规则是否生效
先把可能需要保护的资源定义好(埋点),之后再配置规则。
也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。
流控规则
第一步,引入maven坐标,如果单纯是使用sentinel核心库的话,是不需要依赖SpringCloud alibaba的,可以直接依赖spring-boot-starter-parent
因为它可以在分布式架构使用,并不一定是要在微服务架构中使用
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
</dependency>
第二步,创建controller层接口,并为该接口配置流控规则
sentinel所有的操作都是针对资源的,一个Rest接口其实就是对应的一个资源
package com.hs.springcloud.controller;
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 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 lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
/**
* @Description:
* @Author 胡尚
* @Date: 2022/6/20 18:49
* @Version 1.0
*/
@Slf4j
@RestController
@RequestMapping("/demo")
public class HelloController {
// 定义一个资源名
private static final String RESOURCE_NAME = "hello";
/**
* 定义sentinel流控规则
* @return 。
*/
@RequestMapping("/hello")
public String hello(){
Entry entry = null;
try{
// 1. sentinel针对资源进行限制的,定义一个资源名称
entry = SphU.entry(RESOURCE_NAME);
// 被保护的业务逻辑
String str = "hello world";
log.info("-----{}-----", str);
return str;
} catch (BlockException e) {
// 资源访问阻止,被限流或被降级,进行相应的处理操作