nats

package
v0.2.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 15, 2026 License: MIT Imports: 10 Imported by: 0

Documentation

Overview

Package nats 提供 NATS 消息队列客户端封装。

基于 nats-io/nats.go,为 ekit 微服务提供统一的 NATS 接入。

核心特性

  • 自动重连 + 重连回调
  • Publish / Subscribe / QueueSubscribe
  • Request / Reply(同步 RPC 模式)
  • JSON 序列化/反序列化
  • 优雅关闭(drain)

使用方式

// 连接
client, err := nats.NewClient("nats://localhost:4222",
    nats.WithName("my-service"),
    nats.WithReconnectWait(2*time.Second),
)
defer client.Close()

// 发布
err := client.Publish(ctx, "order.created", []byte(`{"id":1}`))

// 订阅
sub, err := client.Subscribe(ctx, "order.created", func(msg *nats.Msg) {
    log.Printf("received: %s", string(msg.Data))
})
defer sub.Unsubscribe()

// Request/Reply
resp, err := client.Request(ctx, "user.get", []byte(`{"id":1}`), 5*time.Second)

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func QueueSubscribeJSON

func QueueSubscribeJSON[T any](c *Client, subject, queue string, handler func(ctx context.Context, msg *T)) (*nats.Subscription, error)

QueueSubscribeJSON 订阅主题(队列模式)并自动反序列化 JSON 消息。

同 SubscribeJSON,从 NATS message header 中提取 trace_id 注入 ctx。

func RequestJSON

func RequestJSON[Req, Resp any](c *Client, ctx context.Context, subject string, req *Req, timeout time.Duration) (*Resp, error)

RequestJSON 发送 JSON 请求并反序列化响应。 使用 context 控制超时和取消。

func SubscribeJSON

func SubscribeJSON[T any](c *Client, subject string, handler func(ctx context.Context, msg *T)) (*nats.Subscription, error)

SubscribeJSON 订阅主题并自动反序列化 JSON 消息。

从 NATS message header 中提取 trace_id(如果存在)并注入到 handler 的 ctx, 保持分布式追踪在异步消息边界不断裂。Publisher 端需要在 Publish 时通过 PublishWithTraceID 注入 trace_id 才能形成完整链路。

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client 是 NATS 客户端封装。

func NewClient

func NewClient(urls string, opts ...NatsOption) (*Client, error)

NewClient 创建 NATS 客户端并连接。

urls 示例: "nats://localhost:4222" 或 "nats://host1:4222,nats://host2:4222"

func (*Client) Close

func (c *Client) Close()

Close 关闭连接(先排空订阅,再关闭)。 如果需要立即关闭(不等待消息处理完成),直接调用 c.conn.Close()。 多次调用是安全的(sync.Once 保证只执行一次)。

func (*Client) Conn

func (c *Client) Conn() *nats.Conn

Conn 返回底层 nats.Conn(用于高级用法)。

func (*Client) ConnectedUrl

func (c *Client) ConnectedUrl() string

ConnectedUrl 返回当前连接的 URL。

func (*Client) Drain

func (c *Client) Drain() error

Drain 排空连接(等待所有消息处理完成后关闭)。

func (*Client) IsConnected

func (c *Client) IsConnected() bool

IsConnected 返回是否已连接。

func (*Client) NewJetStream

func (c *Client) NewJetStream() (*JetStream, error)

NewJetStream 创建 JetStream v2 客户端。

func (*Client) Publish

func (c *Client) Publish(ctx context.Context, subject string, data []byte) error

Publish 发布消息到指定主题。

func (*Client) PublishJSON

func (c *Client) PublishJSON(ctx context.Context, subject string, v any) error

PublishJSON 发布 JSON 编码的消息。

func (*Client) PublishJSONWithTraceID

func (c *Client) PublishJSONWithTraceID(ctx context.Context, subject string, v any) error

PublishJSONWithTraceID 发布 JSON 消息并从 ctx 提取 trace_id 注入 NATS message header。 配合 SubscribeJSON 自动恢复 trace_id 形成跨消息链路的完整追踪。

func (*Client) PublishWithTraceID

func (c *Client) PublishWithTraceID(ctx context.Context, subject string, data []byte) error

PublishWithTraceID 发布消息并从 ctx 提取 trace_id 注入 NATS message header。 配合 SubscribeJSON 自动恢复 trace_id 形成跨消息链路的完整追踪。 ctx 中无 trace_id 时退化为普通 Publish,行为向后兼容。

func (*Client) QueueSubscribe

func (c *Client) QueueSubscribe(subject, queue string, handler func(*nats.Msg)) (*nats.Subscription, error)

QueueSubscribe 订阅主题(队列模式),同一队列组内只有一个消费者收到消息。 适用于负载均衡场景:多个服务实例订阅同一主题,消息只投递给其中一个。

func (*Client) Reply

func (c *Client) Reply(subject string, handler func(msg *nats.Msg) []byte) (*nats.Subscription, error)

Reply 订阅主题并自动回复(用于实现 RPC 服务端)。 handler 的返回值会作为回复消息发送。

func (*Client) Request

func (c *Client) Request(ctx context.Context, subject string, data []byte, timeout time.Duration) (*nats.Msg, error)

Request 发送请求并等待回复。 使用 context 控制超时和取消。

func (*Client) Subscribe

func (c *Client) Subscribe(subject string, handler func(*nats.Msg)) (*nats.Subscription, error)

Subscribe 订阅主题,收到消息时调用 handler。 返回 Subscription,调用 Unsubscribe() 取消订阅。

type JetStream

type JetStream struct {
	// contains filtered or unexported fields
}

JetStream 是 NATS JetStream v2 API 客户端封装。 使用新的 jetstream 包,提供持久化消息、至少一次投递保证、流和消费者管理。

func (*JetStream) Consume

func (js *JetStream) Consume(ctx context.Context, stream, consumer string, handler jetstream.MessageHandler, opts ...jetstream.PullConsumeOpt) (jetstream.ConsumeContext, error)

Consume 消费消息(推模式,自动管理 ACK)。 返回 ConsumeContext,调用 Stop() 停止消费。

func (*JetStream) ConsumerInfo

func (js *JetStream) ConsumerInfo(ctx context.Context, stream, consumer string) (*jetstream.ConsumerInfo, error)

ConsumerInfo 获取消费者信息。

func (*JetStream) CreateOrUpdateConsumer

func (js *JetStream) CreateOrUpdateConsumer(ctx context.Context, stream string, cfg jetstream.ConsumerConfig) (jetstream.Consumer, error)

CreateOrUpdateConsumer 创建或更新消费者。

func (*JetStream) CreateStream

func (js *JetStream) CreateStream(ctx context.Context, name string, subjects ...string) error

CreateStream 创建流(如果不存在)。 仅在流确实不存在(ErrStreamNotFound)时创建; 瞬时错误原样返回,避免误判掩盖真实故障。

func (*JetStream) DeleteStream

func (js *JetStream) DeleteStream(ctx context.Context, name string) error

DeleteStream 删除流。

func (*JetStream) Fetch

func (js *JetStream) Fetch(ctx context.Context, stream, consumer string, batchSize int, opts ...jetstream.FetchOpt) (jetstream.MessageBatch, error)

Fetch 获取指定数量的消息(拉模式)。

func (*JetStream) Messages

func (js *JetStream) Messages(ctx context.Context, stream, consumer string) (jetstream.MessagesContext, error)

Messages 创建消息迭代器(拉模式,持续消费)。

func (*JetStream) Next

func (js *JetStream) Next(ctx context.Context, stream, consumer string, opts ...jetstream.FetchOpt) (jetstream.Msg, error)

Next 获取下一条消息(拉模式,阻塞直到超时)。

func (*JetStream) Publish

func (js *JetStream) Publish(ctx context.Context, subject string, data []byte, opts ...jetstream.PublishOpt) (*jetstream.PubAck, error)

Publish 发布消息到 JetStream 流。

func (*JetStream) PublishAsync

func (js *JetStream) PublishAsync(subject string, data []byte, opts ...jetstream.PublishOpt) (jetstream.PubAckFuture, error)

PublishAsync 异步发布消息(批量发布,提高吞吐量)。

func (*JetStream) PublishAsyncComplete

func (js *JetStream) PublishAsyncComplete() <-chan struct{}

PublishAsyncComplete 等待所有异步发布完成。

func (*JetStream) PublishJSON

func (js *JetStream) PublishJSON(ctx context.Context, subject string, v any, opts ...jetstream.PublishOpt) (*jetstream.PubAck, error)

PublishJSON 发布 JSON 消息到 JetStream 流。

func (*JetStream) Stream

func (js *JetStream) Stream(ctx context.Context, name string) (jetstream.Stream, error)

Stream 获取流。

func (*JetStream) StreamInfo

func (js *JetStream) StreamInfo(ctx context.Context, stream string) (*jetstream.StreamInfo, error)

StreamInfo 获取流信息。

type NatsOption

type NatsOption func(*options)

NatsOption 配置 Client 的可选参数。

func WithCloseHandler

func WithCloseHandler(fn func(conn *nats.Conn)) NatsOption

WithCloseHandler 设置连接关闭回调。

func WithDisconnectHandler

func WithDisconnectHandler(fn func(conn *nats.Conn, err error)) NatsOption

WithDisconnectHandler 设置断开连接回调。

func WithMaxReconnects

func WithMaxReconnects(n int) NatsOption

WithMaxReconnects 设置最大重连次数,-1 表示无限重连(默认)。

func WithName

func WithName(name string) NatsOption

WithName 设置客户端名称(用于 NATS 监控)。

func WithReconnectHandler

func WithReconnectHandler(fn func(conn *nats.Conn)) NatsOption

WithReconnectHandler 设置重连成功回调。

func WithReconnectWait

func WithReconnectWait(d time.Duration) NatsOption

WithReconnectWait 设置重连等待时间,默认 2 秒。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL