Skip to content

熔断限流(Sentinel)

概述

Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性,可以简单的分为 Sentinel 核心库和 Dashboard。

适用范围

Pangea v2.0.1.6+

快速上手

1、添加依赖

Sentinel的starter依赖已经添加到了盘古common-core核心包中,使用时,引入common包即可。

html
<!--pangea核心组件包 -->
<dependency>
    <groupId>com.hisense.pangea</groupId>
    <artifactId>pangea-common-core</artifactId>
    <version>${pangea.version}</version>
</dependency>

2、Feign中整合Sentinel

feign:
  sentinel:
    enabled: true

注意

只有开启了sentinel对feign的支持才可以实现自动配置

3、自定义需要调用的FeignClient

jsx
@FeignClient(name = "user-service", fallback = UserFeignClientFallback.class)
public interface UserFeignClient {
	@GetMapping("/user/get")
	public String getUser(@RequestParam("id") Long id);
}

4、定义 fallback 类 UserFeignClientFallback

jsx
@Component
public class UserFeignClientFallback implements UserFeignClient {
	@Override
	public String getUser(Long id) {
		return "fallback";
	}
}

5、feign的接口调用

jsx
@Autowired
private UserFeignClient userFeignClient;

@GetMapping("/testFeign")
public String testFeign() {
	return userFeignClient.getUser(1L);
}

接入控制台

1、添加依赖

使用 sentinel 的服务中引入 sentinel-transport 的依赖,因为我们的应用是作为客户端,通过transport模块与控制台进行通讯的,依赖如下所示:

html
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>x.y.z</version>
</dependency>

2、配置启动参数

可通过 properties 文件指定,配置文件的路径为 ${user_home}/logs/csp/${project.name}.properties

3、触发客户端连接控制台

触发一次客户端的规则才会开始进行初始化,并向控制台发送心跳和客户端规则等信息。客户端与控制台的连接初始化是在 Env 的类中触发的,即代码中的 InitExecutor.doInit()

html
public class Env {
    public static final NodeBuilder nodeBuilder = new DefaultNodeBuilder();
    public static final Sph sph = new CtSph();
    static {
        // If init fails, the process will exit.
        InitExecutor.doInit();
    }
}

4、埋点

html
public class Env {
@GetMapping("/testSentinel")
public @ResponseBody
String testSentinel() {
    String resourceName = "testSentinel";
    Entry entry = null;
    String retVal;
    try{
        entry = SphU.entry(resourceName,EntryType.IN);
        retVal = "passed";
    }catch(BlockException e){
        retVal = "blocked";
    }finally {
        if(entry!=null){
            entry.exit();
        }
    }
    return retVal;
}

5、连接控制台

应用接入 transport 模块之后,主动访问 /testSentinel 接口,客户端会主动连接上控制台,并将自己的ip等信息发送给控制台,并且会与控制台维持一个心跳。客户端连接上dashboard之后,可以定义的资源配置规则。

参考文档