NATS: 自定义服务 (Service)
使用 NATS 服务框架来创建服务会变得非常简单,基于 NATS 的服务框架,NAST 的客户端库可以更简单的构建、服务发现和监控服务。服务框架自动将所有的订阅归类到一个队列组中,提供构建基于层次化的主题功能和对应的处理器。
不需要其它的负担,库提供自动化的服务发现和状态报告,通过 NATS CLI 提供的 micro 命令,可以简单地查询和报告所有使用该框架的服务。
NATS 本身提供了同步访问的 Request 模式,这里的服务与它类似,发送请求还是 Request,不过这里是通过提供一个处理器来对收到的数据直接进行加工,并返回结果。
1. 项目准备
示例项目的使用了 .NET 的日志支持,它直接将日志输出到 Console 控制台中。所以需要在项目创建之后,添加相应的 NuGet 包。
> dotnet add package NATS.Net
> dotnet add package NATS.Client.Serializers.Json
> dotnet add package Microsoft.Extensions.Logging.Console
创建日志器实例
using System;
using Microsoft.Extensions.Logging;
using NATS.Client.Core;
using NATS.Client.Serializers.Json;
using NATS.Client.Services;
using var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
var logger = loggerFactory.CreateLogger("NATS-by-Example");
创建 NATS 服务管理
var url = Environment.GetEnvironmentVariable("NATS_URL") ?? "127.0.0.1:4222";
var opts = new NatsOpts
{
Url = url,
LoggerFactory = loggerFactory,
SerializerRegistry = NatsJsonSerializerRegistry.Default,
Name = "NATS-by-Example",
};
await using var nats = new NatsConnection(opts);
var svc = new NatsSvcContext(nats);
2. 创建服务
实现创建服务对象,它用来管理具体的服务。
首先需要创建服务定义,每个服务需要
- 服务名称,不能包含空格
- 版本
- 描述
这里首先创建名为 minmax 的服务,
var service = await svc.AddServiceAsync(new NatsSvcConfig("minmax", "0.0.1")
{
Description = "Returns the min/max number in a request"
});
虽然此时还没有运行中的服务端点,这个服务已经可以通过 micro 协议可以被发现出来,比如通过 nats micro 命令查询。所有后台的支持,比如服务发现,PING 和状态此时都已经开始。
每当创建一个服务实例的时候,它会赋予一个唯一的标识。如果有同样名称的 minmax 运行在 NATS 的主题空间中,那么像 nats micro 这样的工具会将它们视为服务的同一个实例,而背后对该端点的订阅被作为一个队列订阅。因此,对服务的每个请求将只会发给一个端点进行处理。
3. 添加服务端点
到此为止,其实还没有对外的服务访问端点。此时的服务还是一个内部的概念。这一节开始这个问题。
当端点不支持固定的主题的时候,服务可以被加入到一个组中,这个组的名称被视为命名空间,当作主题的前缀。在下面的示例中,所有的端点都将会监听以 minmax 开始的主题。
var root = await service.AddGroupAsync("minmax");
现在为服务创建 2 个访问端点。一个用于 min 操作,另一个用于 max 操作。每个端点表示为一个订阅。参数中提供的处理器将负责实际的响应处理,分别对应 minmax.min 和 minmax.max。
await root.AddEndpointAsync(HandleMin, "min", serializer: NatsJsonSerializer<int[]>.Default);
await root.AddEndpointAsync(HandleMax, "max", serializer: NatsJsonSerializer<int[]>.Default);
ValueTask HandleMin(NatsSvcMsg<int[]> msg)
{
var min = msg.Data.Min();
return msg.ReplyAsync(min);
}
ValueTask HandleMax(NatsSvcMsg<int[]> msg)
{
var min = msg.Data.Max();
return msg.ReplyAsync(min);
}
4. 访问服务
访问服务通过向服务端点发出请求来实现。
下面的示例中,分别向 minmax.min 和 minmax.max 发出请求,它们的前缀是服务组 minmax。
注意对于请求没有什么特别的,就是常规的 NATS 请求。是同步访问,等待返回结果的形式。
var min = await nats.RequestAsync<int[], int>("minmax.min", new[]
{
-1, 2, 100, -2000
}, requestSerializer: NatsJsonSerializer<int[]>.Default);
logger.LogInformation("Requested min value, got {Min}", min.Data);
var max = await nats.RequestAsync<int[], int>("minmax.max", new[]
{
-1, 2, 100, -2000
}, requestSerializer: NatsJsonSerializer<int[]>.Default);
logger.LogInformation("Requested max value, got {Max}", max.Data);
logger.LogInformation("Bye!");
现在,通过 micro 管理的处理可以对请求进行处理,我们自己不需要其它额外的代码来管理它们。
就是这样啦!
Reference:
NATS: 自定义服务 (Service)的更多相关文章
- 【AngularJS中的自定义服务service VS factory VS provider】---它们的区别,你知道么?
在介绍AngularJS自定义服务之前,我们先来了解一下AngularJS~ 学过HTML的人都知道,HTML是一门很好的伪静态文本展示设计的声明式语言,但是,要构建WEB应用的话它就显得乏力了. 而 ...
- Angular.js之服务与自定义服务学习笔记
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android系统编程入门系列之服务Service中的进程间通信
在上篇文章以线程间的通信方式Handler类结尾,服务Service还支持的进程间通信,又是具体怎么实现的呢?这就要用到加载服务一文中提到的AIDL语言规范了. AIDL是 Android Inter ...
- 在 CentOS7 上将自定义的 jar 包注册为 linux 服务 service
在 CentOS7 上将自定义的 jar 包注册为 linux 服务 service 1.在 /etc/rc.d/init.d/ 目录下创建一个名字和服务名完全相同的 shell 脚本文件 joyup ...
- angularjs factory,service,provider 自定义服务的不同
angularjs框架学了有一段时间了,感觉很好用.可以把angularjs的app理解成php的class,controller是控制器,而内置服务和自定义服务就可以理解成models了.angul ...
- 深究AngularJS——自定义服务详解(factory、service、provider)
前言 3种创建自定义服务的方式. Factory Service Provider 大家应该知道,AngularJS是后台人员在工作之余发明的,他主要应用了后台早就存在的分层思想.所以我们得了解下分 ...
- angularjs 自定义服务的三种方式
angularjs 中可通过三种($provider,$factory,$service)方式自定义服务,以下是不同的实现形式: // 定义module , module中注入$providevar ...
- angularJs自定义服务(实现签名和加密)
写在前面: angularJS是google公司主推的js开发优秀框架... 页面展示: 在应用中进行加密是普遍存在的,个人建议在前端实现加密签名(前端加密是否必要来自知乎:http://www.zh ...
- 【AngularJS】—— 13 服务Service
在AngularJS中有很多的服务,常用的比如$http,$location等等. 本篇文章会介绍一下的内容: 1 $http这种Angular提供的服务的使用 2 如何自定义服务,并总结服务需要注意 ...
- AngularJS 服务(Service)
AngularJS 中你可以创建自己的服务,或使用内建服务. 什么是服务? 在 AngularJS 中,服务是一个函数或对象,可在你的 AngularJS 应用中使用. AngularJS 内建了30 ...
随机推荐
- CTF中特别小的EXE是怎么生成的
我们在打CTF时候,出题的爷爷们给出的exe都很小 就10k左右,有的甚至就5k,那时候我很郁闷啊.现在我也能了啊哈哈 不多bb按如下操作: 我们来看看正常的release生成的代码 #include ...
- Android Qcom USB Driver学习(一)
该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) USB接口类型 Android终端上常用的USB接口:TypeC(现在的主流),MicroB(以前的设备) ...
- USB编码方式(NRZI)及时钟同步方式
1.概述 在同步通讯系统中,两个设备通讯则需要同步信号,同步信号分为时钟同步信号和自同步信号两种,时钟同步方式在通讯链路上具有时钟信号(IIC.SPI),自同步方式在通讯链路中没有同步信号(PCIE. ...
- Blinn-Phong
为什么出现Blinn-Phong 虽然Phong性能较高,但是在某些镜面反射条件下就会失效.比如下图,我们明显发现了一条明显的亮暗边界线,这在实际场景中是不应该发生的(实际场景中不会出现这种明显的过渡 ...
- 【墨天轮专访第四期】华为云GaussDB苏光牛:发挥生态优势,培养应用型DBA
导读: 随着5G互联网时代的来临,各行各业对于数据库的依赖程度也在逐步提高.由于国内在数据库行业的发展起步较晚,数据库的市场份额长期被Oracle,微软等美国公司所控制.但是伴随着国内IT技术栈的不断 ...
- MySQL故障诊断常用方法手册(含脚本、案例)
当你在使用MySQL数据库时,突然遇到故障,你是否会感到迷茫? ● 数据库响应变慢.SQL慢.数据库插入出现延时-- ● 表不见了.日志出现多个断连记录-- ● 非法断电造成MySQL启动报错.同步复 ...
- 【Treatment-Rec 论文阅读】Data-driven Automatic Treatment Regimen Development and Recommendation
Data-driven Automatic Treatment Regimen Development and Recommendation Authors: Leilei Sun, Chuanren ...
- 云原生周刊:Gateway API v1.1 发布 | 2024.6.3
开源项目推荐 Grafana Tanka Tanka 是 Grafana 开发的一款用于 Kubernetes 的灵活.可重用和简洁的配置工具,是使用 YAML 进行 Kubernetes 配置的一种 ...
- 为你的Windows用户设置无边框半透明头像
步骤一:锁定头像 Win+R输入gpedit.msc进入组策略编辑器,按图中所示,选择"计算机管理->管理模板->用户账户设定",将里面唯一选项"对所有账户使 ...
- Docker Compose容器编排--项目五
一.Docker Compose概念 Docker Compose (可简称Compose)是一个定义与运行复杂应用程序的 Docker 工具,是 Docker 官方 编排(Orchestration ...