//go:build client package main import ( "fmt" "log" "sync" "time" "github.com/noahlann/nnet/pkg/nnet" ) func main() { // 创建连接池配置 poolConfig := &nnet.ClientPoolConfig{ MaxSize: 10, // 最大连接数 MinSize: 2, // 最小连接数(预创建) ClientConfig: &nnet.ClientConfig{ Addr: "tcp://127.0.0.1:8888", ConnectTimeout: 5 * time.Second, ReadTimeout: 5 * time.Second, WriteTimeout: 5 * time.Second, }, AcquireTimeout: 5 * time.Second, // 获取连接超时时间 IdleTimeout: 5 * time.Minute, // 空闲连接超时时间 } // 创建连接池 pool, err := nnet.NewClientPool(poolConfig) if err != nil { log.Fatalf("Failed to create connection pool: %v", err) } defer pool.Close() log.Printf("Connection pool created: Size=%d, Available=%d", pool.Size(), pool.Available()) // 等待连接建立 time.Sleep(500 * time.Millisecond) log.Printf("Connection pool ready: Size=%d, Available=%d", pool.Size(), pool.Available()) // 示例1:单个请求 fmt.Println("\n=== 示例1:单个请求 ===") client, err := pool.Acquire() if err != nil { log.Fatalf("Failed to acquire connection: %v", err) } // 发送请求 request := []byte("echo hello\n") resp, err := client.Request(request, 5*time.Second) if err != nil { log.Printf("Request failed: %v", err) } else { fmt.Printf("Response: %s", string(resp)) } // 释放连接 pool.Release(client) // 示例2:并发请求(使用连接池) fmt.Println("\n=== 示例2:并发请求 ===") const numRequests = 20 var wg sync.WaitGroup wg.Add(numRequests) for i := 0; i < numRequests; i++ { go func(id int) { defer wg.Done() // 从连接池获取连接 client, err := pool.Acquire() if err != nil { log.Printf("Goroutine %d: Failed to acquire connection: %v", id, err) return } // 使用完毕后释放连接 defer pool.Release(client) // 发送请求 request := []byte(fmt.Sprintf("echo request-%d\n", id)) resp, err := client.Request(request, 5*time.Second) if err != nil { log.Printf("Goroutine %d: Request failed: %v", id, err) return } fmt.Printf("Goroutine %d: Response: %s", id, string(resp)) }(i) } wg.Wait() // 示例3:获取时间 fmt.Println("\n=== 示例3:获取时间 ===") client, err = pool.Acquire() if err != nil { log.Fatalf("Failed to acquire connection: %v", err) } defer pool.Release(client) request = []byte("time\n") resp, err = client.Request(request, 5*time.Second) if err != nil { log.Printf("Request failed: %v", err) } else { fmt.Printf("Response: %s", string(resp)) } // 显示连接池状态 fmt.Printf("\n=== 连接池状态 ===\n") fmt.Printf("Size: %d\n", pool.Size()) fmt.Printf("Available: %d\n", pool.Available()) fmt.Printf("IsClosed: %v\n", pool.IsClosed()) }