思考与实现:更简洁的实现Sentinel-zookeeper持久化

目录

概述

背景

我的思考

git地址


概述

sentinel没有提供规则持久化的线上实现,只是提供了实现思路。

除了api方式外,其他方案都需要添加比较多的代码修改,包括dashboard源码和应用。

为避免如此繁琐的行为,我采用了‘API+PUSH’的实现方案。

背景

sentinel提供的线上持久化方案

前往官网文档。

简述如下

思考与实现:更简洁的实现Sentinel-zookeeper持久化_第1张图片

API模式

思考与实现:更简洁的实现Sentinel-zookeeper持久化_第2张图片

PUSH模式

思考与实现:更简洁的实现Sentinel-zookeeper持久化_第3张图片

不足

使用API模式,应用服务器重启,规则即丢失。

使用PUSH模式,需要修改dashboard源码、添加应用端的自定义实现,个人认为比较繁琐。

我的思考

不希望规则丢失,不希望修改源码,不希望添加自定义实现。

基于这个目标,我采用API+PUSH混合方式实现sentinel zookeeper的持久化:

思考与实现:更简洁的实现Sentinel-zookeeper持久化_第4张图片

这种方式满足了"不希望规则丢失,不希望修改源码"。

对于“不希望添加自定义实现”,我采用spring autoconfig,将实现放到了单独的maven module中,这样以后就不用添加自定义实现,直接添加依赖即可。

实现原理

哪里实现PUSH

com.alibaba.csp.sentinel.property.SentinelProperty#addListener
com.alibaba.csp.sentinel.property.DynamicSentinelProperty#updateValue

规则变更变更后,由listeners进行处理,我提供了服务PUSH的自定义listener。

如何保证所有应用实例都获取到数据

  • API模式
  • 监听特定path,由zookeeper保证所有应用实例可获得到新数据。

如何避免规则被重复设置?

  • 引入lockpath
  • zookeeper保证,lockpath已存在则异常
  • 延迟删除lockpath

简洁使用

  • clone git地址的源码,mvn install
  • 添加依赖
        
            com.chl.sentinel
            sentinel-zk-database
            1.0-SNAPSHOT
        
  • 添加配置
sentinel:
  datasource:
    zk:
      remoteAddress: ip:port
      flowPath: /SENTINEL-RULE/projectName/FLOW-DATA
      degradePath: /SENTINEL-RULE/projectName/DEGRADE-DATA
      paramFlowPath: /SENTINEL-RULE/projectName/PARAMFLOW-DATA
      systemPath: /SENTINEL-RULE/projectName/SYSTEM-DATA
      authorityPath: /SENTINEL-RULE/projectName/AUTHORITY-DATA

git地址

sentienlzkdatabase by chlInGithub

你可能感兴趣的:(技术思考总结,sentinel,zk,持久化)