ConfigCat – 动态改变程序的配置

/ 0评 / 0

有没有过一种这样的需求,你发布了一个软件,但是有时候软件需要升级,查询版本号,维护数据,或者说,更新某一项参数,或者说,对某些参数负载均衡,比如某些服务器地址,但不依赖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数据.