认识.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.mzph.cn/news/154163.shtml

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

相关文章

Unity模拟薄膜干涉效果

Unity制作薄膜干涉效果&#xff0c;色彩斑斓的黑色石头 大家好&#xff0c;我是阿赵。   这次来做一个模拟薄膜干涉的彩色效果&#xff0c;Shader是使用ASE来连接&#xff0c;也算是ASE做复杂一点的效果的一个例子吧。 一、什么是薄膜干涉 以下解释来源于百度百科&#xff1…

微信小程序开发-----发起网络请求携带后端token

在开发的时候我们前后端一般会有一个token作为安全保护&#xff0c;当后端接收到用户的登录请求&#xff0c;后端就会发送一个token给用户&#xff0c;此时前端必须要将token保存下来&#xff0c;在每次发起网络请求的时候在header请求头里携带token,下面呢就教大家如何在微信小…

linux硬盘扩容

lsblk fdisk /dev/vda m n&#xff08;如果挂载不成功&#xff0c;则w&#xff09; p partprobe pvcreate /dev/vda3 vgscan vgextend centos /dev/vda3 (注意&#xff0c;centos-home需要根据实际情况进行调整) lvextend -L 99G /dev/mapper/centos-root xfs_growfs…

4 svelte 组件之间传值(属性)

官方网站中介绍到&#xff1a;在任何实际的应用程序中&#xff0c;都需要将数据从一个组件向下传递给它的子组件。为此&#xff0c;我们需要声明属性&#xff0c;通常简称为“props”。在Svelte中&#xff0c;我们使用export关键字来完成此操作。 1 传值 app.svelte: <sc…

webpack配置全局scss

webpack配置全局scss 效果&#xff1a;a.vue使用index.scss中定义的$mainWidth就无需 import "xxxxxxx/index.scss"文件 src/assets/styles/index.scss $mainWidth: 1280px; $red: red src/views/a.vue .aaa {color: $red; } vue.config.js module.exports {…

Ajax技术

目录 一.Ajax简介 1.特点 2.发送请求的方式 3.简介 二.Ajax引入 1.案例 后端&#xff1a; html前端&#xff1a; 2.小结 &#xff08;1&#xff09;基本语法 &#xff08;2&#xff09;注意 &#xff08;3&#xff09;HttpResponse解决方式 一.Ajax简介 1.特点 异…

【开源】基于Vue和SpringBoot的微信小程序的音乐平台

项目编号&#xff1a; S 055 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S055&#xff0c;文末获取源码。} 项目编号&#xff1a;S055&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首…

Oracle(2-4)Naming Method Configuration

文章目录 一、基础知识1、OV of Naming Methods 命名方法的OV2、Five Key Parameters 连接数据库的五个关键参数 二、基础操作1、tnsnames.ora网络名配置 Naming Method Configuration 数据库网络命名配置 目标1&#xff1a; 描述主机命名和本地服务名称解析之间的区别使用Orac…

Java-super

【1】super:指的是&#xff1a; 父类的 【2】super可以修饰属性&#xff0c;可以修饰方法&#xff1b; 在子类的方法中&#xff0c;可以通过 super.属性 super.方法 的方式&#xff0c;显示的去调用父类提供的属性&#xff0c;方法。在通常情况下&#xff0c;super.可以省…

R语言——taxize(第三部分)

taxize&#xff08;第三部分&#xff09; 3.39. get_wiki&#xff08;获取维基分类群的页面名称&#xff09;3.40. get_wormsid&#xff08;获取分类群名称的Worms ID&#xff09;3.41. gni_details&#xff08;使用Global Names Index搜索分类学名称详情&#xff09;3.42. gni…

如何利用 AI 写一本书并实现被动收入

如何每个月写一本能赚 5000 美元的书&#xff1f;不少人不知道如何在一周内写作和出版一本书 这里有个教程教你如何利用 AI 写一本书并实现被动收入 [收藏起来以备后用] 推出书友智能写作工具&#xff1a;Bookwiz 不用花几年时间独自写作一本小说&#xff0c;人工智能可以作…

vsto word 获取目录起始页和结束页,如目录起始位置为2、结束位置为3,返回2和3

using Word Microsoft.Office.Interop.Word;namespace VstoWordExample {class Program{static void Main(string[] args){// 请确保你的项目引用了 Microsoft.Office.Interop.Word// 创建 Word 应用程序对象Word.Application wordApp new Word.Application();// 打开文档Wor…

使用activiti部署提示不是 ‘NCName‘ 的有效值

排查发现是整个流程图的&#xff0c;流程名称没有填写 修改之后就可以了

Taro编译警告解决方案:Error: chunk common [mini-css-extract-plugin]

文章目录 1. 背景2. 问题分析3. 解决方案3.1 更新 Taro 版本3.2 更新相关依赖3.3 调整 webpack 配置3.4 检查依赖版本 4. 拓展与分析4.1 拓展4.2 避免不必要的依赖4.3 查阅 Taro GitHub 仓库 5. 总结 &#x1f389;欢迎来到Java学习路线专栏~Taro编译警告解决方案&#xff1a;E…

windows如何查看自己的ip地址

windows如何查看自己的ip地址 1.打开控制面板 2.进入网络和internet 3.进入网络共享中心 4.点击以太网进入网络详情页&#xff0c;或邮件已连接的网络&#xff0c;点击属性 5.查看ipv4地址就是当前机器ip

美容仪器经营小程序商城的作用如何

美容仪器可以包含剃须刀、微针仪、微晶笔等&#xff0c;除了美容美业机构需要外&#xff0c;在家庭中也有不小的需求&#xff0c;对产品经营商家来说除了满足客户线下订购的需求外&#xff0c;还需要线上拓展更广的客群及多场景客户在线消费。 入驻第三方平台是商家们首先考虑…

大数据基础设施搭建 - Kafka(with ZooKeeper)

文章目录 一、简介二、单机部署2.1 上传压缩包2.2 解压压缩包2.3 修改配置文件&#xff08;1&#xff09;配置zookeeper地址&#xff08;2&#xff09;修改kafka运行日志(数据)存储路径 2.4 配置环境变量2.5 启动/关闭2.6 测试&#xff08;1&#xff09;查看当前服务器中的所有…

做外贸要学会分析客户情况

最近在某产品的专业群里询问一款产品&#xff0c;看谁可以做&#xff0c;然后很快就有一个自称是工厂的人加上了我。因为自己本身并不懂这个产品&#xff0c;很多他们发的问题自己都答不上来。我就如实告诉他自己是个新手&#xff0c;可以把你们现在能做的&#xff0c;或者已经…

家庭教育专家:如何创建家庭自主学习环境?

经常听到一些父母这样抱怨&#xff1a;“明明和孩子说好就看20分钟电视&#xff0c;结果到了时间&#xff0c;他死活都不肯关。”“作业还没完成的情况下&#xff0c;孩子还一直抱着手机或者电子产品玩游戏。到了约定时间也不撒手&#xff0c;一直跟你讨价还价。” 其实&#…

最前端|低代码平台轻松设计可视化图表【内含网站资源】

在前端设计中&#xff0c;我们经常需要使用可视化图表来呈现数据和信息。然而&#xff0c;每次都要自己从头开始设计图表未免太过繁琐。为了解决这个问题&#xff0c;我们调研了low code平台上的可视化图表功能。 本篇文章为大家带来以下问题的解答&#xff1a; &#xff08;1&…