Sentinel 流量治理平台改造

Sentinel 流量治理平台

Sentinel 是阿里巴巴开源的流量治理平台,提供了 流量控制熔断降级系统负载保护黑白名单访问控制 等功能。在实际的生产需求中,笔者进行了部分扩展:

  1. 流控规则持久化:适配 ApolloNacosZookeeper
  2. 监控数据持久化:适配 InfluxDBKafkaElasticsearch
  3. 监控面板优化:新增时间控件,允许在任意时刻内查询监控数据。

您可以访问 GitHub 查阅源码。

演示图例

改造前

改造后

快捷时间选择

自定义时间选择

如何构建

本项目默认使用 Maven 来构建,最快的使用方式是 git clone 到本地。在项目的根目录执行 mvn install -T 4C 完成本项目的构建。

如何启动

IDEA 启动

本项目默认不依赖外部组件,可以直接启动运行。

  1. 在项目目录下运行 mvn install(如果不想运行测试,可以加上 -DskipTests 参数)。
  2. 进入 sentinel-dashboard 目录,执行 mvn spring-boot:run 或者启动 SentinelApplication 类。运行成功的话,可以看到 Spring Boot 启动成功的界面。

在实际的生产需求,Sentinel 保存的规则和监控是需要持久化落盘的,因此,您可以在 sentinel-dashboard/src/main/resources/application.properties 接入外部组件。

  • 规则存储类型:memory(默认)、nacos(推荐)、apollo、zookeeper
properties 复制代码
# 规则存储类型,可选项:memory(默认)、nacos(推荐)、apollo、zookeeper
sentinel.rule.type=nacos
# Nacos 存储规则,如果您设置了 sentinel.metrics.type=nacos,需要调整相关配置
sentinel.rule.nacos.server-addr=localhost:8848
sentinel.rule.nacos.namespace=demo
sentinel.rule.nacos.group-id=sentinel
# Apollo 存储规则,如果您设置了 sentinel.metrics.type=apollo,需要调整相关配置
sentinel.rule.apollo.portal-url=http://localhost:10034
sentinel.rule.apollo.token=
sentinel.rule.apollo.env=
# Zookeeper 存储规则,如果您设置了 sentinel.metrics.type=zookeeper,需要调整相关配置
sentinel.rule.zookeeper.connect-string=localhost:2181
sentinel.rule.zookeeper.root-path=/sentinel_rule
  • 监控存储类型:memory(默认)、influxdb(推荐)、elasticsearch
properties 复制代码
# 监控存储类型,可选项:memory(默认)、influxdb(推荐)、elasticsearch
sentinel.metrics.type=memory
# InfluxDB 存储监控数据,如果您设置了 sentinel.metrics.type=influxdb,需要调整相关配置
influx.url=http://localhost:8086/
influx.token=UfgaW37A93PkncmJum25G7M2QkBg6xqqjGthh-o-UIVIynC_-Q7RFWlTtEpMqhGLCuAsX64k3Isc2uN33YgElw==
influx.org=sentinel
influx.bucket=sentinel
influx.log-level=NONE
influx.read-timeout=10s
influx.write-timeout=10s
influx.connect-timeout=10s
# Elasticsearch 存储监控数据,如果您设置了 sentinel.metrics.type=elasticsearch,需要调整相关配置
sentinel.metrics.elasticsearch.index-name=sentinel_metric
spring.elasticsearch.rest.uris=http://localhost:9200
spring.elasticsearch.rest.connection-timeout=3000
spring.elasticsearch.rest.read-timeout=5000
spring.elasticsearch.rest.username=
spring.elasticsearch.rest.password=
# 监控数据存储缓冲设置,降低底层存储组件写入压力。可选项:none(默认不启用)、kafka(推荐)
sentinel.metrics.sender.type=none
# Kafka 存储监控数据,如果您设置了 sentinel.metrics.sender.type=kafka,需要调整相关配置
sentinel.metrics.sender.kafka.topic=sentinel_metric
spring.kafka.producer.bootstrap-servers=localhost:9092
spring.kafka.producer.batch-size=4096
spring.kafka.producer.buffer-memory=40960
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer

镜像启动

本项目已发布到 Docker Hub,请执行参考命令运行。

bash 复制代码
docker run -p 8090:8090 --name=sentinel-dashboard -d shiyindaxiaojie/sentinel-dashboard

如何部署

FatJar 部署

执行 mvn clean package 打包成一个 fat jar,参考如下命令启动编译后的控制台。

bash 复制代码
java -Dserver.port=8080 \
-Dsentinel.rule.nacos.server-addr=localhost:8848 \
-Dsentinel.rule.nacos.namespace=demo \
-Dsentinel.rule.nacos.group-id=sentinel \
-Dsentinel.metrics.type=influxdb \
-Dinflux.url=http://localhost:8086 \
-Dinflux.token=XXXXXX \
-Dinflux.org=sentinel \
-Dinflux.bucket=sentinel \
-jar target/sentinel-dashboard.jar

Docker 部署

调整 Maven 配置文件 setiings.xml,填写相关凭据。

xml 复制代码
<settings>
    <profiles>
        <profile>
            <id>github</id>
            <properties>
                <docker.username>${env.DOCKER_USERNAME}</docker.username>
                <docker.password>${env.DOCKER_PASSWORD}</docker.password>
                <docker.image>${env.DOCKER_IMAGE}</docker.image>
            </properties>
        </profile>
    </profiles>
</settings>

在项目根目录执行 mvn -Pgithub -pl sentinel-dashboard jib:build -Djib.disableUpdateChecks=true 打包为镜像。

Helm 部署

进入 helm 目录,执行 helm install -n sentinel-dashboard sentinel . 安装,在 K8s 环境将自动创建 Sentinel 所需的资源文件。

如何接入

为了减少客户端集成的工作,您可以使用 eden-architect 框架,只需要两步就可以完成 Sentinel 的集成。

  1. 引入 Sentinel 依赖
xml 复制代码
<dependency>
    <groupId>io.github.shiyindaxiaojie</groupId>
    <artifactId>eden-sentinel-spring-cloud-starter</artifactId>
</dependency>
  1. 开启 Sentinel 配置
yaml 复制代码
spring:
  cloud:
    sentinel: # 流量治理组件
      enabled: false # 默认关闭,请按需开启
      http-method-specify: true # 兼容 RESTful
      eager: true # 立刻刷新到 Dashboard
      transport:
        dashboard: localhost:8090
      datasource:
        flow:
          nacos:
            server-addr: ${spring.cloud.nacos.config.server-addr}
            namespace: ${spring.cloud.nacos.config.namespace}
            groupId: sentinel
            dataId: ${spring.application.name}-flow-rule
            rule-type: flow
            data-type: json

笔者提供了两种不同应用架构的示例,里面有集成 Sentinel 的示例。

  • 面向领域模型的 COLA 架构 ,代码实例可以查看 eden-demo-cola
  • 面向数据模型的 分层架构 ,代码实例请查看 eden-demo-layer
相关推荐
程序员飞哥7 小时前
重构 AI 思维(一):Prompt Engineering,如何下达不可违抗的指令?
人工智能·后端
皮皮林5518 小时前
@Autowired 和 @Resource 注解有啥区别?你这项目怎么还混着用呢?
后端
程序员小假8 小时前
HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·后端
wangbing11259 小时前
踩坑:el8应用装在el9上
开发语言·后端·ruby
kyriewen1110 小时前
你等的Babel编译,够喝三杯咖啡了——用Rust重写的SWC,只需眨个眼
开发语言·前端·javascript·后端·性能优化·rust·前端框架
IT_陈寒10 小时前
SpringBoot自动配置坑了我,原来要这样绕过去
前端·人工智能·后端
东方小月10 小时前
Claude Code 完整上手指南:MCP、Skills、第三方模型配置一次搞定
前端·人工智能·后端
凤山老林11 小时前
从0到1搭建企业级权限管理系统:Spring Boot + JWT + RBAC实战指南
java·spring boot·后端·权限管理·rbac
ray_liang11 小时前
吐血整理JSON-RPC2.0的原理与应用
后端
蝎子莱莱爱打怪11 小时前
Claude Code 省 Token 小妙招:RTK + Caveman 组合拳
前端·人工智能·后端