在 Aspire 项目下使用 AgileConfig
什么是 Aspire
.NET Aspire 是一组工具、模板和包,用于构建易于监控的、可投入生产的应用程序。.NET Aspire 通过一系列 NuGet 包交付,这些包通过启动或解决现代应用开发中的特定问题来提升开发效率。 如今的应用通常使用大量服务,例如数据库、消息传送和缓存,其中许多服务通过 .NET Aspire 集成得到支持。
Aspire 是微软发布的一项新技术。最近社区也有人跟我提需求说 AgileConfig 要支持 Aspire。
因为这不是 Aspire 的介绍文章,所以不过多表述。想要了解可参考以下文档:
https://learn.microsoft.com/zh-cn/dotnet/aspire/get-started/aspire-overview
使用 AgileConfig 的传统方式
通常我们使用 AgileConfig 至少需要以下步骤:
- 使用 docker run 命令把服务端跑起来
 - 配置 admin 密码
 - 添加应用,设置 appId,secret
 - 在客户端项目添加 client 包,修改 appsettings 配置文件
 
通过以上步骤后,你的应用至少应该是能成功连上 AgileConfig 服务端了。
在 Aspire 下使用 AgileConfig
下面让我们看看如何在 Aspire 下使用 AgileConfig。
相信大家肯定看过一些 Aspire 的案例。一些 infrastructure 的组件(比如 Sqlserver 数据库),可以通过 Aspire 直接运行起来,通过代码进行一些简单的配置后,其他项目就可以使用了。
那么使用 AgileConfig 也是一样。让我们直接看代码吧。
新建 Aspire 项目
使用 VS 新建一个标准 Aspire 项目。最后我们会得到这样一个解决方案:
- AspireProjectWithAgileConfig.ApiService
 - AspireProjectWithAgileConfig.AppHost
 - AspireProjectWithAgileConfig.Web
 
他们之间的依赖关系如下:

在 AppHost 项目上使用 AgileConfig
dotnet add package AgileConfig.Aspire.Hosting --version 1.0.0
首先安装 AgileConfig.Aspire.Hosting。 这个包是 AgileConfig 服务端的一个扩展。使用它配合 Aspire 可以直接启动 AgileConfig 容器并且简单配置它。
安装完后,我们在 Program 下添加如下代码:
using Aspire.Hosting.AgileConfig;
var builder = DistributedApplication.CreateBuilder(args);
var agileConfig = builder.AddAgileConfig(); // 添加 AgileConfig 服务端,这会启动一个 Container
var agileConfig_apiservice = agileConfig.AddApp("apiservice"); // 在 AgileConfig 添加一个应用 apiservice,客户端会从这里读取业务
var agileConfig_webfrontend = agileConfig.AddApp("webfrontend"); // 在 AgileConfig 添加一个应用 webfrontend,客户端会从这里读取业务
var apiService = builder.AddProject<Projects.AspireProjectWithAgileConfig_ApiService>("apiservice");
var webFrontend = builder.AddProject<Projects.AspireProjectWithAgileConfig_Web>("webfrontend").WithExternalHttpEndpoints();
apiService.WithReference(agileConfig_apiservice); // apiservice 项目引用 agileConfig_apiservice 应用
apiService.WaitFor(agileConfig); // apiservice 项目等待 agileConfig container 启动后再启动自己
webFrontend.WithReference(agileConfig_webfrontend);  // webFrontend 项目引用 agileConfig_webfrontend 应用
webFrontend.WaitFor(agileConfig); // webFrontend 项目等待 agileConfig container 启动后再启动自己
webFrontend.WithReference(apiService);
webFrontend.WaitFor(apiService);
builder.Build().Run();
让我们解释一下关键代码:
- 添加 AgileConfig 服务端
 
var agileConfig = builder.AddAgileConfig();
作用:启动一个 AgileConfig 服务端的 Docker 容器,作为配置中心。
- 在 AgileConfig 中注册应用
 
var agileConfig_apiservice = agileConfig.AddApp("apiservice");
var agileConfig_webfrontend = agileConfig.AddApp("webfrontend");
作用:在 AgileConfig 中注册两个应用 apiservice 和 webfrontend,它们的配置信息会被客户端读取。
细节:这两个应用对应实际的后端 API 和前端 Web 项目,后续客户端(如 apiService 和 webFrontend)会从 AgileConfig 中读取它们的配置。
- 配置依赖关系
 
// API 服务依赖 AgileConfig 中的 apiservice 配置
apiService.WithReference(agileConfig_apiservice);
apiService.WaitFor(agileConfig); // 等待 AgileConfig 容器启动
// Web 前端依赖 AgileConfig 中的 webfrontend 配置
webFrontend.WithReference(agileConfig_webfrontend);
webFrontend.WaitFor(agileConfig); // 等待 AgileConfig 容器启动
// Web 前端依赖 API 服务
webFrontend.WithReference(apiService);
webFrontend.WaitFor(apiService); // 等待 API 服务启动
作用:定义服务启动顺序和依赖关系。
关键方法:
WithReference():声明某个服务依赖另一个服务(如配置或另一个项目)。
WaitFor():确保被依赖的服务启动后再启动当前服务。
- 新的依赖关系如下
 

在客户端项目上使用 AgileConfig.Client
要连接 AgileConfig 服务端,我们需要在客户端项目添加新的包引用:
dotnet add package AgileConfig.Client.Aspire --version 1.0.0
以 ApiService 项目为例:
using Aspire.AgileConfig.Client;
var appName = "apiservice";
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseAspireAgileConfig(appName);
客户端项目现在配置起来就超级简单了,只需要一行代码就解决问题了,你甚至不需要去配置 appsettings 来指定 agileconfig 的相关配置它就能运行了。
运行
下面让我们运行整个项目看看效果吧。

通过 Aspire 的控制台我们可以看到 AgileConfig 的相关资源以及 2 个 project 项目都已经启动了。

点击 AgileConfig 的终结点可以直接打开 AgileConfig 的控制台。使用 admin/123456 默认密码就可以登录进去。

打开应用配置界面,可以看到 apiService, webfrontend 项目已经自动建立起来。

打开终端界面,可以看到有两个客户端连接在服务端上。

点击 webFrontend 的终结点可以直接打开这个 blazor 项目,可以正常运行。
总结
以上我们通过一个简单的示例演示了在 Aspire 下如何使用 AgileConfig。跟传统方案比起来,你不再需要关心:如何使用 docker 运行 AgileConfig 的服务端,不再需要关心如何在 appsettings 下添加 AgileConfig 的相关配置。
可以看到过程还是非常丝滑的。
源代码在这:
https://github.com/kklldog/Aspire.Hosting.AgileConfig
https://github.com/dotnetcore/AgileConfig
关注我的公众号一起玩转技术

在 Aspire 项目下使用 AgileConfig的更多相关文章
- Solr4.2迁移到新项目下异常:java.lang.NoSuchMethodError: org.apache.http.conn.scheme.Scheme.<init>
		
由于业务调整,需要将solr搜索项目集成到另一个项目下成为一个模块,原项目运行异常,但是迁移到新项目后出现异常如下: 原因:引入的httpclient.jar冲突 解决方法:删除冲突的jar
 - 解决eclipse项目下出现deployment descriptor和jax-ws web services
		
当你的web项目下出现这个这些鬼东西的时候,是视图的原因 1.右上角切换视图到java,看看问题解决了没,如果没有,第二步 2.window->perspective->reset per ...
 - android 将项目下的数据库拷贝到sd卡中
		
/** * 将项目下的数据库拷贝到sd卡中 */ public static boolean copyDbToSdCard() { FileInputStream fis = null; FileOu ...
 - Java反射获取当前项目下所有类,支持Servlet
		
反射在很多时候要用,尤其自己编写框架时,那么如何获得当前项目下所有类呢!以下是本人封装的一个比较简洁的方法: [功能代码] //通过loader加载所有类 private List<Class& ...
 - Maven下把父项目下的子项目导出到myeclipse中
		
第一种在父项目下已有子项目:右击空白------import 第二步Maven4MyEclipse-----------Existing Maven Projects 第三部选择父项目下面的子项目 ...
 - 通过getResourceAsStream方法获取项目下的指定资源
		
properties配置文件调用 通过getResourceAsStream方法获取项目下的指定资源 一:获取src下的指定资源 1). Class.getResourceAsStream(Strin ...
 - pycharm的一个bug,pycharm 在debug时,会运行项目下的所有文件,而不是当前文件
		
pycharm的一个bug,pycharm 在debug时,会运行项目下的所有文件,而不是当前文件
 - 如何获取Apollo上项目下的所有namespace?
		
背景 项目配置迁移到Apollo之后,通过统一的配置管理及配置监听使得项目配置修改的成本大大降低. 但是,在使用Apollo的过程中,强哥也遇到一个问题:如果我们要获取Apollo下的namespac ...
 - 使用vue-cli脚手架初始化Vue项目下的项目结构
		
概述 vue-cli是Vue 提供的一个官方命令行工具,可用于快速搭建大型单页应用.该工具提供开箱即用的构建工具配置,带来现代化的前端开发流程.只需几分钟即可创建并启动一个带热重载.保存时静态检查以及 ...
 - 【转】SpringBoot——web项目下读取classpath下的文件心得
		
在读取springBoot+gradle构建的项目时,如果使用传统的FileInputStream读取文件流或者ResourceUtils工具类的方式,都会失败,下面解释原因: 一.读取文件的三种方式 ...
 
随机推荐
- Flutter获取当前路由信息和全局路由监听
			
Flutter获取当前路由信息和全局路由监听 获取当前路由名 通过Flutter提供的方式 var routePath = ModalRoute.of(context).settings.name; ...
 - docker使用镜像报错:standard_init_linux.go:211: exec user process caused “exec format error“
			
在服务器使用镜像运行代码时出现了该报错.使用了docker run 后,由于是刚接触docker,不知道是什么原因.经网上查阅资料后,了解到原来有可能是我的镜像架构和机器架构不一致. 使用 docke ...
 - Springboot-actuator的常用endpoint的使用说明
			
目的 监控并管理应用程序监控:让我们去发现和了解程序的运行状况各种指标管理:比如说通过Actuator去做一个shutdown功能,通过访问一个特定的url去操作,默认是不开启的,另外 还可以在运行的 ...
 - 使用JSch进行sftp的连接运行状况检查
			
public boolean checkConnection() throws JSchException { try { JSch jsch = new JSch(); Session sessio ...
 - mac 10.15 国内如何安装brew
			
下载文件 brew_install.sh,然后执行 sh brew_install.sh 通常会卡在 tapping homebrew/core ,没关系, 执行如下命令即可 解决方法,手动执行下面 ...
 - Qt编写可视化大屏电子看板系统32-模块10大屏地图
			
一.前言 大屏地图模块采用浏览器模块+echart组件,Qt自带了webkit或者webengine模块,其中在win上mingw编译器的Qt5.6以后的版本,没有了浏览器模块,这个就需要用第三方的浏 ...
 - Qt编写地图综合应用55-海量点位标注
			
一.前言 海量点位标注的出现,是为了解决普通设备点超过几百个性能极速降低的问题,普通的marker标注由于采用的是对象的形式存在于地图中,数量越多,占用内存特别大,超过1000个点性能极其糟糕,哪怕是 ...
 - 基于Netty,从零开发IM(三):编码实践篇(群聊功能)
			
本文由作者"大白菜"分享,有较多修订和改动.注意:本系列是给IM初学者的文章,IM老油条们还望海涵,勿喷! 1.引言 接上两篇<IM系统设计篇>.<编码实践篇(单 ...
 - Ubuntu安装宝塔服务
			
Linux面板7.9.4安装脚本 查看详细安装教程 使用 SSH 连接工具,如 堡塔SSH终端 连接到您的 Linux 服务器后, 挂载磁盘 ,根据系统执行相应命令开始安装(大约2分钟完成面板安装): ...
 - map循环如何跳出循环
			
今天在开发的时候遇到了一个问题.就是想在使用map的时候跳出循环无法实现,于是就在网上搜寻了一番,说map本身不能跳出循环,有一个大佬提出了抛出异常的方法,记录一下 let list=[1,2,3,4 ...