| Sentinel | Hystrix | |
|---|---|---|
| 产生背景 | 阿里巴巴公司 | Netflix公司 |
| 用途 | 服务容错框架 | 服务容错框架 |
| 支持语言 | Java、Go、C++ | Java |
| 支持功能 | 流量控制、熔断降级、系统自适应保护 | 流量控制、熔断降级 |
| 线程模型 | 单线程模型 | 多线程模型 |
| 监控中心 | 自带的Sentinel控制台 | 需要借助Hystrix Dashboard |
| 配置方式 | 通过规则或代码配置 | 通过注解或配置文件 |
| 隔离策略 | 信号量隔离 | 线程池隔离/信号量隔离 |
| 熔断降级策略 | 基于响应时间或失败比率 | 基于失败比率 |
| 实时指标实现 | 滑动窗口 | 滑动窗口(基于 RxJava) |
| 规则配置 | 支持多种数据源 | 支持多种数据源 |
| 扩展性 | 多个扩展点 | 插件的形式 |
| 基于注解的支持 | 支持 | 支持 |
| 限流 | 基于 QPS,支持基于调用关系的限流 | 不支持 |
| 流量整形 | 支持慢启动、匀速器模式 | 不支持 |
| 系统负载保护 | 支持 | 不支持 |
| 控制台 | 开箱即用,可配置规则、查看秒级监控、机器发现等 | 不完善 |
| 常见框架的适配 | Servlet、Spring Cloud、Dubbo、gRPC 等 | Servlet、Spring Cloud Netflix |

| 功能 | 说明 |
|---|---|
| 实时监测 | Sentinel能够实时监测系统、网络或应用程序的活动,以便及时发现异常或威胁。 |
| 预警和警报 | 当发现异常情况或威胁时,Sentinel能够发送警报或预警,提醒相关人员采取行动。 |
| 自动化分析 | Sentinel利用机器学习和人工智能等技术,能够对大量数据进行自动化分析,识别潜在的威胁和异常行为。 |
| 威胁情报 | Sentinel能够从不同的安全信息源获取最新的威胁情报,以帮助分析和应对威胁。 |
| 多层防御 | Sentinel通过多层次的防御机制,包括防火墙、入侵检测系统和反病毒软件等,来保护系统免受不同类型的攻击。 |
| 日志记录和审计 | Sentinel可以记录和审计系统的活动日志,以便对安全事件进行调查和分析。 |
| 自定义规则和策略 | Sentinel允许管理员根据自己的需求,制定自定义的监测规则和安全策略。 |
| 可扩展性 | Sentinel能够适应不同规模和复杂度的系统,并能够扩展以支持更大的负载和数据量。 |
| 用户友好界面 | Sentinel通常提供直观简洁的用户界面,使管理员能够轻松配置和监控安全系统。 |


Sentinel依赖 Java 环境来运行。请确保安装了JDK或JRE。
D:\Soft\Sentinel(需要自己创建,也可以是其他盘路径)D:\Soft\Sentinel,在磁盘地址栏中输入cmd,出现命令行窗口java -jar sentinel-dashboard-1.7.2.jar
C:\Program Files\Java\jdk1.8.0_281\bin>java -jar D:\soft\Sentinel\sentinel-dashboard-1.7.2.jar
http://localhost:8080sentinel



@SpringBootApplication
@EnableDiscoveryClient
public class OrderSentinelProviderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderSentinelProviderApplication.class, args);
}
}
spring:
application:
name: order-sentinel-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080
port: 8719
server:
port: 8086
@RestController
@Slf4j
public class LimitFlowController {
@RequestMapping("/test")
public String test(){
log.info("=========阈值类型为QPS,Sentinel测试。");
return "Sentinel调试环境已经准备";
}
}

分别是:QPS(TPS)、并发数、响应时间。
点击簇点链路菜单,可以看到之前访问过的接口,如下所示

点击右侧的流控按钮,会弹出新增流控规则的提示框,如下所示

@RestController
@Slf4j
public class LimitFlowController {
@RequestMapping("/test")
public String test(){
log.info("=========阈值类型为QPS,Sentinel测试。");
return "Sentinel调试环境已经准备";
}
@RequestMapping("/test2")
public String test2() throws InterruptedException {
System.out.println("=========阈值类型为线程数,Sentinel测试。");
TimeUnit.SECONDS.sleep(2);
return "Sentinel调试环境已经准备";
}
}



@RequestMapping("/test3")
public String test3() {
System.out.println("=========阈值类型为QPS,流控模式为关联。");
return "Sentinel调试环境已经准备";
}



@RequestMapping("/save")
public String save() {
System.out.println("=========阈值类型为QPS,流控模式为直接,流控效果为 Warm up预热。");
return "Sentinel调试环境已经准备:预热";
}



@RequestMapping("/query")
public String query() {
System.out.println("=========阈值类型为QPS,流控模式为直接,流控效果为等待。");
return "Sentinel调试环境已经准备:排队等待";
}


这里,针对 http://localhost:8086/hy1接口进行降级
@RequestMapping("/hy1")
public String hy1() throws InterruptedException {
TimeUnit.SECONDS.sleep(1);
System.out.println("=========降级测试策略为RT,Sentinel测试。");
return "Sentinel调试环境已经准备:降级测试";
}


这里,针对 http://localhost:8086/api/testSentinelE接口进行降级
@RequestMapping("/hy2")
public String hy2() throws InterruptedException {
System.out.println(1/0);
System.out.println("=========降级测试策略为异常比例,Sentinel测试。");
return "Sentinel调试环境已经准备:异常比例";
}


@RequestMapping("/hy3")
public String hy3() throws InterruptedException {
System.out.println(1/0);
System.out.println("=========降级测试策略为异常数,Sentinel测试。");
return "Sentinel调试环境已经准备:异常数";
}


@RequestMapping("/getGoods")
@SentinelResource(value = "getGoods",blockHandler = "blockHandlerGetGoods")
public String xian(String id,String name) {
return "Sentinel调试环境已经准备:异常比例";
}
public String blockHandlerGetGoods(String id, String name, BlockException ex){
return "访问过快!等一会再访问吧!";
}

