前面的文章(AgileConfig基于.NetCore的一个轻量级配置中心,AgileConfig轻量级配置中心 1.1.0 发布,支持应用间配置继承)都是介绍AgileConfig服务端已经控制台是如何工作、如何使用的,其实AgileConfig还有一个重要的组成部分:AgileConfig.Client。

AgileConfig.Client是使用C#编写的一个类库,只有使用它才能跟AgileConfig的服务端更好的配合工作实现实时推送配置信息等功能。

最近有几个同学问我如何集成Client,如何使用Client,看来光是Readme上的示例还是不够的,有必要比较详细的介绍下如何使用AgileConfig.Client。

下面通过几个示例来演示下如何AgileConfig.Client如何在mvc,控制台,wpf等程序上来读取配置:

asp.net core mvc下读取配置

mvc项目应该是目前使用最广泛的项目,同样它与AgileConfig.Client的集成最深入。下面来看看如何在mvc项目下使用AgileConfig.Client。

安装AgileConfig.Client

Install-Package AgileConfig.Client

当然第一步是使用nuget命令安装最新版的Client库。

修改appsettings.json

  "AgileConfig": {
"appId": "test_app",
"secret": "",
"nodes": "http://agileconfig.xbaby.xyz:5000"
}

AgileConfig.Client连接服务端需要一点必要的信息,我们把这些信息配置在appsettings.json文件里。节点的名称叫“AgileConfig”,里面配置了:

  1. appId 应用id
  2. secret 应用密钥,没有的话留空
  3. nodes 节点地址,如果有多个则使用英文逗号(,)分隔

AddAgileConfig

修改program.cs文件:

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
//注入AgileConfig Configuration Provider
config.AddAgileConfig();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});

通过AddAgileConfig扩展方法注入AgileConfigProvider。AgileConfigProvider才是跟配置系统打交道的组件。如果你想要使用Client的实例进行读取配置,也可以手动实例化一个client然后通过AddAglieConfig的另外一个重载注入进去。

Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
//注入AgileConfig Configuration Provider
var client = new ConfigClient();
config.AddAgileConfig(client);
})

读取配置

通过以上的设置,其实后面的配置读取跟使用appsettings.json没什么区别了。

 public HomeController(
ILogger<HomeController> logger,
IConfiguration configuration,
)
{
_logger = logger;
_IConfiguration = configuration;
} /// <summary>
/// 使用IConfiguration读取配置
/// </summary>
/// <returns></returns>
public IActionResult ByIConfiguration()
{
var userId = _IConfiguration["userId"];
var dbConn = _IConfiguration["db:connection"]; ViewBag.userId = userId;
ViewBag.dbConn = dbConn; return View("Configuration");
}

控制台下读取配置

当然了从本质上来说控制台项目跟mvc项目没啥区别。同样可以引入ConfigurationBuilder来注入ConfigClient。但是一般我们使用控制台可能是写个小工具,不用搞的这么复杂,直接new一个ConfigClient的实例是最直接的方法。

 static void Main(string[] args)
{
Console.WriteLine("Hello World!"); var appId = "test_app";
var secret = "";
var nodes = "http://agileconfig.xbaby.xyz:5000";
//使用有参构造函数,手动传入appid等信息
var client = new ConfigClient(appId, secret, nodes); Task.Run(async () =>
{
while (true)
{
await Task.Delay(5000);
foreach (string key in client.Data.Keys)
{
var val = client[key];
Console.WriteLine("{0} : {1}", key, val);
}
}
}); client.ConnectAsync();//如果不是mvc项目,不使用AddAgileConfig方法的话,需要手动调用ConnectAsync方法来跟服务器建立连接 Console.WriteLine("Test started .");
Console.Read();

需要注意的一个地方是手工new ConfigClient是需要自己调用ConnectAsync方法进行连接服务器的。

WPF程序读取配置

跟控制台程序一样,WPF同样首选直接new一个ConfigClient实例比较简单易用。

    public partial class App : Application
{
public static IConfigClient ConfigClient { get; private set; }
private void Application_Startup(object sender, StartupEventArgs e)
{
//跟控制台项目一样,appid等信息取决于你如何获取。你可以写死,可以从配置文件读取,可以从别的web service读取。
var appId = "test_app";
var secret = "";
var nodes = "http://agileconfig.xbaby.xyz:5000";
ConfigClient = new ConfigClient(appId, secret, nodes); ConfigClient.ConnectAsync().GetAwaiter();
}
}

实例化的位置可以选在App文件的Application_Startup方法内。并且把实例直接挂到App类的静态变量上。

注意:Application_Startup方法是同步方法。调用ConnectAsync之后需要调用GetAwaiter()方法等待连接成功。

在窗体程序内使用配置

 private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.tbx1.Text = App.ConfigClient["userId"];
this.tbx2.Text = App.ConfigClient["connection"];
}

我们通过直接访问App类上的ConfigClient对象读取配置信息。

AgileConfig.Client公共方法

下面列举下Client常用的几个公共方法

名称 说明
string this[string key] 直接通过键索引值
string Get(string key) 根据键获取值
List GetGroup(string groupName) 根据组名获取配置列表
Task ConnectAsync() 连接至服务器
bool Load() 手工从服务器拉取一次配置到客户端
void LoadConfigs(List configs) 手工把配置项加载到客户端
event Action ConfigChanged 这是一个事件,当某个配置值发生变化的时候触发

gihub地址:

AgileConfig

AgileConfig.Client

AgileConfig MVCSample

AgileConfig WPFSample

AgileConfig ConsoleSample

求星星!!!

AgileConfig-如何使用AgileConfig.Client读取配置的更多相关文章

  1. 造轮子-AgileConfig基于.NetCore的一个轻量级配置中心

    微服务确实是行业的一个趋势,我自己也在把一些项目往微服务架构迁移.玩微服务架构配置中心是一个绕不过去的东西,有很多大牌的可以选,比如spring-cloud-config,apoll,disconf等 ...

  2. YARP+AgileConfig 5分钟实现一个支持配置热更新的代理网关

    YARP 是微软开源的一个反向代理项目,英文名叫 Yet Another Reverse Proxy .所谓反向代理最有名的那就是 nginx 了,没错 YARP 也可以用来完成 nginx 的大部分 ...

  3. 无法读取配置节“oracle.manageddataaccess.client”,因为它缺少节声明

    程序发布后出现问题: 无法读取配置节“oracle.manageddataaccess.client”,因为它缺少节声明 解决办法: 1.安装了odac12.  ODTwithODAC121010.z ...

  4. Spark读取配置(转)

    转自:https://github.com/keepsimplefocus/spark-sourcecodes-analysis/blob/master/markdowns/Spark%E8%AF%B ...

  5. .Net Core 自定义配置源从配置中心读取配置

    配置,几乎所有的应用程序都离不开它..Net Framework时代我们使用App.config.Web.config,到了.Net Core的时代我们使用appsettings.json,这些我们再 ...

  6. CAT客户端如何从Apollo中读取配置?

    运行环境 以下就是这个示例的运行环境,如果版本号不一样,区别也应该不会很大,可以根据实际情况做相应调整. JDK 8 spring boot 2.0.7.RELEASE cat-client 3.0. ...

  7. Spring Cloud配置中心客户端读取配置

    微服务连接配置中心来实现外部配置的读取. 引入依赖 <dependencies> <dependency> <groupId>org.springframework ...

  8. .NET Core采用的全新配置系统[1]: 读取配置数据

    提到“配置”二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置定义在这两个文 ...

  9. ASP.NET Core的配置(1):读取配置信息

    提到"配置"二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...

随机推荐

  1. PyQt Designer中带参数的信号为什么匹配不到带参数的槽函数?

    老猿在学习ListView组件时,想实现一个在ListView组件中选中一个选择项后触发消息给主窗口,通过主窗口显示当前选中的项的内容. 进入QtDesigner后,设计一个图形界面,其中窗口界面使用 ...

  2. PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的按钮改变缺省文字的方法

    在Qt Designer中可以预先定义标准按钮,相关支持的标准按钮请见<PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的StandardButton ...

  3. PyQt(Python+Qt)学习随笔:Qt Designer中窗口对象的windowFilePath属性

    windowFilePath属性仅对窗口对象有效,用于关联一个窗口和对应的文件及路径. 当窗口没有设置标题属性的情况下,则窗口标题展示展示windowFilePath对应的文件名的信息(路径信息不展示 ...

  4. 稀疏矩阵三元组表快速转置(C语言实现)

    本来准备昨天下午写的,但是因为去参加360众测靶场的考核耽搁了,靶场的题目还是挺基础的. 继续学习吧. 使用黑色墨水在白纸上签名就像由像素点构成的稀疏矩阵.如图4所示. 图4 手写体签名 [问题]请将 ...

  5. JDBC(二)—— 获取连接池方式

    ## 获取数据库连接的方式 ### 方式一 ```javaDriver driver = new com.mysql.cj.jdbc.Driver(); String url = "jdbc ...

  6. 【题解】「CF675A」Infinite Sequence

    我用的是:分类讨论+暴力 其中分类讨论中,我用了一种namespace名命名空间.如果: \(c = 0\) : 当 \(a == b\) 时,输出 \(YES\) 否则 \(NO\) \(c < ...

  7. qq 表情库

    ![/qq](https://cdn.luogu.com.cn/upload/pic/62224.png) ![/cy](https://cdn.luogu.com.cn/upload/pic/622 ...

  8. js 乘除算法 浮点 精度解决办法

    js中进行浮点数运算时容易出现精度问题 1) 除法函数 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显.这个函数返回较为精确的除法结果. //调用:accDiv(a ...

  9. gitbook 安装和使用

    gitbook 安装和使用 安装nodejs  wget https://nodejs.org/dist/v10.22.0/node-v10.22.0-linux-arm64.tar.xz tar - ...

  10. Java源码赏析(六)Class<T> 类

    目的 Class 类是每一个程序员都必须了解的,也是使用反射机制的基础. 这篇文章将Class 类的公共方法大致介绍了一遍(省略了安全.枚举.断言.注解相关代码). 代码 package java.l ...