Releases: cloudwego/kitex
v0.16.1
Features
gRPC - Reuse Write Buffer per Connection (#1918)
gRPC (nphttp2) transport now supports reusing a write buffer for each connection, reducing per-frame allocations on the write path. New client and server options are exposed to enable this behavior.
- Framer refactor in
pkg/remote/trans/nphttp2/grpc/framer.goto share a buffer across writes on the same connection. - New options in
client/option.goandserver/option.goto opt into buffer reuse.
Optimizations
ttstream - Remove Connection Write Goroutine to Avoid Sender OOM (#1917)
Removed the dedicated per-connection write goroutine from the ttstream transport. The previous design could accumulate unbounded buffered frames on the sender side when the peer was slow, leading to out-of-memory on the sender. Writes are now performed synchronously, applying natural back-pressure to producers.
- Refactored
pkg/remote/trans/ttstream/transport_client.goandtransport_server.goto drop the writer goroutine. - Added frame-level tests and expanded transport test coverage.
Commits
- d83a475 - feat: gRPC supports reusing write buffer for each connection (#1918)
- 850f33d - optimize: remove ttstream connection write goroutine to avoid Sender OOM (#1917)
- f732553 - chore: release version v0.16.1 (#1919)
Full Changelog: v0.16.0...v0.16.1
v0.16.0
Features
Streaming - Recv Timeout and gRPC Error/Log Adjustments (#1911)
Added a new Recv timeout configuration for streaming RPCs, allowing users to control how long a single Recv call may block before returning an error. Also refined gRPC error propagation and logging behavior so streaming failures are reported more accurately.
- New call option in
client/callopt/streamcalland client option inclient/option_stream.gofor configuring Recv timeout. - Adjustments to
pkg/remote/trans/nphttp2codes andpkg/remote/trans/ttstreamexceptions for clearer error classification.
Streaming - Detailed Tracing Events (#1905)
Introduced fine-grained tracing events for streaming RPCs. A new stream_tracer in pkg/rpcinfo enables observability into per-stream lifecycle events (send/recv/header/trailer), and both gRPC (nphttp2) and ttstream transports now emit these events.
- New
pkg/rpcinfo/stream_tracer.gowith extensive test coverage. - New stream option APIs on both client and server (
client/option_stream.go,server/option_stream.go).
Streaming - Remove RPCInfo Reuse for Streaming (#1909)
Removed RPCInfo object reuse on the streaming server path for both nphttp2 and ttstream. This avoids cross-stream state leakage where a long-lived stream could observe stale data from a previously recycled RPCInfo.
Dependencies
Updated Dependencies (#1912)
github.com/bytedance/sonicv1.14.2 → v1.15.0github.com/bytedance/sonic/loaderv0.4.0 → v0.5.0github.com/cloudwego/dynamicgov0.7.1 → v0.8.0github.com/cloudwego/frugalv0.3.0 → v0.3.1
Commits
- 25a04f9 - feat(streaming): add Recv timeout config and adjust gRPC error/log (#1911)
- 7f2cf83 - chore: update dependencies (#1912)
- f7b6362 - feat(streaming): support detailed tracing events (#1905)
- 5cf426c - feat(streaming): remove rpcinfo reuse for streaming (#1909)
- 910b399 - chore: release version v0.16.0 (#1913)
Full Changelog: v0.15.4...v0.16.0
v0.15.4
v0.15.4
Bug Fixes
Code Generation - DeepCopy for Binary Types (#1902)
- Fixed: DeepCopy code generation now correctly handles Thrift binary types that are mapped to Go string types.
This ensures string-typed binary fields are handled with simple value assignment instead of byte slice allocation and copying.
Dependencies
Updated: github.com/cloudwego/gopkg v0.1.6 → v0.1.8 (#1903)
Changes included from gopkg v0.1.7:
- Optimized thrift span cache with lazy initialization (performance improvement)
- Fixed protocol handling to ensure data length matches copied bytes for strings and binary data (correctness fix)
- Added connection state checker for gonet (stability improvement)
- Resolved file descriptor operator memory leak (memory safety)
Changes included from gopkg v0.1.8:
- Increased ttheader limit size from 64KB to 256KB
- Fixed header length overflow issues
Impact: Improves protocol handling correctness, memory safety, and increases header size limits for TTHeader protocol users.
Commits
v0.15.3
Highlights
This release includes important bug fixes for TTStream, mixed retry, and rpcinfo handling, along with new features for dynamicgo options and code generation improvements.
Feature
- Support passing dynamicgo's parsing options via WithDynamicGoOptions for ThriftIDLProvider (#1878)
- Code generation: Execute custom templates on each service when loop_service is set to true, even without combined service mode (#1893)
Fix
- Fix kitex tool: Move git clone/checkout before protobuf processing to ensure dependencies are available (#1900)
- Fix TTStream: Inject K_METHOD into server-side context to provide method name for downstream RPC calls (#1852)
- Fix TTStream: Send Header Frame when exiting handler directly via CloseSend without sending messages (#1887)
- Fix mixed retry: Avoid waiting for backoff when the first call is successful (#1879)
- Fix rpcinfo: Prevent type conversion panic when calling FreezeRPCInfo consecutively (#1888)
Optimization
- Improve connection failure auto-retry log by adding destination service name for troubleshooting (#1880)
- Avoid grpc cleanupStream closure capturing Stream objects, reducing memory retention (#1886)
Documentation
- Fix grammar and clarity issues in README.md (#1896)
Dependency
- Upgraded github.com/cloudwego/localsession from v0.1.2 to v0.2.1
- Upgraded github.com/cloudwego/dynamicgo from v0.7.0 to v0.7.1
- Upgraded github.com/bytedance/sonic from v1.14.1 to v1.14.2
Full Changelog: v0.15.2...v0.15.3
v0.15.2
What's Changed
- ci: add claude github workflows by @jayantxie in #1870
- ci: manually trigger the pr review workflow to fix the workflow error in the fork repository's PR by @jayantxie in #1874
- fix(server): support unique method lookup when service name lookup fails by @jayantxie in #1873
- feat: restore the definition of remote.Message().ProtocolInfo() interface to resolve compatibility issues by @jayantxie in #1876
- chore: release version v0.15.2 by @jayantxie in #1877
Full Changelog: v0.15.1...v0.15.2
v0.15.1
What's Changed
- fix(ttstream): use consistent context of stream in ttstream.RecvMsg and fix nil message error of binary generic by @jayantxie in #1866
- fix(gRPC): retrieve status or biz error for non-ServerStreaming by @DMwangnima in #1530
- chore: update version v0.15.1 by @jayantxie in #1867
Full Changelog: v0.15.0...v0.15.1
v0.15.0
What's Changed
Feature
- feat(ttstream): support ctx cancel and detailed canceled error by @DMwangnima in #1821 | #1859 | #1856
特性:TTStream 支持上下文取消及详细的取消错误信息
- feat(generic): support new thrift binary generic call api, server streaming generic call and unknown service or method handler by @jayantxie in #1837 | #1857
特性:支持新的 thrift 二进制泛化调用 api,服务端流式泛化调用和 unknown service or method handler
- feat(grpc): support dump MaxConcurrentStreams of HTTP2 Client by @DMwangnima in #1820
特性:gRPC 支持导出 HTTP2 客户端的 MaxConcurrentStreams 配置
Fix
- fix(retry): shallow copy response to avoid data race by @jayantxie in #1799 | #1814
修复:浅拷贝 response 以避免数据竞争
修复:负载均衡器缓存中创建新均衡器前检查存在性以防止泄漏
- fix(generic): descriptor.HTTPRequest.GetParam nil pointer exception by @jayantxie in #1827
修复:描述符 HTTPRequest.GetParam 的空指针异常
- fix(generic): fix generic write int range check by @HeyJavaBean in #1861
修复:泛化写入整数的范围检查
- fix(rpcinfo): protect bizErr and extra field of ri.Invocation by lock by @jayantxie in #1850
修复:通过锁保护 ri.Invocation 的 bizErr 和 extra 字段
- fix(timeout): remove timer pool to avoid timer race issue by @jayantxie in #1858
修复:移除计时器池以避免计时器竞争问题
- fix(tool): disable fast api for protobuf by @DMwangnima in #1807
修复:工具中为 Protobuf 禁用 Fast API
修复:工具中为 -use 参数跳过 PB 代码生成
Optimize
优化:gRPC 访问 metadata.MD 时不转换为小写
- optimize(ttstream): lazy init cleaning task for ObjectPool to reduce the impact of lots of goroutines caused by creating too many Generic Client by @DMwangnima in #1842
优化:对象池延迟初始化清理任务,减少创建过多泛化客户端导致的大量 goroutine 影响
- optimize(tool): remove string deepcopy because the string type is read-only in Go by @jayantxie in #1832
优化:移除字符串深拷贝,因为 Go 中字符串类型是只读的
Breaking Change
- refactor(ttstream): remove ttstream provider by @jayantxie in #1805
重构:移除 TTStream provider 接口
- refactor(rpcinfo): move service/method info from message to rpcinfo, remove protocol info from message and update min go version to 1.20 by @jayantxie in #1818 | #1855
重构:将服务/方法信息从消息移至 rpcinfo,从消息中移除协议信息,并更新最低 Go 版本至 1.20
- refactor(server): remove service middleware and SupportedTransportsFunc api by @jayantxie in #1839
重构:移除服务中间件和 SupportedTransportsFunc API
- refactor(server): remove useless TargetSvcInfo field by @jayantxie in #1840
重构:移除无用的 TargetSvcInfo 字段
Chore
- chore: update dependencies of kitex to support go 1.25 and new features by @jayantxie @AsterDY in #1848 | #1834 | #1862 | #1836
chore:更新 kitex 依赖项以支持 go1.25 和新特性
- chore: update version v0.15.0 by @jayantxie in #1864
chore:更新版本至 v0.15.0
- docs: fix broken link to blogs by @scientiacoder in #1813
chore:修复博客的损坏链接
特性:在合并编译场景中支持传递自定义上下文 key 到下游
New Contributors
- @scientiacoder made their first contribution in #1813
- @yangma0 made their first contribution in #1814
Full Changelog: v0.14.1...v0.15.0
v0.14.1
Optimize
[#1798] optimize(tool): remove apache replace in go.mod because apache thrift is not used anymore
Test
[#1800] test: improve gRPC unit tests stability
Chore
[#1797] chore: upgrade prutal
[#1802] chore: add release scripts
[#1804] chore: update version v0.14.1
Full Changelog: v0.14.0...v0.14.1
v0.14.0
Feature
[#1759] feat(tool): add env for using prutal to marshal
[#1782] feat(ttstream): process MetaFrame and reflect to rpcinfo
[#1777] feat(client): report err when create Stream failed
[#1763] feat: support ttheader streaming generic call
[#1771] feat(tool): add thriftgo patcher extension
[#1755] feat: add generic binary pb for streamx
[#1752] feat(generic): support generic pb binary for streaming
Optimize
[#1788] optimize: go net implementation
[#1786] optimize(tool): remove tool fastpb generation
[#1783] optimize(gRPC): parse PayloadCodec in server side
[#1780] optimize(ttstream): log the error thrown by invoking handler
[#1769] optimize: injection of options in ttstream
Fix
[#1792] fix(gRPC): inject current method name to rpcinfo in server-side to fix FROM_METHOD missing
[#1787] fix(ttstream): metrics missing caused by server-side rpcinfo not set correctly
[#1778] fix: enabling json mode of map generic not work
[#1774] fix(server): trans server conn count race issue
[#1742] fix(generic): align dynamicgo's write base behavior with old generic (only for internal logic)
Refactor
[#1770] refactor: refactor generic streaming
Tests:
[#1793] test: add go1.18 to scenario-test
[#1765] test: remove unnecessary server in json generic test
Docs
[#1794] docs: update CONTRIBUTING.md to change PR base branch to main
Chore
[#1795] chore: update dependency
[#1776] chore: remove testify dependency
[#1757] chore: update prutal to v0.1.1
[#1753] ci: disable codecov annotations