一、背景介绍:
Sentinel · alibaba/spring-cloud-alibaba Wiki · GitHub
二、Sentinel 介绍
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
-
丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
-
完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
-
广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
-
完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。
-
Sentinel 基本概念
资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
规则
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
Sentinel主要特性:
三、如何下载和启动
https://github.com/alibaba/Sentinel/releases
这里可以下载最新的1.8.8版本
如何启动sentinel:在jar目录输入如下指令
java -Dserver.port=8080 \
-Dcsp.sentinel.dashboard.server=localhost:8080 \
-Dproject.name=sentinel-dashboard \
-jar sentinel-dashboard.jar
到http://localhost:8080/ 看看,输入默认的用户名和密码:都是sentinel
四、springboot应用如何集成
pom.xml文件加入如下依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
application.yml加入如下节点:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 #配置Sentinel dashboard地址
# 默认就是8719端口,如果占用会依次+1开始扫描
port: 8719
这里的 spring.cloud.sentinel.transport.port
端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。
写一个简单的HelloController
@Controller
@RequestMapping(value = "/")
public class HelloController {
Logger logger = LoggerFactory.getLogger(getClass());
@RequestMapping("/index")
public String hello(Model m) {
m.addAttribute("now", DateFormat.getDateTimeInstance().format(new Date()));
return "hello";
}
}
Application.java
@SpringBootApplication
@EnableDiscoveryClient
@ComponentScan(basePackages = { "com.spell.*" })
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
五、测试实验
/index 路径最多单机阈值为1,保存此规则
多刷几次,会出现被限流,当然这个页面不是很友好,有需要可以去定制:
如何定制:实现BlocakExceptionHandler接口即可。
void handle(HttpServletRequest request,HttpSwervletResponse response,BlockException e) throws Exception;
例子如下:
@Component // 注册为Bean 让Spring管理
public class SentinelExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
String msg = "未知异常";
int status = 429;
// 通过判断异常的类型 来判断到底是限流还是熔断降级还是授权限制
if (e instanceof FlowException) {
msg = "请求被限流了";
} else if (e instanceof ParamFlowException) {
msg = "请求被热点参数限流";
} else if (e instanceof DegradeException) {
msg = "请求被降级了";
} else if (e instanceof AuthorityException) {
msg = "没有权限访问";
status = 401;
}
response.setContentType("application/json;charset=utf-8");
response.setStatus(status);
response.getWriter().println("{\"msg\": " + msg + ", \"status\": " + status + "}Sentinel自定义异常");
}
}
还有其他的功能,大家可以去多探索:
标签:springBoot,Spring,Alibaba,msg,限流,规则,Sentinel,public,sentinel From: https://blog.csdn.net/spell007/article/details/140025350