reconnect-mym #1
73
examples/etcd_example.go
Normal file
73
examples/etcd_example.go
Normal file
@@ -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 {}
|
||||||
|
}
|
||||||
|
|
||||||
65
examples/postgres_example.go
Normal file
65
examples/postgres_example.go
Normal file
@@ -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 {}
|
||||||
|
}
|
||||||
70
examples/redis_example.go
Normal file
70
examples/redis_example.go
Normal file
@@ -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 {}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user