b7e9560bdc536c64db429a23b5a4cd91a0b7e475
Reviewed-on: #3
reconnect
一个通用的Go语言重连库,支持Redis、PostgreSQL和etcd的自动重连功能。
特性
- 🔄 自动重连机制
- ⚙️ 可配置的重连策略
- 🔍 连接健康检查
- 📊 连接状态监控
- 🎯 支持多种服务(Redis、PostgreSQL、etcd)
- 🛡️ 线程安全
安装
go get git.whblueocean.cn/blueocean-go/reconnect
快速开始
Redis重连
package main
import (
"context"
"time"
"github.com/go-redis/redis/v8"
"github.com/blueocean-go/reconnect"
)
func main() {
options := &redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
}
config := reconnect.DefaultConfig()
config.RetryInterval = 3 * time.Second
config.OnReconnect = func() {
fmt.Println("Redis重连成功!")
}
manager := reconnect.RedisManager(options, config)
ctx := context.Background()
if err := manager.Start(ctx); err != nil {
log.Fatal(err)
}
defer manager.Stop()
// 使用Redis客户端
redisClient := reconnect.NewRedisClient(options)
redisClient.Connect(ctx)
client := redisClient.GetClient()
// ... 使用client进行操作
}
PostgreSQL重连
package main
import (
"context"
"time"
"github.com/blueocean-go/reconnect"
)
func main() {
dsn := "host=localhost user=postgres password=postgres dbname=testdb sslmode=disable"
config := reconnect.DefaultConfig()
config.RetryInterval = 3 * time.Second
config.OnReconnect = func() {
fmt.Println("PostgreSQL重连成功!")
}
manager := reconnect.PostgresManager(
dsn,
25, // maxConnections
5, // maxIdleConnections
30*time.Minute, // maxConnectionAge
config,
)
ctx := context.Background()
if err := manager.Start(ctx); err != nil {
log.Fatal(err)
}
defer manager.Stop()
// 使用数据库连接
pgClient := reconnect.NewPostgresClient(dsn, 25, 5, 30*time.Minute)
pgClient.Connect(ctx)
db := pgClient.GetDB()
// ... 使用db进行操作
}
etcd重连
package main
import (
"context"
"time"
clientv3 "go.etcd.io/etcd/client/v3"
"github.com/blueocean-go/reconnect"
)
func main() {
etcdConfig := clientv3.Config{
Endpoints: []string{"localhost:2379"},
DialTimeout: 5 * time.Second,
}
config := reconnect.DefaultConfig()
config.RetryInterval = 3 * time.Second
config.OnReconnect = func() {
fmt.Println("etcd重连成功!")
}
manager := reconnect.EtcdManager(etcdConfig, config)
ctx := context.Background()
if err := manager.Start(ctx); err != nil {
log.Fatal(err)
}
defer manager.Stop()
// 使用etcd客户端
etcdClient := reconnect.NewEtcdClient(etcdConfig)
etcdClient.Connect(ctx)
client := etcdClient.GetClient()
// ... 使用client进行操作
}
配置选项
type Config struct {
// MaxRetries 最大重试次数,0表示无限重试
MaxRetries int
// RetryInterval 重试间隔
RetryInterval time.Duration
// Timeout 连接超时时间
Timeout time.Duration
// OnReconnect 重连成功后的回调函数
OnReconnect func()
// OnDisconnect 断开连接时的回调函数
OnDisconnect func(error)
}
API文档
Manager
重连管理器,负责监控连接状态并自动重连。
Start(ctx context.Context) error- 启动连接并开始监控Stop() error- 停止重连管理器IsConnected() bool- 返回当前连接状态WaitForError() error- 等待错误(用于阻塞等待)
RedisClient
Redis客户端包装器。
Connect(ctx context.Context) error- 建立连接Close() error- 关闭连接Ping(ctx context.Context) error- 健康检查IsConnected() bool- 检查连接状态GetClient() *redis.Client- 获取底层Redis客户端
PostgresClient
PostgreSQL客户端包装器。
Connect(ctx context.Context) error- 建立连接Close() error- 关闭连接Ping(ctx context.Context) error- 健康检查IsConnected() bool- 检查连接状态GetDB() *sql.DB- 获取底层数据库连接
EtcdClient
etcd客户端包装器。
Connect(ctx context.Context) error- 建立连接Close() error- 关闭连接Ping(ctx context.Context) error- 健康检查IsConnected() bool- 检查连接状态GetClient() *clientv3.Client- 获取底层etcd客户端
示例
更多示例代码请查看 examples/ 目录。
许可证
MIT License
Copyright (c) 2025 blueocean-go
Description
Languages
Go
100%