1、Feign請求引數說明
電子商務平臺原始碼請加企鵝求求:一零三八七七四六二六。Feign是Netflix的產品,Spring Cloud Feign是在原生Feign的基礎上進行了封裝。由於Spring Cloud Feign引入了許多springmvc的註解,方便springmvc的使用者使用,但同時也給使用者帶來了很大的混淆,下面我們簡單講解一下springmvc和Spring Cloud Feign的引數繫結機制。
1.1 SpringMVC請求引數繫結機制
我們通過下面的例子進行講解:
@RestController
public class demoController{
@RequestMapping("hello")
public String hello(String name){
return "hello"+name;
}
}
複製程式碼
雖然介面很簡單,但是SpringMVC在解析請求時為做了很多的事情
@RequestMapping指定請求的路徑對映,我們GET,POST,DELETE,PUT的請求都可以對映到這裡;
SpringMVC提供的引數註解包括@RequestParm,@RequestBody,@PathVariable等,在例子中我們的引數name被預設新增@RequestParm註解,SpringMVC使用位元組碼技術獲取name這個名稱,自動檢測請求引數中key值為name的引數,如果我們的url請求或者form表單中包含name這個引數,就會被SpringMVC解析到。
1.2 Spring Cloud Feign請求引數繫結機制
SpringMVC的引數繫結機制和Feign的引數繫結機制是不一樣的。下面我們看一個錯誤的例子:
假如有這樣一個api:
@ResstController
public class demoController{
@RequestMapping(value="hello",method=RequsetMethod.GET)
public String hello(String name){
return "hello"+name;
}
複製程式碼
Feign 訪問這個api
@FeignClient(name = "hello")
public interface IHelloService {
@RequestMapping(value = "/hello",method = RequestMethod.GET)
String hello (String name);
}
複製程式碼
由於我們指定了請求方式GET,那麼如果按照SpringMVC的引數繫結機制,name引數會被拼接在URL上,但是介面並未接收到,檢視後臺日誌發現:
請求方式不是GET,而是POST
name 引數為null
經過Google發現Feign的引數繫結機制與SpringMVC不同:
Feign預設使用@RequestBody,這就是上面name引數為null的原因,@RequestBody(只能有一個)一般用於傳遞物件,如果引數中出現多個物件可以使用Map來傳遞物件
@FeignClient(name = "hello")
public interface IHelloService {
@RequestMapping(value = "/hello",method = RequestMethod.GET)
String saveBook(@RequestBody Book book);
}
複製程式碼
@FeignClient(name = "hello")
public interface IHelloService {
@RequestMapping(value = "/hello",method = RequestMethod.GET)
String saveMap(@RequestParm Map map);
}
複製程式碼
Feign傳遞name引數,必須新增@RequestParm('name'),name必須指定,Feign不會利用SpringMVC位元組碼的機制自動給定一個預設名稱
@FeignClient(name = "hello")
public interface IHelloService {
@RequestMapping(value = "/hello",method = RequestMethod.GET)
String hello (@RequestParm('name') String name);
}
複製程式碼
2、@FeignClient註解與引數
@FeignClient註解被@Target(ElementType.TYPE)修飾,表明@FeignClient註解的作用在介面上
2.1 @FeignClient標籤常用屬性
name:指定FeignClient的名稱,如果專案使用了Ribbon,name屬性會作為微服務的名稱,用於服務發現
decode404:當發生http 404錯誤時,如果該欄位位true,會呼叫decoder進行解碼,否則丟擲FeignException
configuration: Feign配置類,可以自定義Feign的Encoder、Decoder、LogLevel、Contract
fallback: 定義容錯的處理類,當呼叫遠端介面失敗或超時時,會呼叫對應介面的容錯邏輯,fallback指定的類必須實現@FeignClient標記的介面
fallbackFactory: 工廠類,用於生成fallback類示例,通過這個屬性我們可以實現每個介面通用的容錯邏輯,減少重複的程式碼
path: 定義當前FeignClient的統一字首