Bpazy / blog

我的博客,欢迎关注和讨论
https://github.com/Bpazy/blog/issues
MIT License
39 stars 2 forks source link

怎样把 Sentinel 规则配置在 Apollo 中 #294

Open Bpazy opened 1 year ago

Bpazy commented 1 year ago

背景说明

Refer: Sentinel 核心概念

目前的应用使用 Sentinel 存在一些问题:新增资源后,必须在 flowrule.json 中定义流控规则,且在 Dashboard 中修改规则只能临时生效,想要持久化必须修改代码并发布,不灵活。

所以本调研的目标为:

  1. 移除 flowrule.json,改为在 Apollo 中配置;
  2. Sentinel Dashboard 和 Apollo 之间的同步,两个方向:
    1. Sentinel Dashboard 修改同步到 Apollo;
    2. Apollo 修改同步到 Sentinel Dashboard 以及应用;

使用 Apollo 替代 flowrule.json

参考文档: https://github.com/alibaba/Sentinel/wiki/动态规则扩展

应用配置

第一步: 首先增加 Apollo 作为 Sentinel DataSource 的依赖:

<dependencies>
  <dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-apollo</artifactId>
    <version>1.7.2</version>
  </dependency>
</dependencies>

第二步:app.id 之下添加配置:

app.id=100008072

# sentinel datasource apollo
# Apollo的空间名
spring.cloud.sentinel.datasource.ds.apollo.namespaceName=application
# 配置规则的key名称
spring.cloud.sentinel.datasource.ds.apollo.flowRulesKey=sentinel.flowRules

Apollo 的配置应该如下: image

第三步:Application 增加注解: @EnableApolloConfig

第四步: 测试生效。现在更改流控规则只需要更新 Apollo(持久化)即可生效;

解决 Apollo value 最大长度问题

Apollo value 长度有上限默认 20000,目前一个资源需要大约 150 个字符,则默认情况最多能存储约 133 个流控规则。 image

F6 Apollo 最大支持长度为 20000 所以:

  1. 要么支持多个 key 配置流控规则;
  2. 要么 Apollo 能够移除 value 最大长度;

Apollo value 最大长度如何扩容: 调整 item.value.length.limit 参数(点击跳转文档)。但是依旧有上限:表长度最大值: 25000,来源:https://github.com/ctripcorp/apollo/issues/832

针对多个 key 配置流控规则问题,阅读 spring-cloud-alibaba 文档发现可支持多 key 配置,形如:

spring.cloud.sentinel.datasource.ds.apollo.namespaceName=application
spring.cloud.sentinel.datasource.ds.apollo.flowRulesKey=sentinel.flowRules

spring.cloud.sentinel.datasource.ds2.apollo.namespaceName=application
spring.cloud.sentinel.datasource.ds2.apollo.flowRulesKey=sentinel.flowRules2

所以通过拆分规则的 key,就可以解决 Apollo 长度的问题了。

Sentinel Dashboard -> Apollo 同步问题

这一点 sentinel 的文档中提到,当使用外部数据源时,不再推荐通过 Sentinel Dashboard 来修改规则了:https://sentinelguard.io/zh-cn/docs/dashboard.html image

所以这个“缺点”不详述了。真要做就必须修改 Sentinel Dashboard 的源码,比较麻烦:Sentinel-控制台(集群流控管理)#规则配置