NATS: Aspire.NATS.Net 库
NuGet
快速入门
首先,你需要已经配置了 NATS 服务器,并且知道访问这个服务器的 URL 地址。
安装 NuGet
使用你熟悉的方式安装 NuGet 库
dotnet add package Aspire.NATS.Net
使用示例
在项目的 Program.cs 中,调用 AddNatsClient() 扩展方法以在依赖注入容器中注册 INatsConnection 对象。该方法需要一个连接串作为参数。
builder.AddNatsClient("nats");
以后可以在通过 INatsConnection 来注入对象实例。例如,在 Web API 的控制器中
private readonly INatsConnection _connection;
public ProductsController(INatsConnection connection)
{
    _connection = connection;
}
配置
基于你的需求和项目的使用方式,.NET Aspire NATS 组件提供了多种方式配置 NATS 连接。
使用连接串
当使用来自 ConnectionStrings 配置节中的连接串时,可以在调用 AddNatsClient() 方法的时候,提供连接串的名称。
builder.AddNatsClient("myConnection");
其中的连接串来自配置文件 appsettings.json
{
  "ConnectionStrings": {
    "myConnection": "nats://nats:4222"
  }
}
使用配置提供器
.NET Aspire NATS 组件支持 Microsoft.Extensions.Configuration,它会从键 Aspire:Nats:Client 中加载 NatsClientSettings 配置。例如下面的 appsettings.json 中
{
  "Aspire": {
    "Nats": {
      "Client": {
        "DisableHealthChecks": true
      }
    }
  }
}
使用内联代码
你还可以通过提供 Action<NatsClientSettings> configureSettings 委托来内联配置其它设置,例如,禁用健康检查:
builder.AddNatsClient("nats", settings => settings.DisableHealthChecks = true);
AppHost 扩展
在 AppHost 项目中,安装 Aspire.Hosting.Nats NuGet 库
dotnet add package Aspire.Hosting.Nats
然后,在 AppHost 的 Program.cs 中,注册 NATS 服务器并使用它。
// nats, the "nats" is the name of connection string
// MUST call the WithJetStream() if it is requried
var nats = builder.AddNats("nats")
    .WithJetStream();
var myService = builder.AddProject<Projects.MyService>()
                       .WithReference(nats);
这里的 WithReference() 方法,配置了 MyService 项目中名为 "nats" 的连接。请注意,在 MyService 项目的 Program.cs 中,使用如下方式来使用该连接。
builder.AddNatsClient("nats");
实现代码
注册用于连接到 NATS 服务器的 NATS 客户端的 INatsConnection 服务
- connectionName,用于从 ConnectionStrings 配置节中提取 NATS 连接串的名称
 - configureSettings,用于定制 NatsClientSettings 配置项
 - configureOptions,用于定制 NatsOpts
 
    public static void AddNatsClient(this IHostApplicationBuilder builder, string connectionName, Action<NatsClientSettings>? configureSettings = null, Func<NatsOpts, NatsOpts>? configureOptions = null)
        => AddNatsClient(builder, configurationSectionName: DefaultConfigSectionName, connectionName: connectionName, serviceKey: null, configureSettings: configureSettings, configureOptions: configureOptions);
private static void AddNatsClient(this IHostApplicationBuilder builder, string configurationSectionName, string connectionName, object? serviceKey, Action<NatsClientSettings>? configureSettings, Func<NatsOpts, NatsOpts>? configureOptions)
{
    ArgumentNullException.ThrowIfNull(builder);
    NatsClientSettings settings = new();
    builder.Configuration.GetSection(configurationSectionName).Bind(settings);
    if (builder.Configuration.GetConnectionString(connectionName) is string connectionString)
    {
        settings.ConnectionString = connectionString;
    }
    configureSettings?.Invoke(settings);
    NatsConnection Factory(IServiceProvider provider)
    {
        var options = NatsOpts.Default with
        {
            LoggerFactory = provider.GetRequiredService<ILoggerFactory>(),
        };
        if (configureOptions != null)
        {
            options = configureOptions(options);
        }
        if (settings.ConnectionString == null)
        {
            throw new InvalidOperationException($"NATS connection string not found: {connectionName}");
        }
        options = options with { Url = settings.ConnectionString };
        return new NatsConnection(options);
    }
    if (serviceKey == null)
    {
        builder.Services.TryAddSingleton(Factory);
        builder.Services.TryAddSingleton<INatsConnection>(static provider => provider.GetRequiredService<NatsConnection>());
    }
    else
    {
        builder.Services.TryAddKeyedSingleton<NatsConnection>(serviceKey, (provider, _) => Factory(provider));
        builder.Services.TryAddKeyedSingleton<INatsConnection>(serviceKey, static (provider, key) => provider.GetRequiredKeyedService<NatsConnection>(key));
    }
    if (!settings.DisableHealthChecks)
    {
        builder.TryAddHealthCheck(new HealthCheckRegistration(
            serviceKey is null ? "NATS" : $"NATS_{connectionName}",
            sp => new NatsHealthCheck(serviceKey is null
                ? sp.GetRequiredService<INatsConnection>()
                : sp.GetRequiredKeyedService<INatsConnection>(serviceKey)),
            failureStatus: default,
            tags: default,
            timeout: default));
    }
    if (!settings.DisableTracing)
    {
        builder.Services
            .AddOpenTelemetry()
            .WithTracing(tracer =>
            {
                tracer.AddSource(ActivityNameSource);
            });
    }
}
/// <summary>
/// Registers <see cref="INatsJSContext"/> service for NATS JetStream operations.
/// </summary>
/// <param name="builder">The <see cref="IHostApplicationBuilder" /> to read config from and add services to.</param>
/// <exception cref="ArgumentNullException">Thrown if mandatory <paramref name="builder"/> is null.</exception>
public static void AddNatsJetStream(this IHostApplicationBuilder builder)
{
    ArgumentNullException.ThrowIfNull(builder);
    builder.Services.AddSingleton<INatsJSContext>(static provider =>
    {
        return new NatsJSContextFactory().CreateContext(provider.GetRequiredService<INatsConnection>());
    });
}
源码
参考资料
- https://nats-io.github.io/nats.net.v2/documentation/intro.html
 - https://github.com/dotnet/aspire/tree/main/src/Components/README.md
 
NATS: Aspire.NATS.Net 库的更多相关文章
- 一种开源的分布式消息系统Nats
		
一种开源的分布式消息系统Nats 作者:chszs.未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 1.NATS介绍 NATS是一个开源的 ...
 - 高性能消息中间件——NATS
		
前 言 这段时间我的主要工作内容是将公司系统中使用的RabbitMQ替换成NATS,而此之前我对Nats一无所知.经过一段时间紧张的学习和开发之后我顺利的完成了任务,并对消息中间件有了更深的了解.在此 ...
 - benthos stream nats 集成试用
		
测试demo 来自官方例子 使用docker-compose 进行运行 nats docker-compose file version: '3.3' services: nats: image: n ...
 - NATS_08:NATS客户端Go语言手动编写
		
NATS客户端 一个NATS客户端是基于NATS服务端来说既可以是一个生产数据的也可以是消费数据的.生产数据的叫生产者英文为 publishers,消费数据的叫消费者英文为 subscriber ...
 - [golang] nats的消息传递模型介绍
		
目录 nats的消息传递模型 What is NATS 主题式消息(Subject-Based Messaging) 发布订阅(Publish-Subscribe) 请求应答(Request-Repl ...
 - Java 框架、库和软件的精选列表(awesome java)
		
原创翻译,原始链接 本文为awesome系列中的awesome java Awesome Java Java 框架.库和软件的精选列表 项目 Bean映射 简化 bean 映射的框架 dOOv - 为 ...
 - 消息队列Queue大全
		
消息队列Queue大全 (http://queues.io/) 作业队列,消息队列和其他队列.几乎所有你能想到的都在这. 关于 那里有很多排队系统.他们每个人都不同,是为解决某些问题而创建的.这个页面 ...
 - AlterNats是如何做到高性能的发布订阅的?
		
前言 在过去的一些文章里面,我们聊了一些.NET平台上高性能编程的技巧,今天带大家了解一下AlterNats这个库是如何做到远超同类SDK性能的. NATS:NATS是一个开源.轻量级.高性能的分布式 ...
 - CloudFoundry Service 使用
		
Mysql服务在V2版本号中github上有独立的releaseproject(cf-mysql-release),该release提供了一个Mysql-broker和一个Mysql-server和( ...
 - CloudFoundry.yml修订
		
--- name: CFRELEASE02 director_uuid: fdd46e30-f2c5-41dc-9662-0976fdac5716 releases: - name: cf versi ...
 
随机推荐
- USB总线-Linux内核USB3.0主机控制器驱动框架分析(十二)
			
1.概述 如下图所示,Linux内核中USB主机体系结构由五部分组成,分别为Application Software.USB Class Driver.USB Core((USB Driver).US ...
 - iOS多态使用小结
			
多态是面试程序设计(OOP)一个重要特征,但在iOS中,可能比较少的人会留意这个特征,实际上在开发中我们可能已经不经意的使用了多态.比如说: 有一个tableView,它有多种cell,cell的UI ...
 - dotnet定义扩展方法
			
// 扩展方法 // 1.创建静态类静态方法 2. 在静态方法中参数中使用 this 关键字指定需要扩展的类 // 密封类 不能直接继承,通过扩展方法,拿到父类的属性和方法进行扩展补充
 - JDBC连接数据库(mysql)基本实现-七步
			
// 包名 package com.zhulx; import java.sql.DriverAction; import java.sql.DriverManager; import java.sq ...
 - Nuxt.js 应用中的 kit:compatibility 事件钩子详解
			
title: Nuxt.js 应用中的 kit:compatibility 事件钩子详解 date: 2024/10/11 updated: 2024/10/11 author: cmdragon e ...
 - kotlin集合——>集合概述、构造集合
			
1.kotlin集合概述 在kotli.collections包中包含List(有序集合).Set(无序集合).Map(健值对)三种集合 2.val定义的集合,调用集合方法可以添加删除,但是如果重新创 ...
 - nicegui太香了,跨平台开发和跨平台运行--使用Python+nicegui实现系统布局界面的开发
			
在现今国产化浪潮的驱动下,跨平台或者缩小范围说基于国产化Linux或者基于国产鸿蒙系统的开发才是未来的趋势了,风口浪尖上,我们开发人员也只能顺势而为,本篇随笔介绍在Python开发中,使用使用Pyth ...
 - 大数据技术之Shell
			
1. shell概述 示意图: Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动.挂起.停止甚至是编写一些程序. ● L ...
 - 黑客工具:Amass – 寻找子域
			
安装 所有信息都可以在 OWASP Amass 项目的 Github 页面上找到:https://github.com/OWASP/Amass.我们将一起完成安装过程,以便更快地部署. 转到发布页面并 ...
 - Avalonia开源控件库强力推荐-Semi.Avalonia
			
Avalonia是什么? Avalonia是一个强大的框架,使开发人员能够使用.NET创建跨平台应用程序.它使用自己的渲染引擎绘制UI控件,确保在Windows.macOS.Linux.Android ...