配置中心实现配置的集中管理,持久化,通过配置中心,可以方便管理项目配置。对于后台服务而言,配置中心是实现灰度发布,配置热更新,优化代码结构。解决传统项目代码通过在项目里通过代码或文件的形式的缺点。在配置中心可以增加不同账户,配置不同权限,可以方便运营、产品等修改项目配置,更好管理。
配置中心的一般思路是创建一个config对象,该对象代表一个nameSpace的全部配置,config对象属性包含一个hashMap,通过key-value直观的方式,获取配置,热更新则是通过轮询apollo服务,更新hashMap。然而Openresty是多进程的web服务,每个worker进程的变量互相不影响,无法通过传统的方式实现热更新。
本设计,利用Openresty共享内存实现一个本地配置仓库,每个worker进程中的ConfigService通过轮询的方式,检查更新,而本地配置仓库则是Openresty特权进程的轮询服务实现更新。
配置中心数据仓库服务采用apollo,为此先介绍apollo相关概念:
name | note |
---|---|
app_id | 项目ID |
nameSpace | 命名空间,代表一份配置文件、配置集合 |
可以去了解一下Apollo API开发文档
1 将libs目录拷贝至Openresty项目一级目录下,按下面使用说明使用。
-
- 修改nginx.conf:
http模块增加:
lua_shared_dict config_shared 30m; # 配置中心需配置的共享内存
init_worker_by_lua_file 'conf/libs/config/config_init_worker.lua'; # 启动相关定时服务
-
- 修改init_by_lua.lua:
(实例化ConfigService和Config的操作需要在init_by_lua阶段完成,如果apollo服务异常,会自动宣告重启失败,保证服务不受apollo影响) (启动Openresty特权进程)
local process = require "ngx.process"
local ok, err = process.enable_privileged_agent()
-- 检查是否启动成功
if not ok then
ngx.log(ngx.ERR, "create privileged process failed")
error("create privileged process failed")
end
-- 获取ConfigService对象,代表一个app_id对应的配置, zdao_midservice为app_id,为全局变量
MidConfigServive = require "libs.agollo.configService".new("zdao_midservice")
-- 通过ConfigService获取config对象
LBSConfig = MidConfigServive:GetConfig("zdao_backend.lbs")
-
- apollo相关配置: 通过配置文件的方式: /usr/local/openresty/nginx/conf/APOLLO_META_ADDR.txt apollo的metaserver地址 例如:127.0.0.1:8080
-
- 使用:
local lbs_config = LBSConfig:GetValue("gaude_config"):Json() -- 表示获取nameSpace为zdao_backend.lbs下gaude_config的值,并转化为json对象
-- 获取ConfigService对象,传参为app_id
MidConfigServive = require "libs.agollo.configService".new("zdao_midservice")
-- 通过ConfigService获取config对象,传参为nameSpace
LBSConfig = MidConfigServive:GetConfig("zdao_backend.lbs")
-- 通过Config对象获取value对象,传参为key的值
local value = LBSConfig:GetValue("gaude_config")
-- value相关方法
local lbs_config = LBSConfig:GetValue("gaude_config"):Json() -- 转化为table
local lbs_config = LBSConfig:GetValue("str"):String() -- 转化为string
local lbs_config = LBSConfig:GetValue("num"):Int() -- 转化为int
local lbs_config = LBSConfig:GetValue("float"):Float() --
local lbs_config = LBSConfig:GetValue("bool"):Boolean() --