spring cloud服务提供者接口迭代兼容策略(平滑升级)
spring cloud服务提供者接口迭代兼容策略
接口表现形式
- 传统接口形式的兼容(java、feign级别的兼容),如public ReturnType methodName(Params...){...return object;};
- http请求形式的兼容,比如uri、method等等
解决方式
-
当只需要修改接口实现,不需要修改接口表现形式时,且接口语义没有发生变化,这种情况下可以无感知升级(不需要通知其他人或团队,因为没必要【这时候表现形式与实现分离,只改动实现就是无感知的原因】);
-
当接口语义发生变化或接口形式发生变化时,通过以下两个步骤来平滑升级:
-
通过升级客户端jar的版本号,保持编译时的接口兼容;
-
通过新增接口(并同时给旧接口标注@Deprecated 注解表示未来会下线/删除)的形式,保持运行时的接口调用兼容
另外,删除旧接口,可通过发公告、邮件甚至口头等方式通知其他人或团队整改,迁移到新接口,最后一道防线,通过流量监控等方式确保没有调用方使用旧接口了,这时候才敢下线标注了@Deprecated 的过时陈旧接口。
-
原则
只新增、删除接口,修改接口实现(语义未发生重大变化时)这三种情况。
具体实施
- 一、当不需要升级客户端jar版本时(SNAPSHOT):
-
mvn clean install deploy
; - 通知服务调用方强制刷新SNAPSHOT包的缓存(可选)
-
- 二、当需要升级客户端jar版本时(此时可能是SNAPSHOT也可能是正式版本):
- 升级jar源文件的pom文件版本号;
mvn clean install deploy
- 通知服务调用方更改maven坐标(版本号)
SNAPSHOT VS 正式版本
- 选择SNAPSHOT版本是因为代码不稳定,可持续更新,适用于非接口表现形式(即只更改接口实现,且语义最好不变)的变化(当然,一般也适用于新增服务接口的情况);
- 但是一般情况下,线上工程尽量依赖正式版本,降低SNAPSHOT的易变性发生的代码出错风险。