一些example
This commit is contained in:
@@ -0,0 +1,149 @@
|
||||
package example
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/yuninks/curlx"
|
||||
)
|
||||
|
||||
func TestConnectionReuse(t *testing.T) {
|
||||
// 创建带优化连接池配置的客户端
|
||||
client := curlx.NewCurlx(
|
||||
curlx.WithMaxIdleConns(50),
|
||||
curlx.WithMaxIdleConnsPerHost(10),
|
||||
curlx.WithMaxConnsPerHost(20),
|
||||
curlx.WithIdleConnTimeout(60*time.Second),
|
||||
curlx.WithOptionTimeOut(30*time.Second),
|
||||
)
|
||||
|
||||
// 测试同一个主机的多次请求,观察连接复用效果
|
||||
targetURL := "https://httpbin.org/get"
|
||||
|
||||
fmt.Println("=== 连接复用测试开始 ===")
|
||||
|
||||
// 预热连接
|
||||
fmt.Println("1. 预热连接...")
|
||||
ctx1, cancel1 := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
_, err := client.Get(ctx1, targetURL)
|
||||
cancel1()
|
||||
if err != nil {
|
||||
t.Logf("预热请求失败: %v", err)
|
||||
return
|
||||
}
|
||||
fmt.Println(" 预热完成")
|
||||
|
||||
// 连续请求测试
|
||||
fmt.Println("\n2. 连续请求测试...")
|
||||
for i := 1; i <= 5; i++ {
|
||||
start := time.Now()
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
|
||||
response, err := client.Get(ctx, targetURL)
|
||||
duration := time.Since(start)
|
||||
|
||||
cancel()
|
||||
|
||||
if err != nil {
|
||||
t.Logf("第%d次请求失败: %v (耗时: %v)", i, err, duration)
|
||||
} else {
|
||||
t.Logf("第%d次请求成功: %d字节 (耗时: %v)", i, len(response), duration)
|
||||
}
|
||||
|
||||
time.Sleep(200 * time.Millisecond) // 短暂间隔
|
||||
}
|
||||
|
||||
fmt.Println("\n=== 测试完成 ===")
|
||||
}
|
||||
|
||||
func TestConcurrentConnectionReuse(t *testing.T) {
|
||||
// 创建连接池管理器
|
||||
poolManager := NewConnectionPoolManager(
|
||||
curlx.WithMaxIdleConns(100),
|
||||
curlx.WithMaxIdleConnsPerHost(20),
|
||||
curlx.WithMaxConnsPerHost(30),
|
||||
curlx.WithIdleConnTimeout(120*time.Second),
|
||||
)
|
||||
|
||||
// 测试并发请求
|
||||
urls := []string{
|
||||
"https://httpbin.org/get",
|
||||
"https://httpbin.org/uuid",
|
||||
"https://httpbin.org/user-agent",
|
||||
"https://httpbin.org/headers",
|
||||
"https://httpbin.org/ip",
|
||||
}
|
||||
|
||||
fmt.Println("=== 并发连接复用测试 ===")
|
||||
poolManager.ConcurrentRequests(urls)
|
||||
}
|
||||
|
||||
func TestPersistentConnection(t *testing.T) {
|
||||
// 创建优化的客户端
|
||||
client := curlx.NewCurlx(
|
||||
curlx.WithMaxIdleConns(30),
|
||||
curlx.WithMaxIdleConnsPerHost(5),
|
||||
curlx.WithMaxConnsPerHost(15),
|
||||
curlx.WithIdleConnTimeout(30*time.Second),
|
||||
)
|
||||
|
||||
manager := &ConnectionPoolManager{
|
||||
client: client,
|
||||
// transport: client.transport,
|
||||
}
|
||||
|
||||
fmt.Println("=== 持久连接测试 ===")
|
||||
manager.PersistentConnectionExample("https://httpbin.org/delay/1")
|
||||
}
|
||||
|
||||
func Example_connectionReuse() {
|
||||
// 最佳实践示例:如何正确配置连接复用
|
||||
|
||||
// 1. 创建优化配置的客户端
|
||||
client := curlx.NewCurlx(
|
||||
// 连接池配置
|
||||
curlx.WithMaxIdleConns(100), // 总空闲连接数
|
||||
curlx.WithMaxIdleConnsPerHost(10), // 每主机空闲连接数
|
||||
curlx.WithMaxConnsPerHost(50), // 每主机最大连接数
|
||||
curlx.WithIdleConnTimeout(90*time.Second), // 空闲超时时间
|
||||
|
||||
// 其他优化配置
|
||||
curlx.WithOptionTimeOut(30*time.Second),
|
||||
)
|
||||
|
||||
// 2. 复用同一个客户端实例进行多次请求
|
||||
ctx := context.Background()
|
||||
|
||||
// 第一次请求会建立新连接
|
||||
response1, err := client.Get(ctx, "https://httpbin.org/get")
|
||||
if err != nil {
|
||||
fmt.Printf("首次请求失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
fmt.Printf("首次请求成功: %d字节\n", len(response1))
|
||||
|
||||
// 后续请求会复用已有连接
|
||||
response2, err := client.Get(ctx, "https://httpbin.org/uuid")
|
||||
if err != nil {
|
||||
fmt.Printf("第二次请求失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
fmt.Printf("第二次请求成功: %d字节\n", len(response2))
|
||||
|
||||
// 3. 查看连接池状态
|
||||
manager := &ConnectionPoolManager{
|
||||
client: client,
|
||||
// transport: client.transport,
|
||||
}
|
||||
manager.PrintPoolStats()
|
||||
|
||||
// Output:
|
||||
// 首次请求成功: [字节数]
|
||||
// 第二次请求成功: [字节数]
|
||||
// === 连接池统计 ===
|
||||
// 当前空闲连接数: 1
|
||||
// 总连接数: 1
|
||||
// 等待队列长度: 0
|
||||
}
|
||||
Reference in New Issue
Block a user