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>());
});
}

源码

参考资料

NATS: Aspire.NATS.Net 库的更多相关文章

  1. 一种开源的分布式消息系统Nats

    一种开源的分布式消息系统Nats 作者:chszs.未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 1.NATS介绍 NATS是一个开源的 ...

  2. 高性能消息中间件——NATS

    前 言 这段时间我的主要工作内容是将公司系统中使用的RabbitMQ替换成NATS,而此之前我对Nats一无所知.经过一段时间紧张的学习和开发之后我顺利的完成了任务,并对消息中间件有了更深的了解.在此 ...

  3. benthos stream nats 集成试用

    测试demo 来自官方例子 使用docker-compose 进行运行 nats docker-compose file version: '3.3' services: nats: image: n ...

  4. NATS_08:NATS客户端Go语言手动编写

    NATS客户端    一个NATS客户端是基于NATS服务端来说既可以是一个生产数据的也可以是消费数据的.生产数据的叫生产者英文为 publishers,消费数据的叫消费者英文为 subscriber ...

  5. [golang] nats的消息传递模型介绍

    目录 nats的消息传递模型 What is NATS 主题式消息(Subject-Based Messaging) 发布订阅(Publish-Subscribe) 请求应答(Request-Repl ...

  6. Java 框架、库和软件的精选列表(awesome java)

    原创翻译,原始链接 本文为awesome系列中的awesome java Awesome Java Java 框架.库和软件的精选列表 项目 Bean映射 简化 bean 映射的框架 dOOv - 为 ...

  7. 消息队列Queue大全

    消息队列Queue大全 (http://queues.io/) 作业队列,消息队列和其他队列.几乎所有你能想到的都在这. 关于 那里有很多排队系统.他们每个人都不同,是为解决某些问题而创建的.这个页面 ...

  8. AlterNats是如何做到高性能的发布订阅的?

    前言 在过去的一些文章里面,我们聊了一些.NET平台上高性能编程的技巧,今天带大家了解一下AlterNats这个库是如何做到远超同类SDK性能的. NATS:NATS是一个开源.轻量级.高性能的分布式 ...

  9. CloudFoundry Service 使用

    Mysql服务在V2版本号中github上有独立的releaseproject(cf-mysql-release),该release提供了一个Mysql-broker和一个Mysql-server和( ...

  10. CloudFoundry.yml修订

    --- name: CFRELEASE02 director_uuid: fdd46e30-f2c5-41dc-9662-0976fdac5716 releases: - name: cf versi ...

随机推荐

  1. 搜广推算法校招面试:BOSS直聘 推荐搜索系统工程师

      本文介绍2024届秋招中,BOSS直聘的推荐/搜索系统工程师岗位一面的面试基本情况.提问问题等.   2023年12月,赶在秋招的末尾,投递了BOSS直聘的推荐/搜索系统工程师岗位,并不清楚所在的 ...

  2. flops, params = profile(model, inputs=(x,))计算

    计算量:FLOPs,FLOP时指浮点运算次数,s是指秒,即每秒浮点运算次数的意思,考量一个网络模型的计算量的标准.参数量:Params,是指网络模型中需要训练的参数总数. flops(G) = flo ...

  3. window和Linux下安装nvidia的apex

    两种方法: 1.去github下下载apex,之后安装到你的python环境下,我的安装路径:E:\Anaconda\anaconda\envs\pytorch\Lib\site-packages 注 ...

  4. 2022年 GOPS 全球运维大会(上海站)资料分享

    2022年 GOPS 全球运维大会(上海站)主题为"XOps 风向标",共分为16个专场,主要侧重方向是运维.DevOps.AIOps.DevSecOps.云原生.研发效能.可观测 ...

  5. js 中必须加分号的位置集合

    1. 匿名函数(自执行函数)(function (){}()) 2. 解析赋值    2 个变量交换位置

  6. apisix~kafka-logger插件

    作用 将http请求与响应的内容发到kafka的topic,以json的形式发送存储 配置相关 log_format为自定义配置字段,添加后,默认的请求响应消息将被覆盖 { "_meta&q ...

  7. python数据结构学习第一章——栈

    在这片文章中,我们使用python3.8自制一个具有基本功能的栈结构,它的功能只有push,pop,peek这三个功能 ` #!/usr/bin/env python # * coding: utf- ...

  8. 妙用编辑器:使用Notepad--列编辑功能批量生成维护命令

    应用场景 在日常工作中,维护人员可能会要批量生成一些配置命令,示例如下:添加12个分组 ADD GROUP:GID=1,FCN=646322; ADD GROUP:GID=1,FCN=646322; ...

  9. Nacos2.3.2在ubuntu中的部署

    Nacos2.3.2 在ubuntu下的部署 下载地址 发布历史 | Nacos 官网 https://download.nacos.io/nacos-server/nacos-server-2.3. ...

  10. 云原生周刊:Kubernetes Grafana 看板更新 | 2024.5.13

    开源项目推荐 Chart Testing Chart Testing 是用于测试 Helm 图表的工具.它旨在用于对拉取请求进行 lint 和测试.它会自动检测针对目标分支更改的图表. Cluster ...