目录
- 一. Sentinel简介
- 1.1Sentinel简介
- 1.2 Sentinel与Hystrix的区别
- 1.3 名词解释
- 二. sentinel控制台
- 2.1 下载启动控制台
- 2.3 客户端接入控制台
- 2.4 Rest整合Sentinel
- 2.5 Feign 整合Sentinel
- 想了解Sentinel具体的使用规则就点这里呀!!!
一. Sentinel简介
1.1Sentinel简介
- 源码地址
- 官方文档
- 详细的介绍请参考sentinel官方文档
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring
Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。 - 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快
速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 的主要特性:
1.2 Sentinel与Hystrix的区别
点这里查看区别
1.3 名词解释
Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard,但是结合
Dashboard 可以取得最好的效果。
使用 Sentinel 来进行熔断保护,主要分为几个步骤:
- 定义资源
- 定义规则
- 检验规则是否生效
资源:
可以是任何东西,一个服务,服务里的方法,甚至是一段代码。规则:
Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则和 热点参数规则。
Sentinel 的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效先把可能需要保护的资源定义好,之后再配置规则。也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。
二. sentinel控制台
2.1 下载启动控制台
- 获取 Sentinel 控制台
您可以从官方网站中下载最新版本的控制台 jar 包,此篇用的版本为1.6.3。点击下载 sentinel-dashboard-1.6.3.jar
- 启动
使用如下命令启动控制台:
注意:启动 Sentinel 控制台需要 JDK 版本为
1.8
及以上版本。
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.6.3.jar
其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080。
从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel。
- 访问
- 访问 http://localhost:8080/
- 输入用户密码,默认用户名和密码都是 sentinel。
2.3 客户端接入控制台
- 引入依赖
需要注意SpringCloud-Alibaba与SpringCloud的版本关系
Spring Cloud Versio | Spring Cloud Alibaba Version | Spring Boot Version |
---|---|---|
Spring Cloud Greenwich | 2.1.0.RELEASE | 2.1.XRELEASE |
Spring Cloud Finchley | 2.0.0.RELEASE | 2.0.XRELEASE |
Spring Cloud Edgware | 1.5.0.RELEASE | 1.5.XRELEASE |
此篇 SpringBoot-parent 版本为 2.3.9.RELEASE ,SpringCloud 版本为 Hoxton.SR10 ,Spring Cloud Alibaba 版本为 2.2.5.RELEASE。
父工程引入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
<relativePath/>
</parent>
<properties>
<spring-cloud.version>Hoxton.SR10</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- alibaba实现的SpringCloud-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
子工程中引入sentinel
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- 配置文件
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
- 访问
sentinel默认采用懒加载的方式,需要再次访问被监测的微服务才会有显示。
2.4 Rest整合Sentinel
- 配置降级方法
/* sentinel
定义降级逻辑
hystrix和sentinel的区别:
sentinel 可以指定 熔断执行的降级方法
也可以指定 抛出异常执行的降级方法
返回值和参数和被保护方法一致
*/
//熔断执行的降级方法
public String sentinelRestBack(int n) {
log.info("------User sentinel 服务降级 ------");
return "------User sentinel 服务降级 ------";
}
//抛出异常执行的降级方法
public String sentinelRestBackEX(int n) {
log.info("------User sentinel 服务降级 抛出异常 ------");
return "------User sentinel 服务降级 抛出异常 ------";
}
- 被保护的方法加注解 @SentinelResource
/** @SentinelResource
* blockHandler : 声明熔断时调用的降级方法
* fallback : 抛出异常时调用的降级方法
* value : 自定义资源名称,不设置的话就是当前全类名.方法名
* */
@SentinelResource(blockHandler = "sentinelRestBack",fallback ="sentinelRestBackEX" )
@GetMapping("/orderTest/{n}")
public String testHystrix(@PathVariable("n") int n) {
log.info("OrderController into ");
String url = "http://userservice/user/userTest/" + n;
String result = restTemplate.getForObject(url, String.class);
return result;
}
- 配置降级规则
选择要降级的资源,配置降级,根据业务需求配置降级规则。
这里配置个 异常数,异常数1发生异常的数量为1,时间窗口10发生降级的时间是10S。
- 测试
2.5 Feign 整合Sentinel
Feign 整合Sentinel 与 Feign整合Hystrix 的配置降级方式一致
Sentinel 适配了 Feign 组件。如果想使用,除了引入 sentinel-starter 的依赖外还需要 3 个步骤:
- 配置文件打开 sentinel 对 feign 的支持: feign.sentinel.enabled=true
- 加入 openfeign starter 依赖使 sentinel starter 中的自动化配置类生效
- 编辑降级方法
- 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--feign客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 配置文件-开启Sentinel的支持
feign:
sentinel:
enabled: true #开启 sentinel 的支持
- 配置Feign客户端
@FeignClient(name="userservice",fallback = UserClientBack.class)
public interface UserClient {
@GetMapping("/user/userTest/{n}")
String userTest(@PathVariable("n") int n);
}
- 配置降级方法
@Slf4j
@Component
public class UserClientBack implements UserClient {
@Override
public String userTest(int n) {
log.info(" feign userTest Sentinel 降级了");
return " feign userTest Sentinel 降级了";
}
}