在本文中,我想探讨如何利用 .NET Aspire 等工具来改进我们构建和部署分布式应用程序的方式,即使我们使用 .NET 以外的语言和框架也是如此。
.NET Aspire 是一个固执己见的、云就绪堆栈,旨在改善构建可观察、生产就绪的分布式应用程序的体验。它是通过处理特定云原生问题的 NuGet 包集合来交付的。
.NET Aspire 旨在帮助您:
.NET Aspire 的核心可以在您从 .NET 模板开始使用 Aspire 时创建的 AppHost 项目中找到。 AppHost 项目定义了我们的分布式应用程序的组件,从服务(例如后端或前端)到资源(例如数据库或缓存)。
该项目可以生成一个清单,从基础设施的角度描述我们的应用程序。因此,Azure 开发人员 CLI 可以解释它以将应用程序部署到 Azure,而无需编写任何基础设施即代码。
当然,当我们使用分布式应用程序和微服务时,我们可能会遇到不同团队喜欢用不同语言编写代码的情况。当然,.NET Aspire 属于 .NET 生态系统。尽管如此,它的设计是能够与不同的语言和框架集成。
让我们考虑一个简单的例子。我们有一个分布式计算器,它由不同的服务组成:前端服务和每个操作的后端。
我们还有一个 redis 缓存来存储计算器的状态。
在这种情况下,我们可以使用 .NET Aspire 来构建分布式计算器,利用它附带的所有工具和集成。 Aspire 为某些语言提供本机支持,但我们也可以使用容器扩展它以支持其他语言。
在撰写本文时,.NET Aspire 支持以下语言:
以下是我们如何配置 AppHost 项目中的所有后端服务:
Golang 本身不支持,因此我们将其添加为容器。请注意,我们可以决定在运行 AppHost 来发布清单或进行本地开发的场景中使用不同的图像。
// Configure Adder in Go var add = (builder.ExecutionContext.IsPublishMode ? builder.AddContainer("addapp", "acrt6xtihl2b3uxe.azurecr.io/addapp") : builder.AddContainer("addapp", "addapp")) .WithHttpEndpoint(targetPort: 6000, env: "APP_PORT", name: "http") .WithOtlpExporter() .WithEnvironment("OTEL_SERVICE_NAME", "addapp") .PublishAsContainer(); var addEnpoint = add.GetEndpoint("http");
原生支持Python,因此我们可以使用AddPythonProject方法来配置乘数服务。请按照本教程正确配置Python项目。
// Configure Multiplier in Python var multiply = builder.AddPythonProject("multiplyapp", "../../python-multiplier", "app.py") .WithHttpEndpoint(targetPort: 5001, env: "APP_PORT", name: "http") .WithEnvironment("OTEL_SERVICE_NAME", "multiplyapp") .PublishAsDockerFile();
原生支持NodeJS,因此我们可以使用AddNodeApp方法来配置divider服务。
// Configure Divider in NodeJS var divide = builder.AddNodeApp(name: "divideapp", scriptPath: "app.js", workingDirectory: "../../node-divider") .WithHttpEndpoint(targetPort: 4000, env: "APP_PORT", name: "http") .WithEnvironment("OTEL_SERVICE_NAME", "divideapp") .PublishAsDockerFile();
这并不奇怪,.NET Aspire 原生支持 .NET,因此我们可以使用 AddProject 方法来配置减法器服务。
// Configure Subtractor in .NET var subtract = builder.AddProject<Projects.dotnet_subtractor>("subtractapp") .WithReference(insights) .WithEnvironment("OTEL_SERVICE_NAME", "subtractapp");
可以使用 AddRedis 方法轻松配置 Redis 缓存,或者在本场景中通过 AddDaprStateStore 方法使用 Dapr。
// Configure Dapr State Store var stateStore = builder.AddDaprStateStore("statestore");
Dapr不是本文的重点,但值得一提的是.NET Aspire可以与Dapr结合使用来构建分布式应用程序。有关 Dapr 的更多信息,请参考官方文档。
最后,我们可以使用 AddNpmApp 方法配置前端服务。
// Configure Frontend in React builder.AddNpmApp(name: "calculator-front-end", workingDirectory: "../../react-calculator") .WithDaprSidecar(new DaprSidecarOptions { AppPort = 3000, AppProtocol = "http", DaprHttpPort = 3500 }) .WithEnvironment("DAPR_HTTP_PORT", "3500") .WithReference(addEnpoint) .WithReference(multiply) .WithReference(divide) .WithReference(subtract) .WithReference(stateStore) .WithReference(insights) .WithHttpEndpoint(targetPort: 3000, env: "PORT") .WithExternalHttpEndpoints() .WithEnvironment("OTEL_SERVICE_NAME", "calculator-front-end") .PublishAsDockerFile();
由于我们引用了所有先前配置的服务,因此我们可以轻松地将它们连接到前端服务。当我们需要从前端调用加法器时,我们可以使用 Aspire 注入的环境变量轻松实现:
app.post('/calculate/add', async (req, res) => { try { const serviceUrl = process.env.services__addapp__http__0; const appResponse = await axios.post(`${serviceUrl}/add`, req.body); // Return expected string result to client return res.send(`${appResponse.data}`); } catch (err) { console.log(err); } });
The entire application can be deployed to Azure using the Azure Developer CLI. The CLI will read the manifest generated by the AppHost project and deploy the application to Azure, creating all the necessary resources. To learn how to integrate Aspire with the Azure Developer CLI, please reference the official tutorial.
All the code for the distributed calculator can be found in the Aspire Multilanguage repository.
以上是.NET Aspire 多语言的详细内容。更多信息请关注PHP中文网其他相关文章!