如果无法满足你的需求,请在 Kitex Github 项目仓库提交 Issue,社区维护者会及时跟进处理。
Q1: 支持 Windows 吗?
Q2: 是否支持 HTTP?
Q3: 如何配置开启连接多路复用?
Q4: 本地直连场景下,配置长连接池为什么没有生效?
Q5: Kitex Protobuf 和 gRPC 协议区别
Q6: 出现 Thrift 接口编译问题,如 not enough arguments in call to iprot.ReadStructBegin
go mod edit -replace github.com/apache/thrift=github.com/apache/thrift@v0.13.0
Q1: 安装代码生成工具,出现了 ’not enough arguments’ 问题
Q2: 为什么 IDL 里的 set 生成了 slice?
Q3: 为什么有些字段名字后面多了条下划线?
Q4: 新增接口重新生成代码,是否会覆盖handler.go
Q5: 请问目前代码生成工具中的模板是否支持用户自定义?
Q6: 代码生成工具中的 –type 是否可以通过 IDL 文件扩展名自动确定?
从 CPU profile 看,errors.Is
或 errors.As
出现热点问题,甚至 CPU 打满
原因:自定义 error 里实现了 Unwrap 方法,但该方法实现错误,返回了 error 对象自己,导致死循环,如下
func (e *XError) Unwrap() error {
if e == nil {
return nil
}
return e.InnerError // 实际上返回了自己
}
func (e *XError) NewXError(outMsg *XError) *XError {
err := &XError{
OutCode: outMsg.OutCode,
OutMsg: outMsg.OutMsg,
InnerError: innerErr(outMsg.Msg),
}
err.InnerError = err // 此处指向自己
return err
}
解决:Unwrap 返回被封装的 error,否则应该返回 nil,切忌循环引用。
原因:Kitex Client 对请求超时的实现基于 context
中提供的 context.WithTimeout(ctx, timeout)
方法。如果业务传入的 ctx
中本身就设置了 deadline
且比 RPC 超时时间要短,则以业务传入的 ctx deadline
为准。
解决:不要为 ctx
设置 deadline
。
排查方法:
利用 context.Done()
方法:在 rpc 请求前输出以下 ctx 信息,如果 ctx.Done() != nil
说明设置过 WithTimeout
、WithDeadline
deadline, _ := ctx.Deadline()
klog.Infof("before rpc call, ctxDone=%t, deadline=%v", ctx.Done() != nil, deadline)
排查代码中调用了 WithTimeout
或 WithDeadline
或者其他等价操作的地方。有时候并不是你自己直接设置了 timeout
,常见是将别的框架使用的 ctx
传递给 kitex client
,而该 ctx
已经被设置过上述几种行为。但无论是哪边修改的,之前从 Client
调用的代码段开始倒查 ctx
赋值的链路,一定能找到篡改点。你可以使用 dlv
( go 调试器)或 IDE
的调试模式来帮助排查调用链。
原因:如果在 Kitex 客户端设置的实际超时截止时间之前,业务代码里调用了 WithTimeout
、 WithDeadline
或 WithCancel
返回的 cancel
函数,Kitex 会附加额外的信息 context canceled by business
排查方法:参考上文 context deadline earlier than timeout
排查方法
注意:如果多个 goroutine
共享 ctx
(典型是启动一个新的 goroutine
并将 ctx
传递过去)的情况,如果调用该 ctx
的 cancel
方法,会影响所有 goroutine
。
该问题说明是 Client 和 Server 的协议不一致,下面列出一些常见的情况供参考。
可先根据现象快速判断问题是 Client 端还是 Server 端:
报文 | 说明 |
---|---|
first4Bytes=0x48545450, second4Bytes=0x2f312e31 | 这 8 个字节对应 ASCII “HTTP/1.1”,这是典型的 HTTP Server 响应报文。说明 Kitex Client 请求了 HTTP Server。 |
first4Bytes=0x47455420 | 这 4 个字节对应 ASCII “GET “,这是典型的 HTTP GET 请求报文。说明 Kitex Server 收到了 HTTP 请求;请勿使用 HTTP Client 直接请求 Kitex Server。 |
first4Bytes=0x504f5354 | 这 4 个字节对应 ASCII “POST”,这是典型的 HTTP POST 请求报文。说明 Kitex Server 收到了 HTTP 请求;请勿使用 HTTP Client 直接请求 Kitex Server。 |
first4Bytes=0x16030100 | 这是 TLS 协议的报文,Kitex 默认并不支持 TLS 协议。 |
first4Bytes=0x50524920, second4Bytes=0x2a204854 | 这是 HTTP2 的 PRI 请求,即服务收到了 HTTP2 请求,请检查对应的 Client。 |
Q1:如何定位请求源?
Q2:为什么报错信息里没有请求的方法名称?