diff --git a/examples/etcd_example.go b/examples/etcd_example.go new file mode 100644 index 0000000..1274244 --- /dev/null +++ b/examples/etcd_example.go @@ -0,0 +1,73 @@ +package main + +import ( + "context" + "fmt" + "log" + "time" + + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/blueocean-go/reconnect" +) + +func main() { + // etcd配置 + etcdConfig := clientv3.Config{ + Endpoints: []string{"localhost:2379"}, + DialTimeout: 5 * time.Second, + } + + // 创建重连配置 + config := reconnect.DefaultConfig() + config.RetryInterval = 3 * time.Second + config.MaxRetries = 0 // 无限重试 + config.OnReconnect = func() { + fmt.Println("etcd重连成功!") + } + config.OnDisconnect = func(err error) { + fmt.Printf("etcd连接断开: %v\n", err) + } + + // 创建重连管理器 + manager := reconnect.EtcdManager(etcdConfig, config) + + // 启动连接 + ctx := context.Background() + if err := manager.Start(ctx); err != nil { + log.Fatalf("启动失败: %v", err) + } + defer manager.Stop() + + // 获取etcd客户端并使用 + etcdClient := reconnect.NewEtcdClient(etcdConfig) + if err := etcdClient.Connect(ctx); err != nil { + log.Fatalf("连接失败: %v", err) + } + + client := etcdClient.GetClient() + if client == nil { + log.Fatal("客户端为空") + } + + // 使用etcd客户端 + kv := clientv3.NewKV(client) + _, err := kv.Put(ctx, "key", "value") + if err != nil { + log.Printf("设置键值失败: %v", err) + } else { + fmt.Println("设置键值成功") + } + + resp, err := kv.Get(ctx, "key") + if err != nil { + log.Printf("获取键值失败: %v", err) + } else { + if len(resp.Kvs) > 0 { + fmt.Printf("获取键值: %s = %s\n", resp.Kvs[0].Key, resp.Kvs[0].Value) + } + } + + // 保持运行 + select {} +} + diff --git a/examples/postgres_example.go b/examples/postgres_example.go new file mode 100644 index 0000000..e380979 --- /dev/null +++ b/examples/postgres_example.go @@ -0,0 +1,65 @@ +package main + +import ( + "context" + "fmt" + "log" + "time" + + "github.com/blueocean-go/reconnect" +) + +func main() { + // PostgreSQL连接字符串 + dsn := "host=localhost user=postgres password=postgres dbname=testdb sslmode=disable" + + // 创建重连配置 + config := reconnect.DefaultConfig() + config.RetryInterval = 3 * time.Second + config.MaxRetries = 0 // 无限重试 + config.OnReconnect = func() { + fmt.Println("PostgreSQL重连成功!") + } + config.OnDisconnect = func(err error) { + fmt.Printf("PostgreSQL连接断开: %v\n", err) + } + + // 创建重连管理器 + manager := reconnect.PostgresManager( + dsn, + 25, // maxConnections + 5, // maxIdleConnections + 30*time.Minute, // maxConnectionAge + config, + ) + + // 启动连接 + ctx := context.Background() + if err := manager.Start(ctx); err != nil { + log.Fatalf("启动失败: %v", err) + } + defer manager.Stop() + + // 获取数据库连接并使用 + pgClient := reconnect.NewPostgresClient(dsn, 25, 5, 30*time.Minute) + if err := pgClient.Connect(ctx); err != nil { + log.Fatalf("连接失败: %v", err) + } + + db := pgClient.GetDB() + if db == nil { + log.Fatal("数据库连接为空") + } + + // 使用数据库连接 + var version string + err := db.QueryRow("SELECT version()").Scan(&version) + if err != nil { + log.Printf("查询失败: %v", err) + } else { + fmt.Printf("PostgreSQL版本: %s\n", version) + } + + // 保持运行 + select {} +} diff --git a/examples/redis_example.go b/examples/redis_example.go new file mode 100644 index 0000000..a364714 --- /dev/null +++ b/examples/redis_example.go @@ -0,0 +1,70 @@ +package main + +import ( + "context" + "fmt" + "log" + "time" + + "github.com/blueocean-go/reconnect" + "github.com/redis/go-redis/v9" +) + +func main() { + // 创建Redis选项 + options := &redis.Options{ + Addr: "localhost:6379", + Password: "", // 无密码 + DB: 0, + } + + // 创建重连配置 + config := reconnect.DefaultConfig() + config.RetryInterval = 3 * time.Second + config.MaxRetries = 0 // 无限重试 + config.OnReconnect = func() { + fmt.Println("Redis重连成功!") + } + config.OnDisconnect = func(err error) { + fmt.Printf("Redis连接断开: %v\n", err) + } + + // 创建重连管理器 + manager := reconnect.RedisManager(options, config) + + // 启动连接 + ctx := context.Background() + if err := manager.Start(ctx); err != nil { + log.Fatalf("启动失败: %v", err) + } + defer manager.Stop() + + // 获取Redis客户端并使用 + redisClient := reconnect.NewRedisClient(options) + if err := redisClient.Connect(ctx); err != nil { + log.Fatalf("连接失败: %v", err) + } + + client := redisClient.GetClient() + if client == nil { + log.Fatal("客户端为空") + } + + // 使用Redis客户端 + err := client.Set(ctx, "key", "value", 0).Err() + if err != nil { + log.Printf("设置键值失败: %v", err) + } else { + fmt.Println("设置键值成功") + } + + val, err := client.Get(ctx, "key").Result() + if err != nil { + log.Printf("获取键值失败: %v", err) + } else { + fmt.Printf("获取键值: %s\n", val) + } + + // 保持运行 + select {} +}