配置服务 - 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;
}
可以使用以下界面来管理配置文件:
参数存储
配置服务的参数存储可参考: 点击这里