场景
出于测试目的,需要在程序运行中去改变程序中的参数
思路
动态的去读第三方存储,比如数据库,缓存,甚至是文件
我的实现
这里使用了gflags,通过flaks实现一个api提供flag的修改
Gflags 是 Google 内部使用的命令行标志库,它与其他库(例如)的不同之处在于
getopt()
,标志定义可以分散在源代码中,而不只是列在一个地方(例如)main()
。实际上,这意味着单个源代码文件将定义和使用对该文件有意义的标志。任何链接到该文件的应用程序都将获得这些标志,并且 gflags 库将自动适当地处理该标志。https://gflags.github.io/gflags/
demo代码
import sys
import time
import gflags
import logging
import threading
from flask import Flask, request, jsonify
FLAGS = gflags.FLAGS
gflags.DEFINE_string('name', 'ming', 'this is a value')
gflags.DEFINE_integer('qps', 0, 'test qps')
gflags.DEFINE_boolean('isadmin', False, 'whether is admin')
gflags.DEFINE_float('price', 0.9, 'the price of apple')
def mainWork():
while True:
logging.info('Time gap output, {}'.format(FLAGS.flag_values_dict()))
time.sleep(1)
# 通过flask实现修改flag的api
app = Flask(__name__)
@app.route('/flags/<flag_name>', methods=["GET", "POST"])
def monitorFlag(flag_name):
flag_value = FLAGS.get(flag_name, None)
if flag_value == None:
return jsonify({'error': 'Flag({}) not exist!'.format(flag_name)})
if request.method == 'GET':
return jsonify(FLAGS.flag_values_dict())
if request.method == 'POST':
set_value = request.args.get('value')
FLAGS.set_default(flag_name, set_value)
return jsonify(FLAGS.flag_values_dict())
if __name__ == '__main__':
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
FLAGS(sys.argv)
# 起修改flag的http服务
t = threading.Thread(target=app.run, args=('0.0.0.0', 52625))
t.start()
mainWork()
# python gfthttpmodify.py -name name_start
启动
python gfthttpmodify.py -name name_start
如果如下
- 启动是指定
name=name_start
- 通过curl修改flag,
curl -X POST http://127.0.0.1:52625/flags/name\?value\=namebyhttp
- name变成了
namebyhttp