chain33
chain33 copied to clipboard
jrpc接口版本管理问题
chain33 在实现jrpc接口时, 存在直接返回 types 包中的数据结构. 会有两个问题
- pb格式的 0值在json中, 会被忽略
- 内部数据结构的改动, 会影响协议. 这不一定都是bug, 有时这个改动也需要协议改动, 但有时代码的修改者没有意识这会导致协议的变动, 就没有去修改协议文档.
部分类型已经在 rpc/types/types.go 已经定义, 只是有接口没有用上.
我们可以约定 jrpc 的实现 为 先调用 rpc的实现函数, 再处理返回值的类型转换, 这样不容易产生上诉问题. 类型转换可以写一些小的转换函数来实现.
接口中用的数据结构就算有和内部用到的数据结构一模一样, 也建议单独在定义一份, 用更多的代码换更稳定的接口.
在chain33项目中, types.transaction 应该是相对不会变的数据结构, 也有两次变化
- 增加对交易组的支持: 加了 next, groupCount等
- 最近加入 hashCache, fullHashCache
-
json rpc 和 grpc 一样,客户端要对后续新增字段兼容,使用的json 解析的库,需要支持这一点,这个要明确重点的写在我们的接口说明上。
-
修改字段或者字段的名字,类型之类的,需要新建一个函数 GetAccountV2 V3... , 并且把旧版本设置为过期,提醒客户端。一段时间后,改成 GetAccount ,不再对非常老的版本支持。提供一个启动后调用过期函数,以及次数的统计接口,他们的运维可以监控这个接口,及时的升级客户端。