惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
C
CERT Recently Published Vulnerability Notes
P
Proofpoint News Feed
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
云风的 BLOG
云风的 BLOG
H
Help Net Security
Recorded Future
Recorded Future
The Register - Security
The Register - Security
F
Full Disclosure
N
Netflix TechBlog - Medium
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hackread – Cybersecurity News, Data Breaches, AI and More
爱范儿
爱范儿
Security Archives - TechRepublic
Security Archives - TechRepublic
Simon Willison's Weblog
Simon Willison's Weblog
Cisco Talos Blog
Cisco Talos Blog
I
InfoQ
T
Tenable Blog
T
Tor Project blog
人人都是产品经理
人人都是产品经理
D
DataBreaches.Net
NISL@THU
NISL@THU
Google DeepMind News
Google DeepMind News
博客园 - 叶小钗
B
Blog
V
V2EX
Jina AI
Jina AI
L
LangChain Blog
月光博客
月光博客
W
WeLiveSecurity
U
Unit 42
AWS News Blog
AWS News Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园 - 聂微东
V
Visual Studio Blog
A
Arctic Wolf
T
Tailwind CSS Blog
The Cloudflare Blog
SecWiki News
SecWiki News
S
SegmentFault 最新的问题
Hacker News - Newest:
Hacker News - Newest: "LLM"
宝玉的分享
宝玉的分享
MyScale Blog
MyScale Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Securelist
www.infosecurity-magazine.com
www.infosecurity-magazine.com
腾讯CDC
雷峰网
雷峰网

博客园 - 小得盈满

Hudi 时间旅行与增量查询的区别分析 Doris 和 StarRocks 性能测试对比 ClickHouse 添加磁盘扩容存储 使用 Docker 部署 Elasticsearch 集群 Qdrant 单机和集群的安装方法 ClickHouse UDF 的基本用法 StarRocks 容器镜像构建 Kafka 线上性能调优 StarRocks 集群安装 Kafka 的分片和副本机制 Flink 自定义 ClickHouse Table Connector 的简单实现 Redis 性能优化实战 记一次 Go 调用系统命令出现的问题分析 APISIX proxy-cache 插件用法 etcd 历史版本回溯的方法 APISIX 简单的自定义插件开发步骤 Kafka 集群副本数量调整 使用 Docker Compose 安装 APISIX etcd 集群安装 Consul 集群安装
NATS 的基本安装及使用
小得盈满 · 2026-03-15 · via 博客园 - 小得盈满

1. 基本介绍

NATS 是一个轻量的消息中间件,具备比较好的性能,在一些中小型的场景可以作为 Kafka 或者 Pulsar 的替代,一个最小化的使用场景需要两个组件,分别是 nats-server 和 NATS 客户端。

NATS 官网是:https://nats.io/

nats-server 仓库为:https://github.com/nats-io/nats-server

nats 客户端仓库为:https://github.com/nats-io/natscli

直接在 Release 下面可以下载安装包,我们直接下载当前时间(2025-09-19)最新版本的程序包进行测试。

当前的版本如下:

  1. nats-server 版本为:v2.12.0-RC6
  2. NATS 客户端版本为:0.2.4

下载后解压安装包后每个解压的目录下都有一个可执行文件,分别是 nats-servernats,其中 nats 就是客户端,我们把这两个可执行文件移动到 /usr/local/bin 下就可以正常使用了。

NATS 从消息存储上来看有两种方式,分别是 Core NATS 和 JetStream 两种,其中 Core NATS 方式下所有的消息都通过内存转发,在 JetStream 方式下会将消息持久化到硬盘中。

2. 启动 NATS 服务

我们首先来看下 Core NATS 的基本使用,首先启动服务:

nats-server -m 8222 --port 4222

其中 -m 指定页面监控的访问端口,不指定的话默认不开启,开启后可以通过页面或者调用 API 查看当前服务的状态。--port 指定 NATS 的服务端口,默认是 4222。

3. NATS Core 基本用法

普通发布订阅

启动服务后,我们可以开启两个订阅者订阅消息:

# 订阅者 1
nats sub msg.test
# 订阅者 2
nats sub msg.test

开两个窗口启动两个订阅者,这两个订阅者的启动命令完全一样。其中 msg.test 叫做 Subject,中文叫法就是主题,和 Kafka 的 Topic 概念一致。然后我们发布一条消息:

nats pub msg.test "Hello NATS"

然后两个订阅者都会看到相同的消息。假如其中的订阅者下线,期间发布了消息,那么上线后也是看不到的,也就是说消息只转发给当前的订阅者,不会保存,那么如果没有订阅者,消息会被直接丢弃。也就是说这里的主题是虚拟的,需要同时依赖于订阅者同时存在,所有订阅者都消失后则主题也不存在了。

队列组订阅

除了发布订阅的方式,还有队列组的方式。也就是说假如有多个消费者监听同一个主题,队列组可以实现所有的消费者竞争消息,每个消费者拿到的消息也是不重复的。

首先开启两个消费者:

nats reply msg.test "OK1"
nats reply msg.test "OK2"

上面就启动了两个消费者,回复的消息分别为 OK1OK2。队列组并不需要我们指定,只要指定以 nats reply 方式消费主题,那么就表示队列组的方式,NATS 服务会为我们使用同一个组,通过命令行提示就可以看出来。

然后我们运行生产消息:

nats request msg.test "Hello NATS"
nats request msg.test "Hello NATS"
nats request msg.test "Hello NATS"

当我们生产多条消息时,可以看到不同的回复,从消费者角度也可以看到每个消费者消费了一部分消息。

4. NATS JetStream 基本用法

上面只是简单的用法,生产环境下,我们通常采用 JetStream 方式持久化,保证消息的可靠性。同时还需要部署分布式集群实现高可用,我们下面以单节点的 JetStream 为例进行一些测试。

全局用户下配置

正式运行的时候我们通常会使用配置文件来管理配置,一个基本的模板如下:

#General settings
host: 0.0.0.0
port: 4222

# Various server level options
max_payload: 8M

# The following sections are maps with a set of (nested) properties

jetstream {
    enable: true
    # JetStream storage location, limits and encryption
    store_dir: /data/nats
}

#tls { 
    # Configuration map for tls parameters used for client connections, 
    # routes and https monitoring connections.
#}

gateway {
    # Configuration map for gateway. Gateways are used to connected clusters.
}

leafnodes {
    # Configuration map for leafnodes. LeafNodes are lightweight clusters.
}

mqtt {
    # Configuration map for mqtt. Allow clients to connect via mqtt protocol.
} 

websocket {
    # Configuration map for websocket. Allow clients to connect via websockets.
} 

accounts {
    # List of accounts and user within accounts
    # User may have an authorization and authentication section
}

authorization { 
    # User may have an authorization and authentication section
    # This section is only useful when no accounts are defined
    token: "$2a$11$ZWmBnJDvJI03kBfsUPzwYehDuCO6XV6VvhvnBdNwNpF4aMOtZbhyi"
}

mappings {
    # Subject mappings for default account
    # When accounts are defined this section must be in the account map
}

#resolver {
    # Pointer to external Authentication/Authorization resolver
    # There are multiple possible resolver type explained in their own chapters of this docuemntaion
    # memory, nats-base, url ... more may be added in the future
    # This parameter can be a value `MEMORY` for simple configuration
    # or a map of properties for connecting to the resolver
#}

resolver_tls {
    # TLS configuration for an URL based resolver
}

resolver_preload {
    # List of JWT tokens to be loaded at server start.
}

在全局配置中我们设置了端口和消息的最大大小。如果要开启 JetStream 支持需要在 jetstream 配置部分启用并且设置存储的目录,建议放到单独的 SSD/NVMe 硬盘中。

然后在 authorization 中设置默认用户的密码,这个配置仅限于默认用户。我们可以通过将密码生成一个比较安全的字符串:

nats server passwd

生成后配置到 token 中即可。

然后将配置保存到 /etc/nats-server.conf 并启动服务:

nats-server -c /etc/nats-server.conf

启动后查看当前的用户:

nats account info -s nats://<password>@localhost:4222

这时候会看到一个默认的用户 $G,这就是全局的默认用户了。然后我们需要创建一个 Stream,Stream 就是一个底层的存储实体:

nats stream add orders --subjects "orders.*" --ack --max-msgs=-1 --max-bytes=-1 --max-age=7d --storage file --retention limits --max-msg-size=-1 --discard=old -s nats://<password>@localhost:4222

上面很多参数都是默认,这里 Stream 名称为 orders,对应的一组主题是 orders.*,其他参数都不是必须的,如果不输入也都会有提示,当前都是默认。

创建后可以查看当前的 Stream:

nats stream list -s nats://<password>@localhost:4222

然后在这个 Stream 上创建两个消费者:

nats consumer add -s nats://<password>@localhost:4222

根据提示创建,我们这里创建两个消费者。创建后查看消费者:

nats consumer list -s nats://<password>@localhost:4222

然后启动一个发布者,慢速发布消息:

nats pub orders.a --count=1000 --sleep 1s "publication #{{.Count}} @ {{.TimeStamp}}" -s nats://<password>@localhost:4222

然后启动消费者消费数据:

nats consumer next orders <consumer-name> --count 1000 -s nats://<password>@localhost:4222

如果启动多个不一样的消费者,那么每个消费者看到的消息是完全一样的。如果一个消费者运行多次,那么行为和上面 NATS Core 一样可以抢占消息。当我们的消费者中断后再启动时,数据也会从之前的位置消费,因为数据是持久化的,只要在配置的范围内就不会丢失。

独立用户账户下配置

然后还可以单独在配置文件中添加租户或者账户,同时开启 JetStream,这样的话全局就不需要配置了。例如:

accounts {
    # List of accounts and user within accounts
    # User may have an authorization and authentication section
    dev: {
        users: [
            {user: dev, password: dev-123456}
        ]
        jetstream: {
            max_mem: 8G
            max_file: 100G
            max_streams: 16
            max_consumers: 100
        }
    }
}

在账户配置 accounts 中可以单独对 JetStream 的配置参数进行限制同时在 users 中配置当前账户的用户信息,其中的密码可以是明文也可以使用 nats server passwd 生成。账户和用户是一对多的关系,但是仍然建议一个账户关联一个用户。

注意配置专门的账户后,全局的 Token 或用户密码配置需要删除掉,账户和全局的配置不可以同时存在。

然后我们可以查看账户信息:

nats account info -s nats://dev:dev-123456@localhost:4222

然后我们可以在这个账户下继续添加一个 Stream:

nats stream add orders --subjects "orders.*" --ack --max-msgs=-1 --max-bytes=-1 --max-age=7d --storage file --retention limits --max-msg-size=-1 --discard=old -s nats://dev:dev-123456@localhost:4222

创建后在数据目录 /data/nats/jetstream 下就会出现和账户名称一样的目录名称,当前是 dev,然后下面会有 streams/orders,也就是这个账户下的 Stream。值得注意的是,之前的 $G 账户仍然存在并且不受影响,NATS 服务只会读取当前配置文件配置的用户数据目录,当我们修改为之前存在的配置并重启服务后,NATS 会按照实际配置文件读取,其他没有配置的数据目录不会受到影响。

对于独立账户的发布消息和多个消费者消费的行为和之前全局账户的完全一致。

然后我们还可以继续添加管理用户用于监控集群的状态等,在添加用户账户的情况下不能在全局添加,仍然需要和上面一样添加用户,主要的配置如下:

system_account: "$SYS"

accounts {
  $SYS {
    users = [
      { user: "sysadmin", password: "sysadmin123" }
    ]
  }
  # 其他用户配置 ...
}

这样就添加了 $SYS 系统用户,可以访问 $SYS.> 等系统 Subject,主要用于集群的指标监控。另外由于我们没有显式配置 JetStream,所以即使是系统用户也无法创建 Stream,当然也无法访问其他用户的 JetStream 配置。

5. 使用 Systemd 管理 NATS 服务

正常运行时为了方便管理可以使用 Systemd 实现服务的管理,服务文件可以参考仓库:https://github.com/nats-io/nats-server/tree/main/util

基于我们当前的环境配置内容如下:

[Unit]
Description=NATS Server
After=network-online.target ntp.service local-fs.target

[Service]
PrivateTmp=true
Type=simple
ExecStart=/usr/local/bin/nats-server -c /etc/nats-server.conf
ExecReload=/bin/kill -s HUP $MAINPID

# The nats-server uses SIGUSR2 to trigger Lame Duck Mode (LDM) shutdown
# https://docs.nats.io/running-a-nats-service/nats_admin/lame_duck_mode
ExecStop=/bin/kill -s SIGUSR2  $MAINPID

# This should be `lame_duck_duration` + some buffer to finish the shutdown.
# By default, `lame_duck_duration` is 2 mins.
TimeoutStopSec=150

Restart=on-failure

User=root
Group=root

[Install]
WantedBy=multi-user.target

最后将服务保存成文件 nats-server.service 并放到系统服务目录中即可。

然后可以加载并启动服务:

systemctl daemon-reload
systemctl start nats-server

查看服务状态:

systemctl status nats-server

状态正常就可以使用了。