From c70c2e9f1c802f0b3c78ee60fb6086bb3c0b690a Mon Sep 17 00:00:00 2001 From: mayiming <1627832236@qq.com> Date: Fri, 12 Dec 2025 15:48:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 216 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) diff --git a/README.md b/README.md index dccb4e8..e803fe5 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,218 @@ # reconnect +一个通用的Go语言重连库,支持Redis、PostgreSQL和etcd的自动重连功能。 + +## 特性 + +- 🔄 自动重连机制 +- ⚙️ 可配置的重连策略 +- 🔍 连接健康检查 +- 📊 连接状态监控 +- 🎯 支持多种服务(Redis、PostgreSQL、etcd) +- 🛡️ 线程安全 + +## 安装 + +```bash +go get github.com/blueocean-go/reconnect +``` + +## 快速开始 + +### Redis重连 + +```go +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重连 + +```go +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重连 + +```go +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进行操作 +} +``` + +## 配置选项 + +```go +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