配置服务 - Nebula.Moon

集中管理各种参数的服务。

主要管理以下数据:

  • 各服务的调用地址(服务注册)
  • 多应用之间共享的全局参数
  • 敏感信息数据
    • 连接类参数:RabbbitMQ/Redis/es/oss/...
    • 帐号类参数:邮箱帐号,IM应用帐号
    • 密码密钥类:登录密码,JWT密钥
  • 数据库连接:主库,租户库,应用库
  • 应用程序的配置文件

设计背景

  • 微服务相互调用所必需的服务注册机制
  • 配置安全:避免将各种敏感信息(密码,帐号)写在代码文件中(配置文件也算)
  • 可用性监控:利用管理的各种连接参数(MySQL/PostgreSQL/Rabbit/Redis)实现对资源的可用性监控



服务注册

xxx

代码中使用:

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);



管理数据库连接

在连接数据库前需要先配置连接,可以使用以下界面:

xxx


打开连接请参考: 数据库连接

建议阅读: 远程配置参数



管理/获取全局参数或帐号参数

可以使用以下界面来管理全局参数:

xxx

示例代码:

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;
}

可以使用以下界面来管理配置文件:

xxx



参数存储

配置服务的参数存储可参考: 点击这里