认识.NET Aspire:高效构建云原生应用的利器

简介

在几天前的.NET 8发布会上,来自微软的Glenn Condron和David Fowler为我们演示了.NET Aspire,在Visual Studio的帮助下,它展现出了惊人的开发效率。

短短的十分钟内,David现场演示了如何轻松创建了一个具有服务发现,健康检查,故障和容错策略,Redis服务,可观测性以及遥测面板的云原生应用,而且它还表现出来了强大的可扩展性。

开发者可以使用它快速创建一个属于自己的云原生应用,或者将已有的项目改造成云原生应用。

背景

一直以来,.NET开发者都凭借微软提供的ASP.NET Core框架和丰富的核心类库,来构建各种软件系统。随着云原生概念的出现,我们发现要实现云原生应用开发并不是一帆风顺的事情。

这需要我们深入了解更多的组件,重新审视服务编排和系统架构。而且为了赋予云原生应用更强大的能力,我们不得不在成百上千的Github项目中寻找或重构所需的类库,并且每个人都必须学习和正确配置使用它们。

这就像在搭积木,但问题是我们得到的积木并非成套,甚至我们一开始并不知道手里的积木会拼成什么样,我们需要从海量的积木仓库中拼凑出一套完整的产品出来。

优势

.NET Aspire是一个独立的云原生应用开发框架。云原生应用通常由多种中间组件,资源和微服务组成,.NET Aspire提供了一些解决特定云原生问题的能力:

编排: 提供高级抽象的能力,简化了云原生应用中不同服务的配置和连接,管理服务发现、环境变量和容器配置。

组件: 提供NuGet包,包含常用服务(如日志,服务发现,重试熔断策略,可观测性,    Redis,Postgres,RabbitMQ, Azure等),通过标准化接口确保每个应用连接一致。

工具: 提供Visual Studio和dotnet CLI 项目模板和工具,快速创建和运行.NET Aspire应用。

官网在描述.NET Aspire时使用了 "opinionated" 一词,该词直译过来是“固执己见的”或“有主见的”,其实它的含义是相对于基础且灵活的ASP.NET Core框架,.NET Aspire的项目格式更加统一和固定。

总之,.NET Aspire简化了云原生应用内各元素的协调和管理。

开发者无需处理底层实现细节,而是将服务之间的复杂关系交给Aspire来处理

核心概念

资源

在.NET Aspire,.NET服务,容器或者可执行文件都被看作是资源。下面是一段简单的示例代码:

var builder = DistributedApplication.CreateBuilder(args);var cache = builder.AddRedisContainer("cache");var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");builder.AddProject<Projects.AspireApp_Web>("webfrontend").WithReference(cache).WithReference(apiservice);builder.Build().Run();

Aspire Host 正在编排服务之间的关系,首先是声明了一个Redis容器,然后是注册API服务,之后又注册了由Blazor创建的UI服务,同时声明了UI服务对Redis和Api服务的引用。

在项目启动后,UI服务中的HttpClient可以直接使用服务名称调用相应的服务。

组件

.NET Aspire提供了一系列精心挑选的NuGet包,专门用于促进云原生应用与目前流行的服务和平台的集成。每个组件通过自动配置或标准化的配置模式提供了基本的云原生功能。

目前可用于使用的.NET Aspire组件:

  • PostgreSQL,PostgreSQL Entity Framework Core
  • SQL Server,SQL Server Entity Framework Core
  • RabbitMQ,Azure Service Bus
  • Redis,Redis Distributed Caching,Redis Output Caching
  • Azure Blob Storage,Azure Cosmos DB Entity Framework Core,Azure Cosmos DB, Azure Key Vault,Azure Storage Queues,Azure Table Storage

这些组件简化了健康检查、可观察性、遥测和弹性配置。.NET Aspire的依赖注入、云原生特性和组件配置方式统一,旨在减轻云原生应用程序的开发和管理负担。

云原生特性

可观察性 

NET Aspire为我们集成了OpenTelemetry SDK,以收集运行时各项数据指标。例如将遥测数据导出到指定服务:

private static IHostApplicationBuilder AddOpenTelemetryExporters(this IHostApplicationBuilder builder)
{var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);if (useOtlpExporter){builder.Services.Configure<OpenTelemetryLoggerOptions>(logging => logging.AddOtlpExporter());builder.Services.ConfigureOpenTelemetryMeterProvider(metrics => metrics.AddOtlpExporter());builder.Services.ConfigureOpenTelemetryTracerProvider(tracing => tracing.AddOtlpExporter());}// Uncomment the following lines to enable the Prometheus exporter (requires the OpenTelemetry.Exporter.Prometheus.AspNetCore package)// builder.Services.AddOpenTelemetry()//    .WithMetrics(metrics => metrics.AddPrometheusExporter());// Uncomment the following lines to enable the Azure Monitor exporter (requires the Azure.Monitor.OpenTelemetry.Exporter package)// builder.Services.AddOpenTelemetry()//    .UseAzureMonitor();return builder;
}

采集需要的应用指标数据:

public static IHostApplicationBuilder ConfigureOpenTelemetry(this IHostApplicationBuilder builder)
{builder.Logging.AddOpenTelemetry(logging =>{logging.IncludeFormattedMessage = true;logging.IncludeScopes = true;});builder.Services.AddOpenTelemetry().WithMetrics(metrics =>{metrics.AddRuntimeInstrumentation().AddBuiltInMeters();}).WithTracing(tracing =>{if (builder.Environment.IsDevelopment()){// We want to view all traces in developmenttracing.SetSampler(new AlwaysOnSampler());}tracing.AddAspNetCoreInstrumentation().AddGrpcClientInstrumentation().AddHttpClientInstrumentation();});builder.AddOpenTelemetryExporters();return builder;
}private static MeterProviderBuilder AddBuiltInMeters(this MeterProviderBuilder meterProviderBuilder) =>meterProviderBuilder.AddMeter("Microsoft.AspNetCore.Hosting","Microsoft.AspNetCore.Server.Kestrel","System.Net.Http");

健康检查 

.NET Aspire会为每个组件添加健康检查端点

public static WebApplication MapDefaultEndpoints(this WebApplication app)
{// Uncomment the following line to enable the Prometheus endpoint (requires the OpenTelemetry.Exporter.Prometheus.AspNetCore package)// app.MapPrometheusScrapingEndpoint();// All health checks must pass for app to be considered ready to accept traffic after startingapp.MapHealthChecks("/health");// Only health checks tagged with the "live" tag must pass for app to be considered aliveapp.MapHealthChecks("/alive", new HealthCheckOptions{Predicate = r => r.Tags.Contains("live")});return app;
}

故障恢复

使用著名的Polly类库,默认实现重试,超时等策略。

builder.Services.ConfigureHttpClientDefaults(http =>
{// Turn on resilience by defaulthttp.AddStandardResilienceHandler();// Turn on service discovery by defaulthttp.UseServiceDiscovery();
});

仪表板 

.NET Aspire 项目模板提供了一个复杂的仪表板,用于全面的应用监视和检查。通过此仪表板,我们可以在本地开发时实时查看应用程序的各个方面,包括日志、遥测数据和环境配置等,提供对应用状态和结构的深刻概述。

我们可以看到Aspire所管理的一切资源,服务,容器,可执行文件,日志等。下面放一些图片大家可以自行感受。

总结 

.NET Aspire 应用程序采用与云无关的原则构建,允许在支持 .NET 和容器的各种平台上灵活部署。Aspire还会为应用生成资源清单文件,在目前的pr1版本中,可以直接在Azure上进行容器部署,并且未来会有更多环境得到支持。

好了,对.NET Aspire简单介绍就到这里,如果感兴趣的话就按照官网文档创建项目体验一下吧!

Introducing .NET Aspire: Simplifying Cloud-Native Development with .NET 8 - .NET Blog (microsoft.com)

.NET Aspire overview - .NET Aspire | Microsoft Learn

aspire/README.md at main · dotnet/aspire · GitHub

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV快速入门:窗口交互

文章目录 前言一、鼠标操作1.1 鼠标操作简介1.2 鼠标事件类型&#xff08;event类型&#xff09;1.3 鼠标事件标志&#xff08;flags&#xff09;1.4 代码示例1.4.1 获取鼠标坐标位置1.4.2 监听鼠标滚轮事件1.4.3 在图像中显示鼠标坐标 二、键盘操作2.1 代码示例2.2 waitKey的等…

Network(五)数值介绍与子网划分

一 数值 1 数值介绍 &#xff08;1&#xff09;带宽 在一定时间内通过某一网络连接的信息量 基本单位&#xff1a;比特每秒 (bit/s) 在计算机软件方面用字节每秒为单位 &#xff08;2&#xff09;存储量 计算机存储量可以用位和字节计量 &#xff08;3&#xff09;常用…

基于Qt QList和QMap容器类示例

## QList<T> QList<T>容器是一个数组列表,特点如下: 1.大多数情况下可以用QList。像prepend()、append()和insert()这种操作,通常QList比QVector快的多。这是因为QList是基于index标签存储它的元素项在内存中(虽然内存不连续,这点与STL的list 是一样的),比…

Parity Game——种类并查集、权值并查集、离散化

题目描述 思路 怎么得到这个序列中每一段的关系&#xff1f; 我们可以把这个只包含0和1的序列看作一个数组&#xff0c;0表示当前位置为0&#xff0c;1表示当前位置为1&#xff0c;利用前缀和的性质可以知道某一段中所包含的1的数量sum1 a[r] - a[l-1] 如果sum1为偶数&…

设计模式-行为型模式-模板方法模式

一、什么是模板模式 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一个算法骨架&#xff0c;允许子类在不改变算法整体结构的情况下重新定义算法的某些步骤。 主要组成部分&#xff1a; 1、模板方法&#xff08;Templ…

HR应用在线人才测评,给企业招聘带来的好处

一、什么是人才测评&#xff1f; 人才测评是指运用一系列的科学方法&#xff0c;对人的基本素质&#xff0c;专业能力&#xff0c;心理健康&#xff0c;性格进行选拔&#xff0c;评价及发展人才的一种科学方法。近十多年&#xff0c;它被广泛运用于国有大型企业的人才招聘和人…

MISRA 2012学习笔记(5)-Rules 8.10

文章目录 Rules8.10 基本类型模型(The essential type model)8.10.1 原理8.10.2 基本类型(Essential type)Rule 10.1 操作数不得具有不适当的基本类型Rule 10.2 在加减法运算中&#xff0c;不得不当使用本质为字符类型的表达式Rule 10.3 表达式的值不得赋值给具有较窄基本类型或…

论文阅读——DiffusionDet

在目标检测上使用扩散模型 前向过程&#xff1a;真实框-->随机框 后向过程&#xff1a;随机框-->真实框 前向过程&#xff1a; 一般一张图片真实框的数目不同&#xff0c;填补到同一的N个框&#xff0c;填补方法可以是重复真实框&#xff0c;填补和图片大小一样的框&a…

鸿蒙:使用Stack、ContentTable、Flex等组件和布局实现一个显示界面

效果展示 一.概述 跟随官网继续HarmonyOS学习 本篇博文实现一个食物详情页的开发Demo 通过这个开发过程学习如何使用容器组件Stack、Flex和基本组件Image、Text&#xff0c;构建用户自定义组件&#xff0c;完成图文并茂的食物介绍 二.构建Stack布局 1.食物名称 创建Stack…

运行ps显示msvcp140.dll丢失怎么恢复?msvcp140.dll快速解决的4个不同方法

msvcp140.dll无法继续执行代码的主要原因有以下几点 系统缺失&#xff1a;msvcp140.dll是Visual Studio 2015编译的程序默认的库文件&#xff0c;如果系统中没有这个库文件&#xff0c;那么在运行相关程序时就会出现找不到msvcp140.dll的错误提示。 文件损坏&#xff1a;如果…

左支座零件的机械加工工艺规程及工艺装备设计【计算机辅助设计与制造CAD】

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;左支座 获取完整CAD工程源文件论文报告说明书等 一、论文目录 二、论文部分内容 设计任务 1.完成左支座零件—毛坯合图及左支座零件图 2.完成左支座零件工艺规程设计 3.完成左支座零件加工工艺卡 4.机床专用夹具装备总图 …

基于SSM的“鲜花”电子商务平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…