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 ...
随机推荐
- 智慧医院IT运维方案,全局网络态势感知
随着医疗卫生体制改革不断深化,卫生行业信息化应用不断普及,大数据.AI.医疗物联网等技术的应用,快速推动"智慧医院"建设.以HIS(医院信息系统).EMRS(电子病历系统).PAC ...
- 全网最适合入门的面向对象编程教程:55 Python字符串与序列化-字节序列类型和可变字节字符串
全网最适合入门的面向对象编程教程:55 Python 字符串与序列化-字节序列类型和可变字节字符串 摘要: 在 Python 中,字符编码是将字符映射为字节的过程,而字节序列(bytes)则是存储这些 ...
- python中队列deque的使用
队列,堆栈是程序开发中常用的两种数据存储模型.python中队列怎么运用呢?以下内容介绍了队列的使用和队列的函数. from collections import deque q = deque() ...
- docker容器中启动tomcat应用
Dockerfile FROM tomcat:8.5.46-jdk8-openjdk-slim COPY ecs-console.war /usr/local/tomcat/webapps/ ENV ...
- day12-包机制
包机制 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包语句的语法格式为: 包的本质就是文件夹 package pkg1[.pkg2[.pkg3...]]; 一般公司域名倒置作为 ...
- 云原生周刊:Score 成为 CNCF 沙箱项目|2024.08.12
开源项目推荐 KubeOne Kubermatic KubeOne 自动化管理您所有云环境.本地环境.边缘计算和物联网环境中的集群操作.KubeOne 可以安装高可用(HA)的主集群,也可以安装单主集 ...
- 基于 KubeSphere 的运管系统落地实践
作者:任建伟,某知名互联网公司云原生工程师,容器技术信徒,云原生领域的实践者. 背景介绍 在接触容器化之前,我们团队内部的应用一直都是基于虚拟机运管,由开发人员自行维护. 由于面向多开发部门服务,而开 ...
- 在 Kubernetes 中基于 StatefulSet 部署 MySQL(下)
大家好,我是老 Z! 上篇文章实现了 MySQL 数据库在基于 KubeSphere 部署的 K8s 集群上的安装部署,部署方式采用了图形化界面这种形式.本文将会介绍如何使用 GitOps 来部署 M ...
- 为什么样本方差是除以 n-1 而不是 n?
摘自https://www.zhihu.com/question/20099757/answer/13971886 https://www.zhihu.com/question/20099757/an ...
- 160. 相交链表 Golang实现
题目描述: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点.如果两个链表不存在相交节点,返回 null . 注意这里的相交节点表示的是值和物理位置都相同的 ...