場景:近期小L發佈app的時候遇到個頭疼的事情,由於蘋果app store需要審覈原因,項目需要部署最新版本,但又不能影響來版本的正常使用;
分析問題:如果是app業務相關的程序bug、或者是預發佈版本
解決方案:配置dubbo多版本
<dubbo:protocol id="customerRest" name="rest" port="xxxxx" /> <!-- ref:要注入的Service實現 --> <dubbo:service interface="com.jlj.erp.app.dubbo.service.customer.CustomerApi" ref="customerApi" version="1.0" group="group-customer" protocol="customerRest" timeout="60000" /> <!-- ref:要注入的Service實現 --> <dubbo:service interface="com.jlj.erp.app.dubbo.service.customer.CustomerApi" ref="customerVApi2" version="1.1" group="group-customer" protocol="customerRest" timeout="60000" />
實現相同的接口,只是接口對應的版本不一樣從1.0到1.1,按照需求對1.1版本的接口進行實現,這樣發佈時,新老接口就會並存,如果需要強制更新審覈通過之後會將老版本(1.0版本代碼去掉)停掉運行新版本,如果不需強制更新,那麼就可以新老版本並存
客戶端調用,小L用的是dubbox 所以不同的版本配置不同的路徑即可
http://127.0.0.1:80/a//xxx/v1(老) @GET @Path("/xxx/v1") public ApiResult xxx(@QueryParam("code") String resourceCode) http://127.0.0.1:80/a//xxx/v2(新) @GET @Path("/xxx/v2") public ApiResult xxx(@QueryParam("code") String resourceCode)
如果是數據結構發生變化的話小L不建議使用該方式
這樣的情況需要具體問題具體定解決方案,可以分開部署,可以做預發佈環境,部署1個具有新表結構和對象的測試數據庫(預發佈環境)。
對於改動較大的,產品新增了重量級新功能的,業務層面或者底層表結構上都不兼容的,建議是要做強制升級的。
注:接口的實現方法 按照接口版本定;接口新加的方法寫在V1版本中,如果V1版本中的某個方法參數條件變化了,那麼把新的實現寫在V2版本里面,V1版本的實現保留