配置服务 - Nebula.Moon
集中管理各种参数的服务。
主要管理以下数据:
- 各服务的调用地址(服务注册)
 - 多应用之间共享的全局参数
 - 敏感信息数据
- 连接类参数:RabbbitMQ/Redis/es/oss/...
 - 帐号类参数:邮箱帐号,IM应用帐号
 - 密码密钥类:登录密码,JWT密钥
 
 - 数据库连接:主库,租户库,应用库
 - 应用程序的配置文件
 
设计背景
- 微服务相互调用所必需的服务注册机制
 - 配置安全:避免将各种敏感信息(密码,帐号)写在代码文件中(配置文件也算)
 - 可用性监控:利用管理的各种连接参数(MySQL/PostgreSQL/Rabbit/Redis)实现对资源的可用性监控
 
服务注册
代码中使用:
private static readonly string s_urlRoot = Settings.GetSetting("url.tenantService");
var httpOption = new HttpOption
{
    Url = $"{s_urlRoot}/v20/api/tenantservice/tenant/detail/{param.EntCode}.svc",
    Data = new { param.EntCode },
    Method = "POST"
};
var pTenantDetail = await this.SendRequestAsync<PTenantDetail>(httpOption);
管理数据库连接
在连接数据库前需要先配置连接,可以使用以下界面:
打开连接请参考: 数据库连接
建议阅读: 远程配置参数
管理/获取全局参数或帐号参数
可以使用以下界面来管理全局参数:
示例代码:
string value = Settings.GetSetting("name");
// or
XOption option = Settings.GetSetting<XOption>("name");
Settings.GetSetting查找次序
- 环境变量
 - 配置服务
 - AppConfig
 
查找次序解释
- 对于开发环境,用App.Config就可以了
 - 对于线上环境,可由配置服务统一覆盖
 - 对于线上个别应用,可以在docker环境变量中指定,优先级最高。
 
配置文件
每个基于Neblua.net的应用可以在项目中包含2个配置文件:
- ClownFish.App.config
 - ClownFish.Log.config
 
以上这2个文件都不是必需的,它们都有默认配置,如果存在则优先使用它们。
但是这种本地文件对于线上部署时不方便及时调整,所以可以将它们放在配置服务中管理。
它们对应在配置服务中的名称为:
- appname.App.config
 - appname.Log.config
 
独立配置文件
对于参数数量较多的应用程序,可以创建独立的配置文件,而不是继续使用ClownFish.App.config, 此时可以在配置服务中新增一个配置文件来实现,具体可操作配置服务界面。
建议阅读: 远程配置参数
示例代码
public static MonitorConfig LoadConfig()
{
    string xmlBody = null;
    string filename = "VenusMonitorConfig.xml";
    // 先读取本地文件
    if( File.Exists(filename) ) {
        xmlBody = File.ReadAllText(filename, Encoding.UTF8);
        Console2.WriteLine("VenusMonitorConfig.xml 已从本地文件中加载。");
    }
    // 再尝试从配置服务中获取
    if(xmlBody.IsNullOrEmpty() ) {
        xmlBody = ConfigFile.GetFile(filename);
        Console2.WriteLine("VenusMonitorConfig.xml 已从配置服务中获取。");
    }
    if( xmlBody.IsNullOrEmpty() )
        return null;
    // 反序列化,获取配置对象
    MonitorConfig config = ClownFish.Base.Xml.XmlHelper.XmlDeserialize<MonitorConfig>(xmlBody);
    // 验证配置参数
    ValidateMonitorConfig(config);
    return config;
}
可以使用以下界面来管理配置文件:
参数存储
配置服务的参数存储可参考: 点击这里