背景
針對RPC遠程調用,都在使用dubbo、dubbox等,我們也是如此。由於社區暫停維護、應對未來發展,我們准備嘗試新技術(或許這時候也不算什麼新技術了吧),選擇使用了spring cloud架構。在此期間使用spring boot項目嘗試開發,結果良好。所以想重構原spring項目至spring cloud一步一步進行,因此開發中會出現各種問題。
問題
問題總是伴隨著開發一步一步顯露出來,遇到問題總要去解決:
spring cloud相關問題:
1.跨系統調用,傳參對象接收不到問題
解決:服務方在對象參數前@RequestBody即可(ps:public void saveUser(@RequestBody User user)),數據存在報文體中。
2.系統間重試問題,會多次調用是正常業務數據出現重復,造成垃圾數據
解決分為2步且所有都在調用方配置,第一步新增類:
return中是參照feign.Retryer,至於方法名字任意。
@Configuration public class FeignConfig { @Bean public Retryer feignRetryer() { return new Retryer.Default(100, SECONDS.toMillis(1), 0); } }
第二步:
# Max number of next servers to retry (excluding the first server)
sample-client.ribbon.MaxAutoRetriesNextServer=1對於集群服務會隨機選擇下一個服務,有可能還是選擇訪問自己。不是集群設置為1會訪問自己會造成2次訪問。
sample-client 對於多個服務端,sample-client可以刪掉。
查看配置發現,針對配置部分請點擊這裡:
# Max number of retries on the same server (excluding the first try)
sample-client.ribbon.MaxAutoRetries=1 發現沒用
3.部署服務器,注冊中心服務均存在,但是無法訪問獲取數據,報服務拒絕連接
解決:其實這算是個注意點,平時開發都是SpringApplication啟動項目,打包部署服務時tomcat端口與server.port(spring boot)配置不一致造成。猜測spring cloud訪問從注冊中心獲取主機與端口,根據主機和端口訪問服務但是服務tomcat設置端口與配置不一致,造成問題。
spring boot相關問題:
1.項目使用SpringApplication啟動正常,但是訪問不了頁面
解決:@ComponentScan只掃描當前程序所在包結構(包含子包)中聲明
| - src
| | - main
| | | - java
| | | | - com
| | | | | - controller/service/dao
| | | | - SpringApplication.java
2.請求url響應問題,不同後綴響應不同
解決:該場景是因為spring boot有多個視圖解析器,ajax請求可以直接使用a/b,頁面a/b.htm
spring相關問題:
1.spring調用spring cloud項目問題
解決:使用HttpClient設置請求頭Content-Type:application/json訪問spring cloud對外系統(gateway)即可,至於內網外網訪問隨意
異常問題:
spring cloud有Hystrix斷路由,雖然好處多多,但是訪問每個接口都要相應斷路由接口,如果處理邏輯有區別還好,沒有區別我就不說了。由於我們是統一返回,所以針對出現問題使用全局異常攔截記錄日志返回失敗,這有個缺點是訪問通異常可以處理,至於超時這些沒有訪問通就要捕獲。
討論
學藝不精,有些都是似懂非懂,希望大神能指點指點。其中有點疑惑,spring訪問spring cloud最後都打成war包部署發布,個人覺得spring應該也可以注冊到注冊中心,希望知道的可以分享。