FeignClient使用問題(一)

問題描述:

首先這個項目起始是參考前人做的一個項目拷貝過來修改的,所以在對於接口的書寫方式幾乎是無異的,除了他們項目引用了更多的jar包以外;然後就按部就班地使用了feignclient開始了服務調用,可是並沒有像他們項目過得那麼順利,總是在client接口調用處遇到了傳參的問題。

 

①前人不需要指定請求方式,可是我這邊必須要給他指定一下方式,不然默認是get方式;

②對於這個RequestParam註解導致的400、415等問題一直是沒有發現的;剛開始在考慮是否是包名類名需要完全一致等原因,排除這個的可能後;先用簡單參數傳輸,依然不行。

③在參考了網上博客的“深入理解FeignClient”之後,

https://blog.csdn.net/forezp/article/details/73480304 加入了

<dependency> 

<groupId>com.netflix.feign</groupId> 

<artifactId>feign-httpclient</artifactId> 

<version>RELEASE</version> 

</dependency>

的依賴,經測試解決了傳輸問題,但是隻能支持字符串傳輸,對於對象依然會報400的問題。

④取消掉對於第③步引用的jar解決的部分問題;新建一個簡單工程測試排除原工程可能出現的spring加載順序引起的異常情況;簡單jar引用,比較坑的是對於client接口和controller層都是拷貝原工程的代碼;這個時候出現了新的問題,因爲在進行這個新簡單工程的package時出現了一個不重要的報錯(說的是簡單工程與原工程的名稱相同),項目可以正常啓動,但只能用jar啓動。

⑤然後和原來一樣進行post,這時出現了controller層面的400參數問題,

(MissingServletRequestParameterException",
"message":"Required WaterBillDtoNoPassword parameter 'waterBillVo' is not present)

然後就想放棄這個簡單工程回到原工程進行post,發現原工程這時也出現了同樣的錯誤,但是在建簡單工程之前原工程的controller層可以,client層報的400。

 

 

 

⑥這個時候請同事幫忙看,在一番檢閱下,我建議先去掉valid註解嘗試,結果不行,好在controller層面處理比client層的調用的可見度要來的高,可是即使是在dispatcherservlet的斷點查看並沒發現問題,所以只能懷疑註解的問題了;我發現RequestParam這個註解除了對於傳參取別名和部分校驗外沒什麼用處,就去掉了這個註解,結果就成了;發現與controller類似的client層也應該是這個註解產生的問題,經驗證確實是;比較奇怪的是前人做的那個項目竟然沒有報這些錯誤。

 

 

總結:

經過查閱、思考和檢驗,這個問題受多餘註解的干擾,需要明確requestbody和requestparam的用法,requestbody註解用於傳輸對象、集合;而requestparam註解用於傳輸單條參數並起別名和是否必須。

⑦超時問題:從報錯中判斷超時類型是ribbon還是hystrix

# ribbon

# 請求處理的超時時間
ribbon.ReadTimeout: 120000

# 請求連接的超時時間
ribbon.ConnectTimeout: 30000

hystrix

feign.hystrix.enabled: true
# hystrix 熔斷機制
hystrix:
  shareSecurityContext: true
  command:
    default:
      circuitBreaker:
        sleepWindowInMilliseconds: 100000
        forceClosed: true
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 600000

 

 

==

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章