一、FeignClient注解
FeignClient注解被@Target(ElementType.TYPE)修飾,表示FeignClient注解的作用目標在接口上
@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的統一前綴@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內容如下:
@Configurationpublic 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:
@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
@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(); }
新聞熱點
疑難解答