Sentinel规则的推送有下面三种模式:

    推送模式 说明 优点 缺点
    原始模式 API 将规则推送至客户端并直接更新到内存中,扩展写数据源(WritableDataSource) 简单,无任何依赖 不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境
    Pull 模式 扩展写数据源(WritableDataSource), 客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等 简单,无任何依赖;规则持久化 不保证一致性;实时性不保证,拉取过于频繁也可能会有性能问题。
    Push 模式 扩展读数据源(ReadableDataSource),规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源。 规则持久化;一致性;快速 引入第三方依赖

    1.1 原始模式
    如果不做任何修改,Dashboard 的推送规则方式是通过 API 将规则推送至客户端并直接更新到内存中:
    image.png
    这种做法的好处是简单,无依赖;坏处是应用重启规则就会消失,仅用于简单测试,不能用于生产环境。
    1.2 拉模式
    pull 模式的数据源(如本地文件、RDBMS 等)一般是可写入的。使用时需要在客户端注册数据源:将对应的读数据源注册至对应的 RuleManager,将写数据源注册至 transport 的 WritableDataSourceRegistry 中。
    1.3 推模式
    生产环境下一般更常用的是 push 模式的数据源。对于 push 模式的数据源,如远程配置中心(ZooKeeper, Nacos, Apollo等等),推送的操作不应由 Sentinel 客户端进行,而应该经控制台统一进行管理,直接进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。因此推送规则正确做法应该是 配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel,而不是经 Sentinel 数据源推送至配置中心。这样的流程就非常清晰了:
    1.3.1 基于Nacos配置中心控制台实现推送
    官方demo: sentinel-demo-nacos-datasource
    引入依赖

    1. <dependency>
    2. <groupId>com.alibaba.csp</groupId>
    3. <artifactId>sentinel-datasource-nacos</artifactId>
    4. </dependency>

    nacos配置中心中配置流控规则

    1. [
    2. {
    3. "resource": "TestResource",
    4. "controlBehavior": 0,
    5. "count": 10.0,
    6. "grade": 1,
    7. "limitApp": "default",
    8. "strategy": 0
    9. }
    10. ]

    image.png
    2)yml中配置

    1. spring:
    2. application:
    3. name: mall-user-sentinel-demo
    4. cloud:
    5. nacos:
    6. discovery:
    7. server-addr: 127.0.0.1:8848
    8. sentinel:
    9. transport:
    10. # 添加sentinel的控制台地址
    11. dashboard: 127.0.0.1:8080
    12. # 指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer
    13. port: 8719
    14. datasource:
    15. ds1:
    16. nacos:
    17. server-addr: 127.0.0.1:8848
    18. dataId: ${spring.application.name}
    19. groupId: DEFAULT_GROUP
    20. data-type: json
    21. rule-type: flow

    3)nacos配置中心中添加

    1. [
    2. {
    3. "resource": "userinfo",
    4. "limitApp": "default",
    5. "grade": 1,
    6. "count": 1,
    7. "strategy": 0,
    8. "controlBehavior": 0,
    9. "clusterMode": false
    10. }
    11. ]

    image.png
    引入依赖

    1. <!--sentinel持久化 采用 Nacos 作为规则配置数据源-->
    2. <dependency>
    3. <groupId>com.alibaba.csp</groupId>
    4. <artifactId>sentinel-datasource-nacos</artifactId>
    5. </dependency>

    增加yml配置

    1. server:
    2. port: 8806
    3. spring:
    4. application:
    5. name: mall-user-sentinel-rule-push-demo #微服务名称
    6. #配置nacos注册中心地址
    7. cloud:
    8. nacos:
    9. discovery:
    10. server-addr: 127.0.0.1:8848
    11. sentinel:
    12. transport:
    13. # 添加sentinel的控制台地址
    14. dashboard: 127.0.0.1:8080
    15. # 指定应用与Sentinel控制台交互的端口,应用本地会起一个该端口占用的HttpServer
    16. #port: 8719
    17. datasource:
    18. # ds1: #名称自定义,唯一
    19. # nacos:
    20. # server-addr: 127.0.0.1:8848
    21. # dataId: ${spring.application.name}
    22. # groupId: DEFAULT_GROUP
    23. # data-type: json
    24. # rule-type: flow
    25. flow-rules:
    26. nacos:
    27. server-addr: 127.0.0.1:8848
    28. dataId: ${spring.application.name}-flow-rules
    29. groupId: SENTINEL_GROUP # 注意groupId对应Sentinel Dashboard中的定义
    30. data-type: json
    31. rule-type: flow
    32. degrade-rules:
    33. nacos:
    34. server-addr: 127.0.0.1:8848
    35. dataId: ${spring.application.name}-degrade-rules
    36. groupId: SENTINEL_GROUP
    37. data-type: json
    38. rule-type: degrade
    39. param-flow-rules:
    40. nacos:
    41. server-addr: 127.0.0.1:8848
    42. dataId: ${spring.application.name}-param-flow-rules
    43. groupId: SENTINEL_GROUP
    44. data-type: json
    45. rule-type: param-flow
    46. authority-rules:
    47. nacos:
    48. server-addr: 127.0.0.1:8848
    49. dataId: ${spring.application.name}-authority-rules
    50. groupId: SENTINEL_GROUP
    51. data-type: json
    52. rule-type: authority
    53. system-rules:
    54. nacos:
    55. server-addr: 127.0.0.1:8848
    56. dataId: ${spring.application.name}-system-rules
    57. groupId: SENTINEL_GROUP
    58. data-type: json
    59. rule-type: system

    以流控规则测试,当在sentinel dashboard配置了流控规则,会在nacos配置中心生成对应的配置。
    image.png