1. 程式人生 > >Feign性能優化註意事項

Feign性能優化註意事項

統一 new nco lin .com use 404錯誤 value ex18

一、FeignClient註解

FeignClient註解被@Target(ElementType.TYPE)修飾,表示FeignClient註解的作用目標在接口上

1 2 3 4 5 @FeignClient(name = "github-client", url = "https://api.github.com", configuration = GitHubExampleConfig.class) public interface GitHubClient { @RequestMapping(value = "/search/repositories", method = RequestMethod.GET)
String searchRepo(@RequestParam("q") String queryStr); }

 聲明接口之後,在代碼中通過@Resource註入之後即可使用。@FeignClient標簽的常用屬性如下:

  • name:指定FeignClient的名稱,如果項目使用了Ribbon,name屬性會作為微服務的名稱,用於服務發現
  • url: url一般用於調試,可以手動指定@FeignClient調用的地址
  • decode404:當發生http 404錯誤時,如果該字段位true,會調用decoder進行解碼,否則拋出FeignException
  • configuration: Feign配置類,可以自定義Feign的Encoder、Decoder、LogLevel、Contract
  • fallback: 定義容錯的處理類,當調用遠程接口失敗或超時時,會調用對應接口的容錯邏輯,fallback指定的類必須實現@FeignClient標記的接口
  • fallbackFactory: 工廠類,用於生成fallback類示例,通過這個屬性我們可以實現每個接口通用的容錯邏輯,減少重復的代碼
  • path: 定義當前FeignClient的統一前綴
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @FeignClient(name = "github-client", url = "https://api.github.com"
, configuration = GitHubExampleConfig.class, fallback = GitHubClient.DefaultFallback.class) public interface GitHubClient { @RequestMapping(value = "/search/repositories", method = RequestMethod.GET) String searchRepo(@RequestParam("q") String queryStr); /** * 容錯處理類,當調用失敗時,簡單返回空字符串 */ @Component public class DefaultFallback implements GitHubClient { @Override public String searchRepo(@RequestParam("q") String queryStr) { return ""; } } }

 在使用fallback屬性時,需要使用@Component註解,保證fallback類被Spring容器掃描到,GitHubExampleConfig內容如下:

1 2 3 4 5 6 7 @Configuration public class GitHubExampleConfig { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }

  在使用FeignClient時,Spring會按name創建不同的ApplicationContext,通過不同的Context來隔離FeignClient的配置信息,在使用配置類時,不能把配置類放到Spring App Component scan的路徑下,否則,配置類會對所有FeignClient生效.

二、Feign Client 和@RequestMapping 當前工程中有和Feign Client中一樣的Endpoint時,Feign Client的類上不能用@RequestMapping註解否則,當前工程該endpoint http請求且使用accpet時會報404 Controller:
1 2 3 4 5 6 7 8 9 10 11 12 13 @RestController @RequestMapping("/v1/card") public class IndexApi { @PostMapping("balance") @ResponseBody public Info index() { Info.Builder builder = new Info.Builder(); builder.withDetail("x", 2); builder.withDetail("y", 2); return builder.build(); } }

Feign Client

1 2 3 4 5 6 7 8 9 10 11 12 13 @FeignClient( name = "card", url = "http://localhost:7913", fallback = CardFeignClientFallback.class, configuration = FeignClientConfiguration.class ) @RequestMapping(value = "/v1/card") public interface CardFeignClient { @RequestMapping(value = "/balance", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) Info info(); }  

if @RequestMapping is used on class, when invoke http /v1/card/balance, like this :

如果 @RequestMapping註解被用在FeignClient類上,當像如下代碼請求/v1/card/balance時,註意有Accept header:

1 2 3 4 Content-Type:application/json Accept:application/json POST http://localhost:7913/v1/card/balance

那麽會返回 404。

如果不包含Accept header時請求,則是OK:

1 2 Content-Type:application/json POST http://localhost:7913/v1/card/balance

或者像下面不在Feign Client上使用@RequestMapping註解,請求也是ok,無論是否包含Accept:

1 2 3 4 5 6 7 8 9 10 11 12 13 @FeignClient( name = "card", url = "http://localhost:7913", fallback = CardFeignClientFallback.class, configuration = FeignClientConfiguration.class ) public interface CardFeignClient { @RequestMapping(value = "/v1/card/balance", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) Info info(); }

Feign性能優化註意事項