官网:https://github.com/alibaba/sentinel
中文网:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。Sentinel 具有以下特征:
Docker 安装 Sentinel
#拉取sentinel镜像
docker pull bladex/sentinel-dashboard
#运行sentinel(docker里的sentinel是8858端口)
docker run --name sentinel -d -p 8858:8858 bladex/sentinel-dashboard
#把nacos和mysql也启动起来
访问:http://120.92.164.250:8858/#/login
账号和密码都是sentinel
com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discoverycom.alibaba.cspsentinel-datasource-nacoscom.alibaba.cloudspring-cloud-starter-alibaba-sentinelorg.springframework.cloudspring-cloud-starter-openfeignorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-actuatororg.springframework.bootspring-boot-devtoolsruntimetrueorg.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtest
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinal-service
cloud:
nacos:
discovery:
#Nacos服务注册中心地址(改成自己的服务器ip地址,本地用localhost)
server-addr: 120.92.164.250:8848
sentinel:
transport:
#配置Sentin dashboard地址(改成自己的服务器ip地址,本地用localhost)
dashboard: 120.92.164.250:8858
# 默认8719端口,假如被占用了会自动从8719端口+1进行扫描,直到找到未被占用的 端口
port: 8719
management:
endpoints:
web:
exposure:
include: '*'
@EnableDiscoveryClient
@SpringBootApplication
public class MainApp8401 {
public static void main(String[] args) {
SpringApplication.run(MainApp8401.class, args);
}
}
在这里插入图片描述http://localhost:8401/testA http://localhost:8401/testB
Sentinel 的所有规则都可以在内存态中动态地查询及修改,修改之后立即生效。同时 Sentinel 也提供相关 API,供您来定制自己的规则策略。
Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则 和 热点参数规则。
同一个资源可以同时有多个限流规则,检查规则时会依次检查。
在这里插入图片描述QPS与线程数的区别
QPS(每秒请求的数量):当调用该api的QPS达到阀值的时候,进行限流
线程数:当调用该API的线程数达到阀值的时候,进行限流
QPS是直接挡在外面,而线程数是有多少个线程在处理,放进来后,有线程是空闲状态就对请求进行处理,都没空闲,就限流
直接 : 快速失败
关联:当关联的资源达到阀值时,就限流自己,当与A关联的资源B达到阀值后,就限流A自己
链路:Sentinel 允许只根据某个入口的统计信息对资源限流。
当 QPS 超过某个阈值的时候,则采取措施进行流量控制。流量控制的效果包括以下几种:直接拒绝、Warm Up、匀速排队。对应 FlowRule 中的 controlBehavior 字段。
注意:若使用除了直接拒绝之外的流量控制效果,则调用关系限流策略(strategy)会被忽略。
直接拒绝
Warm Up
匀速排队
系统保护规则是从应用级别的入口流量进行控制,从单台机器的load 、cpu使用率、平均RT、入口QPS和并发线程数几个纬度监控应用指标,让系统尽可能的跑在最大吞吐量的同时保证系统整体的稳定性
系统保护规则则是应用整体纬度的,而不是资源纬度的,并且仅对入口流量生效。入口流量指的是进入应用的流量,比如Web 服务或Dubbo 服务端接收的请求,都属于入口流量。
系统则支持以下的模式
何为热点:热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频率最高的Top Key 数据,并且对其访问进行限制:
比如:
@GetMapping("/testB")
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
public String testB() {
return "----testB";
}
//兜底方法
public String deal_testHotKey(String p1, String p2, BlockException exception) {
// sentinel的默认提示都是:Blocked by Sentinel (flow limiting)
return "----deal_testHotKey, o(╥﹏╥)o";
}
在这里插入图片描述
@RestController
public class RateLimitController {
@GetMapping("/byResource")
@SentinelResource(value = "byResource",blockHandler = "handleException")
public CommonResult byResource() {
return new CommonResult(200,"按照资源名称限流测试",new Payment(2020L,"serial001"));
}
//兜底方法
public CommonResult handleException(BlockException exception) {
return new CommonResult(444,exception.getClass().getCanonicalName() + "\t 服务不可用");
}
}
在这里插入图片描述
@GetMapping("/rateLimit/byUrl")
@SentinelResource(value = "byUrl",blockHandler = "handleException")
public CommonResult byUrl() {
return new CommonResult(200,"按照byUrl限流测试",new Payment(2020L,"serial002"));
}
在这里插入图片描述
添加自定义类
public class CustomerBlockHandler {
public static CommonResult handlerException(BlockException exception) {
return new CommonResult(444,"按照客户自定义限流测试,Glogal handlerException ---- 1");
}
public static CommonResult handlerException2(BlockException exception) {
return new CommonResult(444,"按照客户自定义限流测试,Glogal handlerException ---- 2");
}
}
新增接口
//CustomerBlockHandler
@GetMapping("/rateLimit/customerBlockHandler")
@SentinelResource(value = "customerBlockHandler",
blockHandlerClass = CustomerBlockHandler.class, blockHandler = "handlerException2")
public CommonResult customerBlockHandler() {
return new CommonResult(200,"按照客户自定义限流测试",new Payment(2020L,"serial003"));
}
在这里插入图片描述
yml 添加对 datasource
datasource:
ds1:
nacos:
server-addr: 10.211.55.26:8848 #nacos
dataId: ${spring.application.name}
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
feign:
sentinel:
enabled: true #激活Sentinel 对Feign的支持