什么是 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 至少需要以下步骤:

  1. 使用 docker run 命令把服务端跑起来
  2. 配置 admin 密码
  3. 添加应用,设置 appId,secret
  4. 在客户端项目添加 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();

让我们解释一下关键代码:

  1. 添加 AgileConfig 服务端
var agileConfig = builder.AddAgileConfig();

作用:启动一个 AgileConfig 服务端的 Docker 容器,作为配置中心。

  1. 在 AgileConfig 中注册应用
var agileConfig_apiservice = agileConfig.AddApp("apiservice");
var agileConfig_webfrontend = agileConfig.AddApp("webfrontend");

作用:在 AgileConfig 中注册两个应用 apiservice 和 webfrontend,它们的配置信息会被客户端读取。

细节:这两个应用对应实际的后端 API 和前端 Web 项目,后续客户端(如 apiService 和 webFrontend)会从 AgileConfig 中读取它们的配置。

  1. 配置依赖关系
// 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():确保被依赖的服务启动后再启动当前服务。

  1. 新的依赖关系如下

在客户端项目上使用 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的更多相关文章

  1. Solr4.2迁移到新项目下异常:java.lang.NoSuchMethodError: org.apache.http.conn.scheme.Scheme.<init>

    由于业务调整,需要将solr搜索项目集成到另一个项目下成为一个模块,原项目运行异常,但是迁移到新项目后出现异常如下: 原因:引入的httpclient.jar冲突 解决方法:删除冲突的jar

  2. 解决eclipse项目下出现deployment descriptor和jax-ws web services

    当你的web项目下出现这个这些鬼东西的时候,是视图的原因 1.右上角切换视图到java,看看问题解决了没,如果没有,第二步 2.window->perspective->reset per ...

  3. android 将项目下的数据库拷贝到sd卡中

    /** * 将项目下的数据库拷贝到sd卡中 */ public static boolean copyDbToSdCard() { FileInputStream fis = null; FileOu ...

  4. Java反射获取当前项目下所有类,支持Servlet

    反射在很多时候要用,尤其自己编写框架时,那么如何获得当前项目下所有类呢!以下是本人封装的一个比较简洁的方法: [功能代码] //通过loader加载所有类 private List<Class& ...

  5. Maven下把父项目下的子项目导出到myeclipse中

    第一种在父项目下已有子项目:右击空白------import 第二步Maven4MyEclipse-----------Existing  Maven  Projects 第三部选择父项目下面的子项目 ...

  6. 通过getResourceAsStream方法获取项目下的指定资源

    properties配置文件调用 通过getResourceAsStream方法获取项目下的指定资源 一:获取src下的指定资源 1). Class.getResourceAsStream(Strin ...

  7. pycharm的一个bug,pycharm 在debug时,会运行项目下的所有文件,而不是当前文件

    pycharm的一个bug,pycharm 在debug时,会运行项目下的所有文件,而不是当前文件

  8. 如何获取Apollo上项目下的所有namespace?

    背景 项目配置迁移到Apollo之后,通过统一的配置管理及配置监听使得项目配置修改的成本大大降低. 但是,在使用Apollo的过程中,强哥也遇到一个问题:如果我们要获取Apollo下的namespac ...

  9. 使用vue-cli脚手架初始化Vue项目下的项目结构

    概述 vue-cli是Vue 提供的一个官方命令行工具,可用于快速搭建大型单页应用.该工具提供开箱即用的构建工具配置,带来现代化的前端开发流程.只需几分钟即可创建并启动一个带热重载.保存时静态检查以及 ...

  10. 【转】SpringBoot——web项目下读取classpath下的文件心得

    在读取springBoot+gradle构建的项目时,如果使用传统的FileInputStream读取文件流或者ResourceUtils工具类的方式,都会失败,下面解释原因: 一.读取文件的三种方式 ...

随机推荐

  1. jacoco代码覆盖率报告分析

    一.目的 对Jacoco代码覆盖率统计维度.报告字段说明.报告详细分析描述.并为精准测试.健壮性测试提供指导. 二.Jacoco代码覆盖率统计维度 Jacoco是从代码指令(Instructions, ...

  2. 聊一聊 C#线程池 的线程动态注入 (中)

    一:背景 1. 讲故事 上一篇我们用 Thread.Sleep 的方式演示了线程池饥饿场景下的动态线程注入,可以观察到大概 1s 产生 1~2 个新线程,很显然这样的增长速度扛不住上游请求对线程池的D ...

  3. Qt编写视频监控系统78-视频推流到流媒体服务器

    一.前言 视频推流作为独立的模块,目前并没有集成到视频监控系统中,目前是可以搭配监控系统一起使用,一般是将添加好的摄像头通道视频流地址打开后,读取视频流重新推到流媒体服务器,然后第三方可以从流媒体服务 ...

  4. Qt编写的项目作品20-百度地图综合应用(在线+离线+区域+下载)

    一.功能特点 (一).省市区域地图封装类功能特点 同时支持闪烁点图.迁徙图.区域地图.世界地图.仪表盘等. 可以设置标题.提示信息.背景颜色.文字颜色.线条颜色.区域颜色等各种颜色. 可设置城市的名称 ...

  5. axios简易封装

    import axios from 'axios' import qs from 'qs' const rootUrl = "http://localhost:5139/Dev/" ...

  6. [转]Pelco-D协议使用

    1.Pelco-D协议格式如下图所示: 2. 通用示例为:水平向右控制 FF address 00 02 Hspeed 00 checksum水平向左控制 FF address 00 04 Hspee ...

  7. 揭秘vivo百亿级厂商消息推送平台的高可用技术实践

    本文由vivo 互联网服务器团队Yu Quan分享,本文收录时有内容修订和重新排版. 1.引言 如今,Android端的即时通讯IM这类应用想实现离线消息推送,难度越来越大(详见<Android ...

  8. Web网页端IM产品RainbowChat-Web的v4.1版已发布

    一.关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIM ...

  9. 【Java 温故而知新系列】基础知识-02 数据基本类型

    1.Java基本数据类型 Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间. 基本数据类型 数值型:整数类型(byte,short,int,lon ...

  10. 一问一答学习PyQT6,对比WxPython和PyQt6的差异

    在我的基于WxPython的跨平台框架完成后,对WxPython的灵活性以及强大功能有了很深的了解,在跨平台的桌面应用上我突然对PyQt6的开发也感兴趣,于是准备了开发环境学习PyQt 6,并对比下W ...