天天看点

sentinel 学习文档实习中总结的sentinel的文档

实习中总结的sentinel的文档

官方文档:https://sentinelguard.io/zh-cn/docs/dashboard.html

1.特性

Sentinel 与 Hystrix 的对比

Sentinel Hystrix
隔离策略 基于并发数 线程池隔离/信号量隔离
熔断降级策略 基于响应时间或失败比率 基于失败比率
实时指标实现 滑动窗口 滑动窗口(基于 RxJava)
规则配置 支持多种数据源 支持多种数据源
扩展性 多个扩展点 插件的形式
基于注解的支持 即将发布 支持
调用链路信息 支持同步调用 不支持
限流 基于 QPS / 并发数,支持基于调用关系的限流 不支持
流量整形 支持慢启动、匀速器模式 不支持
系统负载保护 支持 不支持
实时监控 API 各式各样 较为简单
控制台 开箱即用,可配置规则、查看秒级监控、机器发现等 不完善
常见框架的适配 Servlet、Spring Cloud、Dubbo、gRPC 等 Servlet、Spring Cloud Netflix

2、下载使用

下载sentinel控制台 jar包地址:https://ithub.com/alibaba/Sentinel/releases

​ 通过java -jar启动sentinel ,默认sentinel占用的端口是8080 ,如果有改端口需求则更改对应端口即可。这里改为18080。

在jar包目录下启动命令行运行:

java -Dserver.port=18080 -jar  sentinel-dashboard-1.8.0.jar 
           

访问localhost:18080,打开本地控制台。

从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是sentinel。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xW7vtiQM-1628843889144)(sentinel demo文档.assets/1628071038326.png)]

3、基础配置

加入依赖管理和依赖

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>Hoxton.SR8</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>

		<!--springCloud-Alibaba-->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-alibaba-dependencies</artifactId>
			<version>2.2.1.RELEASE</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>

		<!--sentinel限流-->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
			<version>2.2.1.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-openfeign</artifactId>
			<version>2.2.2.RELEASE</version>
		</dependency>
	</dependencies>
           

注意自己修改端口等对应的信息,在这里sentinel使用来自定义的18080端口

server:
    port: 8080
spring:
    application:
      name: sentinel-demo
    cloud:
      sentinel:
        transport:
          dashboard: 127.0.0.1:18080
        eager: true
        datasource:
          ds1:
            file:
              file: classpath:flowrule.json
              data-type: json
              rule-type: flow
          ds2:
            file:
              file: classpath:degraderule.json
              data-type: json
              rule-type: degrade

           

启动类

@SpringBootApplication
public class SentinelMainApplication {

	public static void main(String[] args) {
		SpringApplication.run(SentinelMainApplication.class, args);
	}

}
           

需要流控的Controller类,示例代码

@RestController
public class DemoController {
   
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }

    @GetMapping("/resource")
    @SentinelResource(value = "test-resource", blockHandlerClass = {ExceptionUtil.class}, blockHandler = "exHandler")
    public String resource() {
        return "resource";
    }
}  
           

启动启动类

需要注意的是sentinel是懒加载的机制,也意味着需要访问一些上面Controller中的 /hello才会在sentinel后台看到服务

浏览器访问一下 http://localhost:8080//hello

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3jmHhkX1-1628843889147)(sentinel demo文档.assets/1628147140825.png)]

然后刷新一下sentinel后台 http://localhost:18080/#/dashboard/home

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dloDbuwH-1628843889148)(sentinel demo文档.assets/1628128462977.png)]

出现了对/hello的监控。

4、项目结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cWy7FtzQ-1628843889151)(sentinel demo文档.assets/1628242834923.png)]

1.DemoController.java:用于测试url限流、关联模式、按资源名称限流

2.ConfigDemoController.java:测试文件方式规则持久化

3.DegradeController:熔断降级测试

4.ParamController.java,SecurityController.java:黑白名单功能测试

5.DemoUrlBlockHandler.java:拦截信息自定义

6.ExceptionUtil.java:用于拦截资源请求的提示方法集合类

7.flowrule.json:存放本地流控规则

8.sentinel-dashboard-1.8.0.jar: sentinel控制台jar包。

5、流量控制

直接模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IQWtgVwN-1628843889153)(sentinel demo文档.assets/1628144441765.png)]

新增流量控制规则,对/hello端口进行流量控制,设置每秒最大访问次数2;这里默认直接模式,快速失败,其他模式选择高级选项。

快速访问/hello,查看结果。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TlYGSSGw-1628843889155)(sentinel demo文档.assets/1628144763772.png)]

系统默认的拦截信息,也可以自定义:

config包下创建DemoUrlBlockHandler.java

@Component
public class DemoUrlBlockHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
        httpServletResponse.getWriter().println("flow is limiting");
    }
}
           

关联模式

新增流量控制规则,打开高级选项:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xNWm5LiY-1628843889156)(sentinel demo文档.assets/1628146026738.png)]

Controller包下DemoController 添加:

@GetMapping("/helloA")
    public String helloA() {
        return "helloA";
    }
           

测试:

使用postman模拟密集访问/helloA接口,设置20个线程,每隔0.3秒访问一次。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cQk90xHM-1628843889157)(sentinel demo文档.assets/1628146750174.png)]

查看关联资源:/hello情况。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4DZ40h00-1628843889158)(sentinel demo文档.assets/1628146940863.png)]

说明:当关联资源/helloA的QPS阈值超过1时,就限制访问/hello。

链路模式

1、进入簇点链路下,查看/hello的资源入口是 sentinel_spring_web_context ;

2、添加流控,配置链路入口资源为sentinel_web_servlet_context ;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1wySdvzA-1628843889159)(sentinel demo文档.assets/1628148057148.png)]

3、当频繁访问接口/hello时,发现报错flow is limiting,表示被限流了。

按资源名称限流

@SentinelResource注解:用于定义资源,并提供了AspectJ的扩展用于自动定义资源、处理BlockException等 ;

DemoController中加入以下代码:

@GetMapping("/resource")
 @SentinelResource(value = "test-resource", blockHandlerClass = {ExceptionUtil.class}, blockHandler = "exHandler")
    public String resource() {
        return "resource";
    }
           

定义资源名称:test-resource

按资源名称添加流控规则:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2LL5edzW-1628843889160)(sentinel demo文档.assets/1628156027540.png)]

快速访问/resource:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZhkvQlyY-1628843889161)(sentinel demo文档.assets/1628156111731.png)]

6、规则持久化

一旦我们重启应用,Sentinel规则将消失,生产环境需要将配置规则进行持久化 。

这里使用本地文件持久化规则。

1.添加yml配置:

datasource:
          ds1:
            file:
              file: classpath:flowrule.json
              data-type: json
              rule-type: flow
           

2.resource下新建同名json保存规则:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u5wYhF4F-1628843889162)(sentinel demo文档.assets/1628215679503.png)]

3.写入规则:

[
  {
    "resource": "file-resource",
    "controlBehavior": 0,
    "count": 1,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0
  },
  {
    "resource": "test-resource",
    "controlBehavior": 0,
    "count": 1,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0
  }
]
           
  • resource:资源名,即限流规则的作用对象
  • count: 限流阈值
  • grade: 限流阈值类型(QPS 或并发线程数)
  • limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
  • strategy: 调用关系限流策略
  • controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)

4.启动服务。打开控制台。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jUt0xmV3-1628843889163)(sentinel demo文档.assets/1628215759988.png)]

7、熔断降级

新建DegradeController,产生异常进行测试。

public class DegradeController {
    int i=0;
    @GetMapping("/testD")
    public String message1() {
        i++;
        // 异常比例为0.333
        if (i % 3 == 0) {
            throw new RuntimeException("模拟异常");
        }
        return "degrade is testing";
    }
           

新建降级规则:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-95ObZqvl-1628843889163)(sentinel demo文档.assets/1628237532280.png)]

当异常比例大于0.25,每秒请求大于等于1;降级规则生效,熔断时长10秒,10秒后恢复正常。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NzCl9c70-1628843889164)(sentinel demo文档.assets/1628237689067.png)]

与Hystrix的熔断对比:

Hystrix常用的线程池隔离会造成线程上下切换的overhead比较大;Hystrix使用的信号量隔离对某个资源调用的并发数进行控制,效果不错,但是无法对慢调用进行自动降级;

Sentinel通过并发线程数的流量控制提供信号量隔离的功能;此外,Sentinel支持的熔断降级维度更多,可对多种指标进行流控、熔断,且提供了实时监控和控制面板,功能更为强大。

}
           
新建降级规则:

[外链图片转存中...(img-95ObZqvl-1628843889163)]

当异常比例大于0.25,每秒请求大于等于1;降级规则生效,熔断时长10秒,10秒后恢复正常。

[外链图片转存中...(img-NzCl9c70-1628843889164)]

**与Hystrix的熔断对比:**

Hystrix常用的线程池隔离会造成线程上下切换的overhead比较大;Hystrix使用的信号量隔离对某个资源调用的并发数进行控制,效果不错,但是无法对慢调用进行自动降级;

Sentinel通过并发线程数的流量控制提供信号量隔离的功能;此外,Sentinel支持的熔断降级维度更多,可对多种指标进行流控、熔断,且提供了实时监控和控制面板,功能更为强大。