notify

package
v0.0.15 Latest Latest
Warning

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

Go to latest
Published: Mar 12, 2026 License: MIT Imports: 4 Imported by: 0

README

Notify 通用通知组件

notify 是一个设计为抽象、低耦合、通用、高扩展且支持配置化的可热拔插通知组件。它允许通过简单的配置管理多种通知渠道(如 Console, Bark, Kook 等),并提供统一的接口进行消息发送。

核心设计

该组件采用了类似 database/sql 的驱动注册模式,实现了核心逻辑与具体实现的解耦:

  1. 抽象接口 (interface.go): 定义了 NotifierDriver 接口,以及通用的 Message 结构体。业务层仅依赖这些接口,而不依赖具体的发送逻辑。
  2. 插件机制 (register.go): 提供了驱动注册机制。新的通知渠道(如 Slack, Email)只需实现 Driver 接口并在 init() 中调用 Register 即可被加载。
  3. 配置化管理 (config.go): 定义了 ConfigNotifierConfig 结构,支持通过配置文件定义多个通知实例。例如,可以同时配置两个不同的 Kook 机器人,分别用于不同的业务场景。
  4. 生命周期管理 (manager.go): Manager 负责加载配置、实例化驱动、管理通知实例的生命周期,并提供了 Send(单发)和 Broadcast(广播)方法。

目录结构

core/components/notify/
├── config.go           # 配置结构定义
├── drivers/            # 具体通知渠道实现
│   ├── bark/           # Bark 推送驱动
│   ├── console/        # [示例] 控制台输出驱动
│   └── kook/           # Kook 机器人驱动
├── interface.go        # 核心接口定义 (Notifier, Driver, Message)
├── manager.go          # 管理器实现 (加载配置, 路由消息)
├── register.go         # 驱动注册中心
└── notify_test.go      # 测试用例

快速开始

1. 引入依赖

在你的代码中引入 notify 包以及你需要使用的驱动包(使用 _ 导入以触发注册):

import (
    "backend/core/components/notify"
    _ "backend/core/components/notify/drivers/bark"    // 注册 Bark 驱动
    _ "backend/core/components/notify/drivers/console" // 注册 Console 驱动
    _ "backend/core/components/notify/drivers/kook"    // 注册 Kook 驱动
)
2. 定义配置

配置通常来源于你的配置文件(如 YAML, JSON)。这里以 Go 结构体为例:

cfg := &notify.Config{
    Notifiers: []notify.NotifierConfig{
        {
            Name:   "debug-console",
            Driver: "console",
            Config: map[string]interface{}{},
        },
        {
            Name:   "my-iphone",
            Driver: "bark",
            Config: map[string]interface{}{
                "deviceIds":       []string{"YOUR_DEVICE_KEY"},
                "onlyMsgPath":     "https://api.day.app/push/{{deviceId}}/{{content}}",
                "titleAndMsgPath": "https://api.day.app/push/{{deviceId}}/{{title}}/{{content}}",
            },
        },
        {
            Name:   "ops-group",
            Driver: "kook",
            Config: map[string]interface{}{
                "token": "YOUR_BOT_TOKEN",
                "groupChannel": map[string]string{
                    "default": "CHANNEL_ID_DEFAULT",
                    "alarm":   "CHANNEL_ID_ALARM",
                },
            },
        },
    },
}
3. 初始化与发送
// 初始化管理器
mgr := notify.NewManager()
err := mgr.LoadFromConfig(cfg)
if err != nil {
    panic(err)
}

// 构造消息
msg := &notify.Message{
    Subject: "系统告警",
    Content: "检测到 CPU 使用率过高",
    Extra: map[string]interface{}{
        "level": "Error", // 影响 Bark 图标或 Kook 卡片颜色
        "group": "alarm", // 影响 Kook 发送的频道
    },
}

// 发送给特定实例
mgr.Send(ctx, "my-iphone", msg)

// 广播给所有实例
mgr.Broadcast(ctx, msg)

支持的驱动

Console (console)

将通知内容直接输出到标准输出(Stdout),主要用于开发调试。

Bark (bark)

向 iOS 设备发送 Bark 推送。

  • 配置参数:
    • deviceIds: 设备 Key 列表。
    • onlyMsgPath: 仅发送内容时的 API 路径模板。
    • titleAndMsgPath: 发送标题和内容时的 API 路径模板。
    • iconUrlPath: 消息级别到图标 URL 的映射(可选)。
  • Extra 参数:
    • level: 消息级别,用于匹配图标。
Kook (kook)

向 Kook(原开黑啦)频道发送富文本卡片消息。

  • 配置参数:
    • token: 机器人 Token。
    • groupChannel: 分组名称到频道 ID 的映射。
  • Extra 参数:
    • level: 消息级别(Error/Recovery/Info),决定卡片的主题颜色(Danger/Success/Warning)。
    • group: 分组名称,用于路由到不同的频道。

如何开发新驱动

只需在 drivers/ 下新建目录(如 slack),实现 DriverNotifier 接口,并在 init 中注册:

package slack

import "backend/core/components/notify"

func init() {
    notify.Register("slack", &Driver{})
}

type Driver struct{}

func (d *Driver) Open(config map[string]interface{}) (notify.Notifier, error) {
    // 解析配置并返回 Notifier 实例
    return &Notifier{}, nil
}

type Notifier struct{}

func (n *Notifier) Send(ctx context.Context, msg *notify.Message) error {
    // 实现发送逻辑
    return nil
}

func (n *Notifier) Close() error {
    return nil
}

Documentation

Overview

Package notify 提供了一个通用的、可扩展的通知组件。

它定义了统一的 Notifier 和 Driver 接口,支持通过插件机制注册不同的通知驱动(如 Console, Bark, Kook 等)。 该组件支持配置化管理,允许在运行时通过配置文件加载和管理多个通知实例。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Drivers

func Drivers() []notify.NotifySenderType

Drivers 返回已注册驱动名称的排序列表。

func Register

func Register(name notify.NotifySenderType, driver Driver)

Register 使通知驱动通过提供的名称可用。 如果使用相同的名称调用两次 Register,或者驱动为 nil,它将引发 panic。

Types

type Config

type Config struct {
	Notifiers []NotifierConfig `json:"notifiers" yaml:"notifiers"`
}

Config 保存通知系统的配置

type Driver

type Driver interface {
	// Open 创建一个新的 Notifier 实例,配置将由实现自行从 Apollo 获取
	Open() (Notifier, error)
}

Driver 是通知器驱动的接口

type Manager

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

Manager 管理多个通知器实例,提供统一的消息发送和广播接口。 它负责加载配置、实例化驱动以及管理通知器的生命周期。

func NewManager

func NewManager() *Manager

NewManager 创建一个新的 Manager

func (*Manager) Broadcast

func (m *Manager) Broadcast(ctx context.Context, opts ...Option) map[notify.NotifySenderType]error

Broadcast 向所有注册的通知器发送消息 它返回一个以通知器名称为键的错误映射,如果全部成功则返回 nil

func (*Manager) Close

func (m *Manager) Close() error

Close 关闭所有管理的通知器

func (*Manager) Get

Get 通过名称获取通知器实例

func (*Manager) InitDrivers

func (m *Manager) InitDrivers() error

InitDrivers 初始化所有已注册的驱动

func (*Manager) Register

func (m *Manager) Register(name notify.NotifySenderType, n Notifier)

Register 注册一个新的通知器实例

func (*Manager) Send

func (m *Manager) Send(ctx context.Context, name notify.NotifySenderType, opts ...Option) error

Send 使用指定的通知器发送消息

func (*Manager) Unregister

func (m *Manager) Unregister(name notify.NotifySenderType)

Unregister 注销一个通知器实例

func (*Manager) WithNotifier

func (m *Manager) WithNotifier(senderType notify.NotifySenderType) NotifierWrapper

type Message

type Message struct {
	Subject     string                 `json:"subject"`
	Content     string                 `json:"content"`
	Attachments []string               `json:"attachments"`
	Extra       map[string]interface{} `json:"extra"`
}

Message 定义了通知消息的结构

type Notifier

type Notifier interface {
	// Send 发送通知
	Send(ctx context.Context, msg *Message) error
	// Close 关闭通知器并释放资源
	Close() error
}

Notifier 是通知驱动必须实现的接口

func Open

func Open(driverName notify.NotifySenderType) (Notifier, error)

Open 根据指定的驱动名称打开一个通知器。

type NotifierConfig

type NotifierConfig struct {
	Name   string                  `json:"name" yaml:"name"`     // 此实例的唯一名称
	Driver notify.NotifySenderType `json:"driver" yaml:"driver"` // 驱动名称 (例如 "email", "slack")
	Config map[string]interface{}  `json:"config" yaml:"config"` // 驱动特定配置
}

NotifierConfig 保存单个通知器实例的配置

type NotifierWrapper

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

func NewNotifierWrapper

func NewNotifierWrapper(notifier Notifier) NotifierWrapper

func (NotifierWrapper) Close

func (n NotifierWrapper) Close() error

func (NotifierWrapper) Send

func (n NotifierWrapper) Send(ctx context.Context, opts ...Option) error

type Option

type Option interface {
	// contains filtered or unexported methods
}

Option 定义了消息配置选项接口

func WithAttachments

func WithAttachments(attachments []string) Option

WithAttachments 设置消息附件

func WithContent

func WithContent(content string) Option

WithContent 设置消息内容

func WithExtra

func WithExtra(key string, value interface{}) Option

WithExtra 设置额外信息

func WithExtras

func WithExtras(extras map[string]interface{}) Option

WithExtras 批量设置额外信息

func WithSubject

func WithSubject(subject string) Option

WithSubject 设置消息主题

type OptionFunc

type OptionFunc func(*Message)

OptionFunc 是 Option 接口的函数实现

Directories

Path Synopsis
drivers

Jump to

Keyboard shortcuts

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