一. Sentinel介绍
官方介绍: https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
二. Sentinel控制台介绍和安装使用
1. 介绍
Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。
Sentinel 控制台包含如下功能:
- 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。
- 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。
- 规则管理和推送:统一管理推送规则。
- 鉴权:生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制。
注意:Sentinel 控制台目前仅支持单机部署。Sentinel 控制台项目提供 Sentinel 功能全集示例,不作为开箱即用的生产环境控制台,若希望在生产环境使用请根据文档自行进行定制和改造。
2.下载
下载地址:https://github.com/alibaba/Sentinel/releases
3.启动命令
启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
4. 界面展示
三. springBoot集成 Sentinel
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
application.properties
#这里的 spring.cloud.sentinel.transport.port 端口配置会在应用对应的机器上启动一个 Http Server,\
#该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了一个限流规则,\
# 会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。
spring.application.name=MySentinel
spring.cloud.sentinel.eager= true
spring.cloud.sentinel.transport.port= 8720
spring.cloud.sentinel.transport.dashboard= 127.0.0.1:8080
spring.cloud.sentinel.transport.heartbeat-interval-ms= 500
@SentinelResource
注解用来标识资源是否被限流、降级。上述例子上该注解的属性 sayHello
表示资源名。@SentinelResource
还提供了其它额外的属性如 blockHandler
,blockHandlerClass
,fallback
用于表示限流或降级的操作(注意有方法签名要求),更多内容可以参考 Sentinel 注解支持文档。若不配置 blockHandler
、fallback
等函数,则被流控降级时方法会直接抛出对应的 BlockException;若方法未定义 throws BlockException
则会被 JVM 包装一层 UndeclaredThrowableException
。
添加测试controller
package com.robinbootweb.dmo.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @auther: TF12778
* @date: 2021/3/11 13:35
* @description:
*/
@RestController
@RequestMapping("/sentinel")
public class SentinelController {
/**
* @auther: TF12778
* @date: 2021/3/11 13:32
* @description: Sentine
* https://juejin.cn/post/6844903833856917517
*/
@GetMapping("/hello")
@SentinelResource(value = "hello", fallback = "helloError")
public String hello(String name) {
return "hello," + name;
}
@GetMapping(value = "/mye")
@SentinelResource("mye")
public String mye() {
if (true) {
throw new RuntimeException("mye");
}
return "mye Sentinel";
}
@GetMapping(value = "/myrate")
@SentinelResource("myrate")
public String myrate() {
return "myrate Sentinel";
}
}
四.配置流控规则
对于资源myrate进行限流,1秒1次请求,超过直接失败。
流控规则添加成功界面
五. 流控测试
1秒1次请求成功界面
1秒多次请求失败界面
控制台记录下的请求结果:
在这里可以看出myrate请求过大时被拒绝了1次
参考:https://juejin.cn/post/6844903833856917517#heading-4