快速入门:构建您的第一个 .NET Aspire 应用程序

news2024/11/27 19:58:10

##前言

云原生应用程序通常需要连接到各种服务,例如数据库、存储和缓存解决方案、消息传递提供商或其他 Web 服务。.NET Aspire 旨在简化这些类型服务之间的连接和配置。在本快速入门中,您将了解如何创建 .NET Aspire Starter 应用程序模板解决方案。

##准备条件

要使用 .NET Aspire,您需要在本地安装以下软件:

  • .NET 8.0
  • .NET Aspire workload:
  • Use the Visual Studio installer
  • Use the dotnet workload install aspire command
  • Docker Desktop
  • Integrated Developer Environment (IDE) or code editor, such as:
  • Visual Studio 2022 Preview version 17.9 or higher (Optional)
  • Visual Studio Code (Optional)

##创建模板

要创建新的 .NET Aspire Starter 应用程序模板解决方案,您可以使用 Visual Studio 或 .NET CLI。

Visual Studio 提供了 .NET Aspire 项目模板,可以为您处理一些初始设置配置。请完成以下步骤为本快速入门创建项目:

  1. 在 Visual Studio 顶部,导航到“文件” “新建” “项目”。

  2. 在对话框窗口中,搜索Aspire并选择.NET Aspire Starter Application。选择下一步。

  3. 在“配置新项目”屏幕上:

  • 输入项目名称AspireSample
  • 将其余值保留为默认值,然后选择“下一步”。
  1. 在附加信息屏幕上:
  • 确保选择.NET 8.0(长期支持) 。
  • 确保选中“使用 Redis 进行缓存(需要 Docker)”并选择“创建”。

Visual Studio 创建了一个新的解决方案,该解决方案的结构是使用 .NET Aspire。

AspireSample目录:

└───📂 AspireSample
     ├───📂 AspireSample.ApiService
     │    ├───📂 Properties
     │    │    └─── launchSettings.json
     │    ├─── appsettings.Development.json
     │    ├─── appsettings.json
     │    ├─── AspireSample.ApiService.csproj
     │    └─── Program.cs
     ├───📂 AspireSample.AppHost
     │    ├───📂 Properties
     │    │    └─── launchSettings.json
     │    ├─── appsettings.Development.json
     │    ├─── appsettings.json
     │    ├─── AspireSample.AppHost.csproj
     │    └─── Program.cs
     ├───📂 AspireSample.ServiceDefaults
     │    ├─── AspireSample.ServiceDefaults.csproj
     │    └─── Extensions.cs
     ├───📂 AspireSample.Web
     │    ├───📂 Components
     │    │    ├───📂 Layout
     │    │    │    ├─── MainLayout.razor
     │    │    │    ├─── MainLayout.razor.css
     │    │    │    ├─── NavMenu.razor
     │    │    │    └─── NavMenu.razor.css
     │    │    ├───📂 Pages
     │    │    │    ├─── Counter.razor
     │    │    │    ├─── Error.razor
     │    │    │    ├─── Home.razor
     │    │    │    └─── Weather.razor
     │    │    ├─── _Imports.razor
     │    │    ├─── App.razor
     │    │    └─── Routes.razor
     │    ├───📂 Properties
     │    │    └─── launchSettings.json
     │    ├───📂 wwwroot
     │    │    ├───📂 bootstrap
     │    │    │    ├─── bootstrap.min.css
     │    │    │    └─── bootstrap.min.css.map
     │    │    ├─── app.css
     │    │    └─── favicon.png
     │    ├─── appsettings.Development.json
     │    ├─── appsettings.json
     │    ├─── AspireSample.Web.csproj
     │    ├─── Program.cs
     │    └─── WeatherApiClient.cs
     └─── AspireSample.sln

##.NET Aspire 应用程序主项目

*.AppHost项目负责充当协调器,并将IsAspireHost项目文件的属性设置为true

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IsAspireHost>true</IsAspireHost>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\AspireSample.ApiService\AspireSample.ApiService.csproj" />
    <ProjectReference Include="..\AspireSample.Web\AspireSample.Web.csproj" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Aspire.Hosting" Version="8.0.0-preview.1.23557.2" />
  </ItemGroup>

</Project>

AspireSample.AppHost项目的Program.cs文件:

var builder = DistributedApplication.CreateBuilder(args);

var cache = builder.AddRedisContainer("cache");

var apiservice = builder.AddProject<Projects.AspireSample_ApiService>("apiservice");

builder.AddProject<Projects.AspireSample_Web>("webfrontend")
    .WithReference(cache)
    .WithReference(apiservice);

builder.Build().Run();
  • IDistributedApplicationBuilder通过调用创建一个实例。DistributedApplication.CreateBuilder(args)。
  • AddRedisContainer使用 name 进行调用"cache"以将 Redis 容器添加到应用程序,并将返回值分配给名为 的变量cache,该变量的类型为IResourceBuilder<RedisContainerResource>。
  • 调用AddProject给定的泛型类型参数和项目IServiceMetadata详细信息,将AspireSample.ApiService项目添加到应用程序模型中。这是 .NET Aspire 的基本构建块之一,它用于配置应用程序中项目之间的服务发现和通信。name 参数"apiservice"用于标识应用程序模型中的项目,稍后由想要与其通信的项目使用。
  • 再次调用AddProject,这次将AspireSample.Web项目添加到应用程序模型中。它还链接多个调用来WithReference传递cache和apiservice变量。该WithReferenceAPI 是 .NET Aspire 的另一个基本 API,它将服务发现信息或连接字符串配置注入到要添加到应用程序模型的项目中。

##.NET Aspire 服务默认项目

*.ServiceDefaults项目是一个共享项目,用于管理在解决方案中的项目中重复使用的配置。该项目确保所有依赖服务共享相同的弹性、服务发现和 OpenTelemetry 配置。共享 .NET Aspire 项目文件包含IsAspireSharedProject设置为的属性true:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Library</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <IsAspireSharedProject>true</IsAspireSharedProject>
  </PropertyGroup>

  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />

    <PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="8.0.0" />
    <PackageReference Include="Microsoft.Extensions.ServiceDiscovery" Version="8.0.0-preview.1.23557.2" />
    <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.7.0-alpha.1" />
    <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.7.0-alpha.1" />
    <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.5.1-beta.1" />
    <PackageReference Include="OpenTelemetry.Instrumentation.GrpcNetClient" Version="1.5.1-beta.1" />
    <PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.5.1-beta.1" />
    <PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.5.1" />
  </ItemGroup>

</Project>

服务默认项目在IHostApplicationBuilder类型上公开一个名为 的扩展方法AddServiceDefaults。模板中的服务默认项目是一个起点,您可以对其进行自定义以满足您的需求。有关详细信息,请参阅.NET Aspire 服务默认值。

##协调服务沟通

.NET Aspire 提供编排功能来协助配置应用程序不同部分之间的连接和通信。AspireSample.AppHost项目将AspireSample.ApiService和AspireSample.Web项目添加到应用程序模型中。它还声明了Blazor 前端的名称,以供 API 项目参考。此外,还添加了带有标签的 Redis 容器资源。这些名称用于配置应用程序中项目之间的服务发现和通信。“webfrontend”“apiservice”“redis”

前端应用程序定义了HttpClient用于与 API 项目通信的类型。

namespace AspireSample.Web;

public class WeatherApiClient(HttpClient httpClient)
{
    public async Task<WeatherForecast[]> GetWeatherAsync()
    {
        return await httpClient.GetFromJsonAsync<WeatherForecast[]>("/weatherforecast") ?? [];
    }
}

public record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}

配置为使用服务发现,请考虑AspireSample.Web项目的Program.csHttpClient文件中的以下代码:

using AspireSample.Web;
using AspireSample.Web.Components;

var builder = WebApplication.CreateBuilder(args);

// Add service defaults & Aspire components.
builder.AddServiceDefaults();
builder.AddRedisOutputCache("cache");

// Add services to the container.
builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents();

builder.Services.AddHttpClient<WeatherApiClient>(
    static client=> client.BaseAddress = new("http://apiservice"));

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
}

app.UseStaticFiles();

app.UseAntiforgery();

app.UseOutputCache();

app.MapRazorComponents<App>()
    .AddInteractiveServerRenderMode();
    
app.MapDefaultEndpoints();

app.Run();
  • 调用AddServiceDefaults,配置应用程序的共享默认值。
  • 使用与将 Redis 容器添加到应用程序模型时使用的AddRedisOutputCache相同的调用。这将应用程序配置为使用 Redis 进行输出缓存。connectionName"cache"
  • 调用AddHttpClient并将HttpClient.BaseAddress配置为"http://apiservice"。这是将 API 项目添加到应用程序模型时使用的名称,配置了服务发现后,它将自动解析为 API 项目的正确地址。

##在本地测试应用程序

示例应用程序现已准备好进行测试。想要验证以下内容:

  • 使用服务发现从 API 项目检索天气数据并将其显示在天气页面上。
  • 后续请求通过 .NET Aspire Redis 组件配置的输出缓存进行处理。

在 Visual Studio 中,通过右键单击“解决方案资源管理器”中的项目并选择“设置为启动项目”,将AspireSample.AppHost项目设置为启动项目。然后,按运行该应用程序。F5

  1. 在浏览器中从主页导航到天气页面。该页面应加载天气数据,并记下预报表中表示的一些值。
  2. 继续偶尔刷新页面 10 秒钟。10秒内返回缓存数据。最终,会出现一组不同的天气数据,因为数据是随机生成的并且缓存会更新。

##探索 .NET Aspire 仪表板

当您运行 .NET Aspire 应用程序时,还会启动一个仪表板,您可以使用它来监视应用程序的各个部分。仪表板应类似于以下屏幕截图:

访问左侧导航中的每个链接可查看有关 .NET Aspire 应用程序的不同信息:

  • 项目:列出 .NET Aspire 应用程序中所有单个 .NET 项目的基本信息,例如应用程序状态、端点地址和加载的环境变量。

  • Containers:列出有关应用程序容器的基本信息,例如状态、图像标签和端口号。您应该会看到为输出缓存添加的 Redis 容器以及您提供的名称。

  • 可执行文件:列出您的应用程序使用的正在运行的可执行文件。示例应用程序不包含任何可执行文件,因此它应该显示消息No runningexecutablesfound。

  • 日志:

  • 项目:显示应用程序中项目的输出日志。使用页面顶部的下拉菜单选择您想要显示日志的项目。

  • 容器:显示应用程序中容器的日志。您应该会看到来自作为模板一部分配置的容器的 Redis 日志。如果您有多个容器,您可以使用页面顶部的下拉列表选择要显示日志的容器。

  • 可执行文件:显示应用程序中可执行文件的日志。示例应用程序不包含任何可执行文件,因此这里没有任何内容可看。

  • 结构化:以表格格式显示结构化日志。这些日志还支持基本过滤、自由格式搜索和日志级别过滤。您应该看到来自apiservice和 的日志webfrontend。您可以通过选择行右端的“查看”按钮来展开每个日志条目的详细信息。

  • Traces:显示应用程序的跟踪,它可以跟踪通过您的应用程序的请求路径。找到/weather的请求,然后选择页面右侧的“查看” 。当请求穿过应用程序的不同部分时,仪表板应分阶段显示请求。

  • Metrics:显示您的应用程序公开的各种仪器和仪表及其相应的尺寸。指标根据过滤器的可用维度有条件地公开过滤器。

至此就构建了第一个.NET Aspire应用程序,更多详细信息请访问.NET Aspire文档。

扩展链接:

如何使用 Blazor 框架在前端浏览器中导入/导出 Excel XLSX

如何在.NET电子表格应用程序中创建流程图

如何将实时数据显示在前端电子表格中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1218837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unity 烘焙的时候出现模型没有光影的情况

unity 烘焙的时候出现模型没有光影的情况 1.模型没有设置生成光照贴图 需要勾选模型的生成光照贴图UVs,然后应用 2.游戏对象没有勾选静态选项 点开静态下拉列表&#xff0c;选择 contribute GI

Accelerate 0.24.0文档 四:Megatron-LM

参考《Megatron-LM》 文章目录 一、Megatron-LM集成简介二、环境配置设置conda环境的步骤&#xff1a; 二、Accelerate Megatron-LM Plugin三、自定义训练过程四、检查点转换五、文本生成六、支持ROPE 、 ALiBi和Multi-Query Attention七、注意事项 一、Megatron-LM集成简介 在…

再谈谷歌GMS认证之Android 13

写在前面的话 2023年来到一个新的公司&#xff0c;传说中的做互联网金融即将上市的高大上公司。 入职后才发现就是做pos机设备的一个小厂 哎&#xff0c;什么命啊&#xff01; 工作和手机开发的工作重合度可以达到95%以上&#xff0c;我不想做手机&#xff0c;偏偏又干上…

全网首位数字军人“穆兰”惊艳亮相,与拓世法宝共同绘就未来社会图景

古有穆桂英、花木兰挂帅出征&#xff0c;今有全网首位虚拟数字军人“穆兰”展巾帼风采。今年国庆节后&#xff0c;中国军号在全网为解放军新闻传播中心数字记者暨全军首位超写实虚拟数字军人征名&#xff0c;历时一个多月&#xff0c;经过征名提交、评委初评、公众投票、专家共…

验证码识别之OCR识别

验证码识别&#xff1a; 背景&#xff1a; ​ 决定开一个专题给大家讲一下验证码识别&#xff0c;不要多想&#xff0c;我们不搞深度学习&#xff0c;知识用于攻破模拟登录的时候弹出的验证码&#xff0c;后续会给大家讲讲滑块等等&#xff0c;反爬虫策略如何应对。 好了&am…

如何实现业务系统的单点退出

当前我国各领域正在加速向数字化、移动化、智能化发展&#xff0c;大力投入信息化建设与数字化转型已成为企业的共识&#xff0c;但对于很多企业而言&#xff0c;组织信息环境庞大复杂&#xff0c;业务场景变化频繁&#xff0c;给身份管理与信息安全管理带来很大挑战。随着信息…

Spring Bean的生命周期详细梳理

1. 理解Bean的生命周期 1.1 生命周期的各个阶段 在Spring IOC容器中&#xff0c;Bean的生命周期大致如下&#xff1a; 实例化&#xff1a;当启动Spring应用时&#xff0c;IOC容器就会为在配置文件中声明的每个<bean>创建一个实例。属性赋值&#xff1a;实例化后&#…

linux虚拟机环境快速搭建redis5.x版本的主从集群总结

原创/朱季谦 我在阿里云服务器上曾参与过公司redis集群的搭建&#xff0c;但时间久了&#xff0c;都快忘记当时的搭建过程了&#xff0c;故而决定在虚拟机centOS 7的环境&#xff0c;自行搭建一套redis5.x版本的集群&#xff0c;该版本集群的搭建比较方便&#xff0c;不用再像…

免费图像压缩工具分享:15 个最佳免费图像压缩工具

您想在将图像上传到网上之前对其进行压缩吗&#xff1f;优化摄影网站的图像将有助于您的网站加载速度更快。而且&#xff0c;更快的加载速度意味着更好的搜索引擎排名&#xff01;在本指南中&#xff0c;我们将分享用于图像压缩的最佳免费图像优化工具。 许多照片编辑程序&…

【网络奇遇记】我和因特网的初相遇3 —— 计算机网络体系结构

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. 常见的三种计算机网络体系结构1.1 开放系统互连参考模型1.2 TCP/IP参考模型1.3 原理参考模型 二…

电脑上明明保存了文件却不见了?4个恢复技巧分享!

“真的很奇怪&#xff0c;我有一些重要的文件明明保存在电脑上了&#xff0c;但是当我在电脑上查找它们时&#xff0c;却发现有很多文件都不见了。这些保存在电脑上的文件如果不见了怎么找回呢&#xff1f;” 在使用电脑过程中&#xff0c;有时我们会遇到明明保存了文件&#x…

【双向链表】带头双向循环(1)

目录 链表的分类 Test.c主函数 test1头插 test2头删 test3尾插 test4尾删 test5查询 test6插入pos位置后一个 test7删除pos Test.c总代码 DList.h头文件&函数声明 头文件 函数声明 DList.h总代码 DList.c函数实现 Createnode创建节点 LTInit初始化 LTPr…

1~2亿条数据需要缓存之安装redis集群(哈希取余分区、一致性哈希算法分区、哈希槽分区)

安装redis集群 面试题 1~2亿条数据需要缓存&#xff0c;请问如何设计这个存储案例??? 回答: 单机单台100%不可能&#xff0c;肯定是分布式存储&#xff0c;用redis如何落地&#xff1f; 上述问题阿里P6~P7工程案例和场景设计类必考题目&#xff0c; 一般业界有3种解决方案 …

STM32H743 RTC精密数字校准 深度剖析

一、问题 项目中数据报文收到的RTC时间总是会慢一些,经过实际几天的测试得出结论:24小时要慢5S左右。根据手册我了解到可以有误差但不会差这么多,所以进行了如下分析并解决问题。 二、分析 1.影响RTC准确性的因素罗列 硬件基础误差(也就是待校准部分) …

青岛数字孪生赋能工业制造,加速推进制造业数字化转型

随着企业数字化进程的推进&#xff0c;数字孪生技术逐渐在汽车行业得到广泛应用。5G与数字孪生、工业互联网的融合将加速数字中国、智慧社会建设&#xff0c;加速中国新型工业化进程&#xff0c;为中国经济发展注入新动能。数字孪生、工业物联网、工业互联网等新一代信息通信技…

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏3(附项目源码)

文章目录 先看本次实现的最终效果前言绘制炮塔UI炮塔转向敌人生成炮弹旋转我们的子弹对敌人造成伤害&#xff0c;回收子弹自动发射子弹添加攻击间隔显示伤害字体设计通用泛型单例创建更多炮塔升级增加伤害升级缩短攻击间隔添加货币杀死敌人获取金币源码完结 先看本次实现的最终…

有趣的按钮分享

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 广告打完&#xff0c;我们进入正题&#xff0c;先看效果&#xff1a; 废话不多&#xff0c;上源码&#xff1a; <button class&quo…

牛只识别 牛脸识别 个体识别 身份识别

融合YOLOv5s与通道剪枝算法的奶牛轻量化个体识别方法 Light-weight recognition network for dairy cows based on the fusion of YOLOv5s and channel pruning algorithm 论文链接 知网链接 点击进入正文 该文章讨论了奶牛花斑、光照条件、不同剪枝方法、不同剪枝率对准确率的…

OPPO发布AndesGPT大模型;Emu Video和Emu Edit的新突破

&#x1f989; AI新闻 &#x1f680; OPPO发布全新ColorOS 14及自主训练的AndesGPT大模型 摘要&#xff1a;OPPO在2023 OPPO开发者大会上发布了全新的ColorOS 14&#xff0c;并正式推出了自主训练的安第斯大模型&#xff08;AndesGPT&#xff09;。AndesGPT拥有对话增强、个人…

Linux学习教程(第三章 Linux文件和目录管理)2

第三章 Linux文件和目录管理(初识Linux命令) 十一、Linux 删除空目录(rmdir命令) Linux rmdir命令:删除空目录 和 mkdir 命令(创建空目录)恰好相反,rmdir(remove empty directories 的缩写)命令用于删除空目录,此命令的基本格式为: [root@localhost ~]# rmdir […