客户端
1、客户端统一超时控制
这个所有的本次连接都是一样的时间,但是有些服务就是快有些就是慢,这个控制很不精准
client, err := math.NewClient(
"dqq.math",
client.WithResolver(resolver),
// client.WithHostPorts("127.0.0.1:5678"),
client.WithMiddleware(TimerMW),
client.WithConnectTimeout(100*time.Millisecond), // 连接超时
client.WithRPCTimeout(200*time.Millisecond), // RPC超时
)
if err != nil {
klog.Fatalf("create rpc client fail: %s", err.Error())
}
2、客户端请求时控制超时
resquest := math_service.SubRequest{Left: 8, Right: 5}
response, err := client.Sub(context.Background(), &resquest,
callopt.WithConnectTimeout(100*time.Millisecond), // 连接超时
callopt.WithRPCTimeout(200*time.Millisecond), // RPC连接超时
)
if err != nil {
klog.Error(err)
} else {
klog.Info(response.Diff)
}
预热
在 Kitex 这类高性能 RPC 框架中,预热(Warming Up) 是指在客户端正式接收业务流量前,提前完成部分初始化操作,避免第一次请求时因耗时操作导致超时或性能抖动。
预热的核心目的
- 避免冷启动耗时:第一次请求需要做服务发现、建立连接、序列化器初始化等操作,耗时会明显高于后续请求,预热可以把这些耗时操作提前完成。
- 提升首次请求成功率:在服务刚上线或客户端刚启动时,提前建立连接、验证服务可用性,避免第一次请求就失败。
client.WithWarmingUp(&warmup.ClientOption{
ResolverOption: &warmup.ResolverOption{
Dests: []*rpcinfo.EndpointBasicInfo{
{
ServiceName: "dqq.math",
},
},
},
}),
这段代码里的预热做了什么?
这段 WithWarmingUp 配置,是 Kitex 提供的客户端预热功能,具体做了两件事:
- 服务发现预热:提前向注册中心拉取 dqq.math 服务的实例列表,缓存到本地,避免第一次请求时才去解析地址。
- 连接预热(可选):根据配置,提前和服务端建立长连接,避免第一次请求时才完成 TCP 三次握手、TLS 握手等连接过程。