botgo

package module
v0.2.0 Latest Latest
Warning

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

Go to latest
Published: Jun 14, 2022 License: Apache-2.0 Imports: 9 Imported by: 16

README

BotGo

QQ频道机器人,官方 GOLANG SDK。

Build Go Reference Examples

一、如何使用

1.请求 openapi 接口,操作资源
func main() {
    token := token.BotToken(conf.AppID, conf.Token)
    api := botgo.NewOpenAPI(token).WithTimeout(3 * time.Second)
    ctx := context.Background()

    ws, err := api.WS(ctx, nil, "")
    log.Printf("%+v, err:%v", ws, err)
    
    me, err := api.Me(ctx, nil, "")
    log.Printf("%+v, err:%v", me, err)
}
2.使用默认 SessionManager 启动 websocket 连接,接收事件
func main() {
    token := token.BotToken(conf.AppID, conf.Token)
    api := botgo.NewOpenAPI(token).WithTimeout(3 * time.Second)
    ctx := context.Background()
    ws, err := api.WS(ctx, nil, "")
    if err != nil {
        log.Printf("%+v, err:%v", ws, err)
    }

    // 监听哪类事件就需要实现哪类的 handler,定义:websocket/event_handler.go
    var atMessage websocket.ATMessageEventHandler = func(event *dto.WSPayload, data *dto.WSATMessageData) error {
        fmt.Println(event, data)
        return nil
    }
    intent := websocket.RegisterHandlers(atMessage)
    // 启动 session manager 进行 ws 连接的管理,如果接口返回需要启动多个 shard 的连接,这里也会自动启动多个
    botgo.NewSessionManager().Start(ws, token, &intent)
}

二、什么是 SessionManager

SessionManager,用于管理 websocket 连接的启动,重连等。接口定义在:session_manager.go。开发者也可以自己实现自己的 SessionManager。

sdk 中实现了两个 SessionManager

  • local 用于在单机上启动多个 shard 的连接。下文用 local 代表
  • remote 基于 redis 的 list 数据结构,实现分布式的 shard 管理,可以在多个节点上启动多个服务进程。下文用 remote 代表

另外,也有其他同事基于 etcd 实现了 shard 集群的管理,在 botgo-plugns 中。

三、生产环境中的一些建议

得益于 websocket 的机制,我们可以在本地就启动一个机器人,实现相关逻辑,但是在生产环境中需要考虑扩容,容灾等情况,所以建 议从以下几方面考虑生产环境的部署:

1.公域机器人,优先使用分布式 shard 管理

使用上面提到的分布式的 session manager 或者自己实现一个分布式的 session manager

2.提前规划好分片

分布式 SessionManager 需要解决的最大的问题,就是如何解决 shard 随时增加的问题,类似 kafka 的 rebalance 问题一样, 由于 shard 是基于频道 id 来进行 hash 的,所以在扩容的时候所有的数据都会被重新 hash。

提前规划好较多的分片,如 20 个分片,有助于在未来机器人接入的频道过多的时候,能够更加平滑的进行实例的扩容。比如如果使用的 是 remote,初始化时候分 20 个分片,但是只启动 2 个进程,那么这2个进程将争抢 20 个分片的消费权,进行消费,当启动更多 的实例之后,伴随着 websocket 要求一定时间进行一次重连,启动的新实例将会平滑的分担分片的数据处理。

3.接入和逻辑分离

接入是指从机器人平台收到事件的服务。逻辑是指处理相关事件的服务。

接入与逻辑分离,有助于提升机器人的事件处理效率和可靠性。一般实现方式类似于以下方案:

  • 接入层:负责维护与平台的 websocket 连接,并接收相关事件,生产到 kafka 等消息中间件中。 如果使用 local 那么可能还涉及到分布式锁的问题。可以使用sdk 中的 sessions/remote/lock 快速基于 redis 实现分布式锁。

  • 逻辑层:从 kafka 消费到事件,并进行对应的处理,或者调用机器人的 openapi 进行相关数据的操作。

提前规划好 kafka 的分片,然后从容的针对逻辑层做水平扩容。或者使用 pulsar(腾讯云上叫 tdmq) 来替代 kafka 避免 rebalance 问题。

四、SDK 开发说明

请查看:开发说明

五、加入官方社区

欢迎扫码加入 QQ 频道开发者社区

开发者社区

Documentation

Overview

Package botgo 是一个QQ频道机器人 sdk 的 golang 实现

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewOpenAPI

func NewOpenAPI(token *token.Token) openapi.OpenAPI

NewOpenAPI 创建新的 openapi 实例,会返回当前的 openapi 实现的实例 如果需要使用其他版本的实现,需要在调用这个方法之前调用 SelectOpenAPIVersion 方法

func NewSandboxOpenAPI

func NewSandboxOpenAPI(token *token.Token) openapi.OpenAPI

NewSandboxOpenAPI 创建测试环境的 openapi 实例

func SelectOpenAPIVersion

func SelectOpenAPIVersion(version openapi.APIVersion) error

SelectOpenAPIVersion 指定使用哪个版本的 api 实现,如果不指定,sdk将默认使用第一个 setup 的 api 实现

func SetLogger

func SetLogger(logger log.Logger)

SetLogger 设置 logger,需要实现 sdk 的 log.Logger 接口

func SetOpenAPIClient

func SetOpenAPIClient(v openapi.APIVersion, c openapi.OpenAPI)

SetOpenAPIClient 注册 openapi 的不同实现,需要设置版本

func SetSessionManager

func SetSessionManager(m SessionManager)

SetSessionManager 注册自己实现的 session manager

func SetWebsocketClient

func SetWebsocketClient(c websocket.WebSocket)

SetWebsocketClient 替换 websocket 实现

Types

type SessionManager

type SessionManager interface {
	// Start 启动连接,默认使用 apInfo 中的 shards 作为 shard 数量,如果有需要自己指定 shard 数,请修 apInfo 中的信息
	Start(apInfo *dto.WebsocketAP, token *token.Token, intents *dto.Intent) error
}

SessionManager 接口,管理session

func NewSessionManager

func NewSessionManager() SessionManager

NewSessionManager 获得 session manager 实例

Directories

Path Synopsis
dto
Package dto 维护了用于与机器人接口通信的数据结构对象。
Package dto 维护了用于与机器人接口通信的数据结构对象。
message
Package message 内提供了用于支撑处理消息对象的工具和方法。
Package message 内提供了用于支撑处理消息对象的工具和方法。
Package errs 是 SDK 里面的错误类型的集合,同时封装了 SDK 专用的错误类型。
Package errs 是 SDK 里面的错误类型的集合,同时封装了 SDK 专用的错误类型。
examples module
interaction
signature
Package signature 用于处理平台和机器人开发者之间的互动请求中的签名验证
Package signature 用于处理平台和机器人开发者之间的互动请求中的签名验证
Package log 是 SDK 的 logger 接口定义与内置的 logger。
Package log 是 SDK 的 logger 接口定义与内置的 logger。
Package openapi 声明了 sdk 所使用的 openapi 接口。
Package openapi 声明了 sdk 所使用的 openapi 接口。
v1
Package v1 是 openapi v1 版本的实现。
Package v1 是 openapi v1 版本的实现。
Package sessions 提供了用于处理 websocket 的多实例会话的相关功能。
Package sessions 提供了用于处理 websocket 的多实例会话的相关功能。
local
Package local 基于 golang chan 实现的单机 manager。
Package local 基于 golang chan 实现的单机 manager。
manager
Package manager 实现 session manager 所需要的公共方法。
Package manager 实现 session manager 所需要的公共方法。
remote
Package remote 基于 redis list 实现的分布式 session manager。
Package remote 基于 redis list 实现的分布式 session manager。
remote/lock
Package lock 一个基于 redis 的分布式锁实现。
Package lock 一个基于 redis 的分布式锁实现。
Package token 用于调用 openapi,websocket 的 token 对象。
Package token 用于调用 openapi,websocket 的 token 对象。
Package version sdk 版本声明。
Package version sdk 版本声明。
Package websocket SDK 需要实现的 websocket 定义。
Package websocket SDK 需要实现的 websocket 定义。
client
Package client 默认的 websocket client 实现。
Package client 默认的 websocket client 实现。

Jump to

Keyboard shortcuts

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