sentinel 综合实践
·
一 docker 安装部署
1 拉取镜像
docker pull bladex/sentinel-dashboard:1.8.8
2 运行容器
2.1 运行命令
docker run --name bladex_sentinel_dashboard_1.8.8 --restart=always \
-d \
-p 8858:8858 \
-p 8719:8719 \
-e username=sentinel \
-e password=sentinel \
bladex/sentinel-dashboard:1.8.8
2.2 命令解释
docker run --name bladex_sentinel_dashboard_1.8.8 --restart=always \
docker run:用于启动一个新容器。--name bladex_sentinel_dashboard_1.8.8:指定容器名称,方便后续使用(如停止、重启、查看日志等)。--restart=always:设置容器在异常退出或主机重启后自动重启。适合部署环境使用,保障服务稳定运行。
-d \
-d:Detached mode,表示容器以“后台运行”模式启动,启动后不占用当前终端。
-p 8858:8858 \
-
-p 8858:8858:端口映射- 左侧
8858:宿主机端口(对外暴露) - 右侧
8858:容器内部 Sentinel 控制台监听端口 - ❗️
bladex/sentinel-dashboard镜像已将默认端口修改为8858(不是传统 Sentinel 控制台的8080)
- 左侧
-p 8719:8719 \
-
-p 8719:8719:映射 Sentinel 控制台与客户端之间的通信端口。- 控制台通过此端口接收客户端的心跳和监控数据。
- Spring Boot 客户端中对应配置:
spring.cloud.sentinel.transport.port=8719
-e username=sentinel \
-e password=sentinel \
-
-e:设置环境变量username=sentinel:登录控制台使用的用户名password=sentinel:登录控制台使用的密码
-
⚠️ 这些参数是
bladex定制镜像特有的,原版 Sentinel 官方镜像并不支持这种方式设置登录认证。
bladex/sentinel-dashboard:1.8.8
-
指定要运行的 Docker 镜像及版本。
-
bladex/sentinel-dashboard:1.8.8是一个社区版本,基于 Sentinel 控制台构建,做了定制:- 默认端口改为
8858 - 支持用户名/密码登录认证(通过
-e环境变量设置) - 默认带中文界面优化等
- 默认端口改为
总结
该命令会启动一个名为 bladex_sentinel_dashboard_1.8.8 的 Sentinel 控制台容器,具有以下特点:
- 对外提供 8858 端口访问控制台 UI;
- 对客户端开放 8719 用于通信;
- 登录控制台的账号密码为:
sentinel / sentinel; - 异常退出或主机重启后自动恢复运行。
3 控制台访问
http://IP:8858

4 springboot(3.2.4) 整合
4.1 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2023.0.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Sentinel 核心依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- management 相关配置依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
4.2 yml 配置
spring:
application:
name: your-service-name
cloud:
sentinel:
transport:
# Sentinel 控制台的地址(host:port),这里对应你 Docker 宿主机地址和映射端口
dashboard: 113.45.38.93:8858
# 当前服务暴露给 Sentinel 控制台的通信端口(默认 8719,不能被占用)
# 控制台通过这个端口接收客户端心跳、指标数据等
port: 8719
# 是否在应用启动时立即连接 Sentinel 控制台(默认是懒加载,建议设为 true 提前建立连接)
eager: true
management:
endpoints:
web:
exposure:
# 暴露所有 Actuator 端点(如 /actuator/health、/actuator/sentinel 等)
# Sentinel 控制台依赖 /actuator/sentinel 接口获取客户端信息
# 生产环境建议精确暴露,示例:include: [health, info, sentinel]
include: '*'
二 jar 方式
1 jar 下载
2 运行 jar
java -jar sentinel-dashboard-1.8.8.jar --server.port=8858
3 访问控制台
http://localhost:8858
4 springboot(3.2.4) 整合
4.1 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2023.0.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Sentinel 核心依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- Sentinel nacos 集成 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!-- management 相关配置依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
4.2 yml 配置
4.2.1 主配置文件
spring:
cloud:
sentinel:
transport:
# Sentinel 控制台的地址(host:port),这里对应你 Docker 宿主机地址和映射端口
dashboard: localhost:8858
# 当前服务暴露给 Sentinel 控制台的通信端口(默认 8719,不能被占用)
# 控制台通过这个端口接收客户端心跳、指标数据等
port: 8719
client-ip: 192.168.20.3
datasource:
rate-limiting:
nacos: # 告诉sentinel用nacos作为数据源
data-id: market-rate-limiting-dev.json
group-id: market
server-addr: 113.45.38.93:8848
username: nacos
password: nacos
rule-type: flow
data-type: json
namespace: 1ee09d3b-83fb-4292-a2eb-9b40ce871300
circuit-breaker:
nacos: # 告诉sentinel用nacos作为数据源
data-id: market-circuit-breaker-dev.json
group-id: market
server-addr: 113.45.38.93:8848
username: nacos
password: nacos
rule-type: degrade
data-type: json
namespace: 1ee09d3b-83fb-4292-a2eb-9b40ce871300
# 是否在应用启动时立即连接 Sentinel 控制台(默认是懒加载,建议设为 true 提前建立连接)
eager: true
management:
endpoints:
web:
exposure:
# 暴露所有 Actuator 端点(如 /actuator/health、/actuator/sentinel 等)
# Sentinel 控制台依赖 /actuator/sentinel 接口获取客户端信息
# 生产环境建议精确暴露,示例:include: [health, info, sentinel]
include: '*'
4.2.2 market-rate-limiting-dev.json
[
{
"resource": "activity_draw",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
配置相关介绍参考官方文档—使用文档-基本使用(资源与规则)
4.2.3 market-circuit-breaker-dev.json
[
{
"resource": "activity_draw",
"limitApp": "default",
"grade": 2,
"count": 1,
"timeWindow": 10,
"minRequestAmount": 3,
"statIntervalMs": 10000
}
]
配置相关介绍参考官方文档—使用文档-熔断降级。
5 代码示例
@RequestMapping(value = "test", method = RequestMethod.POST)
@SentinelResource(value = "activity_draw",
blockHandlerClass = {CustomBlockAndFallbackHandler.class},
blockHandler = "drawRateLimiterError",
fallbackClass = {CustomBlockAndFallbackHandler.class},
fallback = "drawHystrixError")
public Response<ActivityDrawResponseDTO> test(@RequestBody ActivityDrawRequestDTO request) {
if(request.getUserId().equals("hy")) {
throw new RuntimeException("熔断测试");
}
System.out.println("=============================================");
System.out.println(request);
System.out.println("=============================================");
return Response.<ActivityDrawResponseDTO>builder()
.code(ResponseCode.SUCCESS.getCode())
.info(ResponseCode.SUCCESS.getInfo())
.build();
}
package com.market.trigger.handler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.market.api.dto.ActivityDrawRequestDTO;
import com.market.api.dto.ActivityDrawResponseDTO;
import com.market.api.response.Response;
import com.market.types.enums.ResponseCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class CustomBlockAndFallbackHandler {
public static Response<ActivityDrawResponseDTO> drawRateLimiterError(ActivityDrawRequestDTO request, BlockException ex) {
log.warn("限流 - userId:{} activityId:{}", request.getUserId(), request.getActivityId());
return Response.<ActivityDrawResponseDTO>builder()
.code(ResponseCode.RATE_LIMITER.getCode())
.info(ResponseCode.RATE_LIMITER.getInfo())
.build();
}
public static Response<ActivityDrawResponseDTO> drawHystrixError(ActivityDrawRequestDTO request, Throwable ex) {
log.error("熔断触发 - userId:{} activityId:{} 异常:{}", request.getUserId(), request.getActivityId(), ex.getMessage());
System.out.println("=============================================================");
System.out.println(ex.getMessage());
System.out.println("=============================================================");
return Response.<ActivityDrawResponseDTO>builder()
.code(ResponseCode.HYSTRIX.getCode())
.info(ResponseCode.HYSTRIX.getInfo())
.build();
}
}
代码相关疑问,参考官方文档—使用文档-注解支持
6 sentinel 官方文档
更多推荐
所有评论(0)