有没有过一种这样的需求,你发布了一个软件,但是有时候软件需要升级,查询版本号,维护数据,或者说,更新某一项参数,或者说,对某些参数负载均衡,比如某些服务器地址,但不依赖DNS(可能存在污染)
Configcat解决这个问题,免费版本有2个,除了标记数量有区别之外,其他是一样的,直接注册允许10个标记,通过GitHub学生注册允许1000个标记,其他没什么区别.更多套餐详情看首页就可以了.
Configcat首页:https://configcat.com/
创建好后就是创建Product.
接着创建环境,比如说是测试环境还是产品环境,免费版本可以设置两个,后续可以切换这个环境来实现功能.
接着每个环境都有配置文件,切换配置文件,也能切换一些配置.
看到可以设置4种不同的Flag.
比如我就设置一个开关量.
下面给出了多个语言的写法.
我就写了个简单应用,应用中生成UUID,也就是唯一用户ID,然后利用这个唯一用户ID,获取这个用户是否处于内测状态.
import configcatclient import uuid from configcatclient.user import User userid = uuid.uuid1() user_object = User(userid) configcat_client = configcatclient.create_client('EoXXCFH18gHftcXbSibRkg/LlhW7HPQMkKB9_wiQhHSMQ') isInternalUser = configcat_client.get_value('isInternalUser', False, user_object) print('当前是否为内测状态: ' + str(isInternalUser))
很明显,运行结果当然是否了,因为我们程序里面就没有内测开启.
如果我现在开关波到ON,自然获取到True,如果我只想20%的人进入内测呢?
程序上我们也模拟一些人.
import configcatclient import uuid from configcatclient.user import User IsInternalUser = 0 NotInternalUser = 0 while True: userid = uuid.uuid1() user_object = User(userid) configcat_client = configcatclient.create_client('EoXXCFH18gHftcXbSibRkg/LlhW7HPQMkKB9_wiQhHSMQ') isInternalUser = configcat_client.get_value('isInternalUser', False, user_object) if(isInternalUser): IsInternalUser = IsInternalUser + 1 else: NotInternalUser = NotInternalUser + 1 print("内测用户:%d 非内测用户:%d 内测用户占比:%.2f %%" % (IsInternalUser,NotInternalUser,(100 * IsInternalUser) / (IsInternalUser + NotInternalUser)))
我们看看一段时间过后,是不是大约20%的内测用户.
如果我们现在上调比例,这个比例自然也就上涨,这样可以实现逐步开放内测,当然也可以是其他标记.
另一个功能,比如发布版本号,传统发布版本号的方式很多种,比如说自建服务器,GitHub静态文本等等,这里也提供一个方法,就是Configcat的数字标签.
比如说有5个服务器负载均衡,就可以用TEXT方法,比如下图样子.
这样如果哪个服务器压力太大,或者增减服务器也不用去修改程序,修改Configcat就行了~
每一个配置相当于一个Feature Flag,默认10个在小程序上够用了,更多的话,1000个完全就是用不完了~
另外除了主动获取,还可以被动设置,比如Laravel下,设置PHP路由/configcatchanged来刷新Configcat数据.