- Springboot: 2.1.8.RELEASE
- SpringCloud: Greenwich.SR2
1. Sentinel 控制台概述
在介绍入门实战之前, 先来介绍一下 Sentinel.Sentinel 控制台提供一个轻量级的开源控制台, 它提供机器发现以及健康情况管理, 监控(单机和集群), 规则管理和推送的功能.
Sentinel 控制台主要功能:
查看机器列表以及健康情况: 收集 Sentinel 客户端发送的心跳包, 用于判断机器是否在线.
监控 (单机和集群聚合): 通过 Sentinel 客户端暴露的监控 API, 定期拉取并且聚合应用监控信息, 最终可以实现秒级的实时监控.
规则管理和推送: 统一管理推送规则.
鉴权: 生产环境中鉴权非常重要, 每个用户都需要相应的权限可以对控制台的信息进行修改.
2. Sentinel 控制台部署:
Sentinel 控制台部署有两种方案:
2.1 下载
直接使用官方编译好的 Release 版本部署启动, 下载地址: https://github.com/alibaba/Sentinel/releases , 目前最新版本是 v1.6.3, 下载 sentinel-dashboard-1.6.3.jar, 如图:
2.2 启动
可以使用最新版本的源码自行构建 Sentinel 控制台, 首先需要下载控制台工程, 下载路径: https://github.com/alibaba/Sentinel/tree/master/sentinel-dashboard , 使用命令 mvn clean package 将代码打成 jar 包即可.
在 CentOS 中使用如下命令启动 Sentinel 控制台工程:
注意: 启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本.
nohup java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.6.3.jar>sentinel-dashboard.out 2>&1 &
-Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080. 启动完成后, 使用浏览器访问: http://ip:8080/ , 这时会进入登录页面, 从 Sentinel 1.6.0 起, Sentinel 控制台引入基本的登录功能, 默认用户名和密码都是 sentinel, 如图:
Sentinel Dashboard 可以通过如下参数进行配置:
-Dsentinel.dashboard.auth.username=sentinel 用于指定控制台的登录用户名为 sentinel;
-Dsentinel.dashboard.auth.password=123456 用于指定控制台的登录密码为 123456; 如果省略这两个参数, 默认用户和密码均为 sentinel;
-Dserver.servlet.session.timeout=7200 用于指定 Spring Boot 服务端 session 的过期时间, 如 7200 表示 7200 秒; 60m 表示 60 分钟, 默认为 30 分钟;
同样也可以直接在 Spring 的 application.properties 文件中进行配置.
3. Spring Cloud
Sentinel 目前已支持 Spring Cloud, 需要引入 spring-boot-starter-web 来触发 sentinel-starter 中相关的自动配置.
3.1 创建父工程 sentinel-springcloud
工程依赖 pom.xml 如下:
代码清单: Alibaba/sentinel-springcloud/pom.xml
- ***
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-dependencies</artifactId>
- <version>${spring-cloud.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-alibaba-dependencies</artifactId>
- <version>${spring-cloud-alibaba.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
spring-cloud-alibaba-dependencies 引入 Spring Cloud Alibaba 版本控制. spring-cloud-starter-alibaba-sentinel 引入 Sentinel 组件.
3.2 创建子工程 web_mvc:
工程依赖 pom.xml 如下:
代码清单: Alibaba/sentinel-springcloud/web_mvc/pom.xml
- ***
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-Web</artifactId>
- </dependency>
工程配置 application.YAML 如下:
代码清单: Alibaba/sentinel-springcloud/web_mvc/src/main/resources/application.YAML
- ***
- server:
- port: 8000
- spring:
- application:
- name: Web-mvc
- cloud:
- sentinel:
- transport:
- dashboard: 192.168.44.129:8080
- port: 8719
spring.cloud.sentinel.transport.dashboard: 配置 Sentinel 控制台的 ip 和端口
spring.cloud.sentinel.transport.port: 这个端口配置会在应用对应的机器上启动一个 Http Server, 该 Server 会与 Sentinel 控制台做交互. 比如 Sentinel 控制台添加了 1 个限流规则, 会把规则数据 push 给这个 Http Server 接收, Http Server 再将规则注册到 Sentinel 中.
创建测试接口 HelloController.java 如下:
代码清单: Alibaba/sentinel-springcloud/web_mvc/src/main/java/com/springcloud/web_mvc/controller/HelloController.java
- ***
- @RestController
- public class HelloController {
- @GetMapping(value = "/hello")
- @SentinelResource("hello")
- public String hello() {
- return "Hello Web MVC";
- }
- }
@SentinelResource 注解用来标识资源是否被限流, 降级. 上述例子上该注解的属性'hello' 表示资源名. 该注解还有一些其他更精细化的配置, 比如忽略某些异常的配置, 默认降级函数等等, 具体可见如下说明:
value: 资源名称, 必需项(不能为空)
entryType:entry 类型, 可选项(默认为 EntryType.OUT)
blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称, 可选项. blockHandler 函数访问范围需要是 public, 返回类型需要与原方法相匹配, 参数类型需要和原方法相匹配并且最后加一个额外的参数, 类型为 BlockException.blockHandler 函数默认需要和原方法在同一个类中. 若希望使用其他类的函数, 则可以指定 blockHandlerClass 为对应的类的 Class 对象, 注意对应的函数必需为 static 函数, 否则无法解析.
fallback:fallback 函数名称, 可选项, 用于在抛出异常的时候提供 fallback 处理逻辑. fallback 函数可以针对所有类型的异常 (除了 exceptionsToIgnore 里面排除掉的异常类型) 进行处理. fallback 函数签名和位置要求:
返回值类型必须与原函数返回值类型一致;
方法参数列表需要和原函数一致, 或者可以额外多一个 Throwable 类型的参数用于接收对应的异常.
fallback 函数默认需要和原方法在同一个类中. 若希望使用其他类的函数, 则可以指定 fallbackClass 为对应的类的 Class 对象, 注意对应的函数必需为 static 函数, 否则无法解析.
defaultFallback(since 1.6.0): 默认的 fallback 函数名称, 可选项, 通常用于通用的 fallback 逻辑 (即可以用于很多服务或方法). 默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型) 进行处理. 若同时配置了 fallback 和 defaultFallback, 则只有 fallback 会生效. defaultFallback 函数签名要求:
返回值类型必须与原函数返回值类型一致;
方法参数列表需要为空, 或者可以额外多一个 Throwable 类型的参数用于接收对应的异常.
defaultFallback 函数默认需要和原方法在同一个类中. 若希望使用其他类的函数, 则可以指定 fallbackClass 为对应的类的 Class 对象, 注意对应的函数必需为 static 函数, 否则无法解析.
exceptionsToIgnore(since 1.6.0): 用于指定哪些异常被排除掉, 不会计入异常统计中, 也不会进入 fallback 逻辑中, 而是会原样抛出.
注: 1.6.0 之前的版本 fallback 函数只针对降级异常 (DegradeException) 进行处理, 不能针对业务异常进行处理.
特别地, 若 blockHandler 和 fallback 都进行了配置, 则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑. 若未配置 blockHandler,fallback 和 defaultFallback, 则被限流降级时会将 BlockException 直接抛出.
3.3 测试
启动子工程 web_mvc, 启动成功后打开浏览器访问: http://localhost:8000/hello , 可以看到页面正常显示 Hello Web MVC, 多次刷新后打开 Sentinel Dashboard, 在 Sentinel 控制台上已经可以看到我们的 Web-mvc 应用了, 如图:
注意: 请确保客户端有访问量, Sentinel 会在客户端首次调用的时候进行初始化, 开始向控制台发送心跳包.
4. Spring WebFlux
Sentinel 目前已经支持 WebFlux, 需要配合 spring-boot-starter-webflux 依赖触发 sentinel-starter 中 WebFlux 相关的自动化配置. 具体接入方式如下:
4.1 创建子工程 web_flux
工程依赖 pom.xml 如下:
代码清单: Alibaba/sentinel-springcloud/web_flux/pom.xml
- ***
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-webflux</artifactId>
- </dependency>
spring-boot-starter-webflux 引入 WebFlux 的相关依赖, Sentinel 的依赖已在父工程引入.
4.2 配置文件 application.YAML 如下:
代码清单: Alibaba/sentinel-springcloud/web_flux/src/main/resources/application.YAML
- server:
- port: 9000
- spring:
- application:
- name: Web-flux
- cloud:
- sentinel:
- transport:
- dashboard: 192.168.44.129:8080
- port: 8720
4.3 测试接口 HelloController.java
代码清单: Alibaba/sentinel-springcloud/web_flux/src/main/java/com/springcloud/web_flux/controller/HelloController.java
- ***
- @RestController
- public class HelloController {
- @GetMapping("/hello")
- @SentinelResource("hello")
- public Mono<String> mono() {
- return Mono.just("Hello Web Flux")
- .transform(new SentinelReactorTransformer<>("resourceName"));
- }
- }
4.4 测试
启动子工程 web_flux, 打开浏览器访问: http://localhost:9000/hello , 页面正常显示 Hello Web Flux, 多次刷新页面后打开 Sentinel 控制台, 可以看到 web_flux 工程正常注册, 测试成功, 如图:
5. 示例代码
GitHub - 示例代码
Gitee - 示例代码
来源: https://www.cnblogs.com/babycomeon/p/11509914.html