文章目录
Sentinel介绍
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel具有以下特征:
- 丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
- 完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。
Sentinel 的主要特性:
Sentinel 分为两个部分:
- 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
- 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。
Sentinel 和 Hystrix 对比
关于Hystrix 的介绍可以看springcloud 入门(4) Hystrix
快速开始
下载启动控制台
Sentinel 控制台提供了一系列规则配置,如果不需要控制就要自己在代码里面写规则了,比较麻烦,所以有还是最好的。
下载地址:https://github.com/alibaba/Sentinel/releases
找到这个jar包下载就行
Sentinel 控制台本身就是一个springboot的jar包
启动命令如下:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080。
从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel。
访问http://localhost:8080/#/login,进入Sentinel 管理页面
登录成功后首页
示例代码
引入的依赖都是在这篇文章springCloud Alibaba 2021版 nacos 注册中心初体验的基础上建立的。
引入的Spring Cloud Alibaba依赖及版本请查看上文
- 新建一个springboot项目sentinel-provider,引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
spring-boot-starter-web 是必须要有的,Sentinel配置 需要在Servlet 环境才生效。
- 配置文件
server.port=8085 # 服务名 spring.application.name=SentinelProvider spring.cloud.sentinel.transport.port=8719 # dashboard 地址 spring.cloud.sentinel.transport.dashboard=localhost:8080
配置的意思在后面会说到。
- 创建测试类
TestServiceImpl.java
@Service public class TestServiceImpl implements TestService{ // 原函数 @SentinelResource(value = "sayHello", blockHandler = "exceptionHandler", fallback = "helloFallback") public String sayHello(String name) throws Exception { if ("throws".equals(name)) { throw new Exception("exceptionHandler 生效了"); } return "Hello, " + name; } // Fallback 函数,函数签名与原函数一致或加一个 Throwable 类型的参数. public String helloFallback(String name) { System.out.println("helloFallback 生效,params = "+name); return "helloFallback 生效,params = "+name; } // Block 异常处理函数,参数最后多一个 BlockException,其余与原函数一致. public String exceptionHandler(String name , BlockException ex) { // Do some log here. ex.printStackTrace(); return "exceptionHandler起作用了,params="+name; } }
SentinelProviderController.java
@RestController @RequestMapping("/provider") public class SentinelProviderController { @Autowired private TestService service; @GetMapping(value = "/hello/{name}") public String apiHello(@PathVariable String name) throws Exception { return service.sayHello(name); } }
4.测试
启动sentinel-provider,启动之后访问sentinel控制台就能看到该服务,
5.先通过浏览器访问进行一个正常的测试:
6.再进行一个抛异常的测试:
7.最后再通过控制台进行一个降级测试:
- 在簇点链路下找到我们使用了@SentinelResource的资源,只有先调用接口之后才能在簇点链路找到对应的资源
- 在流控中进行配置流控规则
为了简单测试一下,我们就将QPS单机阈值设置为1