Feign的使用
Feign采用了聲明式的API接口的風格,將Java Http客戶端綁定到它的內部,從而調用過程變的簡單。
配置文件:
spring: application: name: eureka-feign-client server: port: 8765 eureka: client: service-url: defaultZone: http://localhost:9001/eureka/
啟動類:
@SpringBootApplication @EnableEurekaClient @EnableFeignClients public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
Feign Config:
@Configuration public class FeignConfig { @Bean public Retryer feignRetryer() { return new Retryer.Default(100, SECONDS.toMillis(1), 5); } }
實現Feign Client接口:
@FeignClient(value = "hi-service", configuration = FeignConfig.class) public interface EurekaClientFeign { @GetMapping(value = "/hi") String sayHiFromClientEureka(@RequestParam(value = "name") String name); }
經過這幾個步驟后,就可以完成Feign對Eureka服務的調用了。
FeignClient的配置
默認的配置類為FeignClientsConfiguration,這個類注入了很多Feign相關的配置Bean,包括FeignRetryer.FeignLoggerFactory和FormattingConversionService等。
另外Decoder、Encoder和Contract這三個類沒有Bean注入的情況下,會自動注入默認配置Bean,即ResponseEntityDecoder、SpringEncoder和SpringMvcContract。
我們可以重寫FeignClientsConfiguration中的Bean,覆蓋默認的配置Bean,從而達到自定義配置的目的。
Feign中使用HttpClent和OkHttp
Feign默認使用HttpUrlConnection來實現網絡請求,但它還支持其他網絡請求框架。只要pom.xml配置上feign-okhttp或者feign-httpclinet的依賴,然后配置文件上配置feign.httpclient.enabled或者feign.okhttp.enabled為true就可以啟用了。
總結
1、@EnableFeignClients注解開啟FeignClient功能。只有這個注解存在,程序才會開啟對@FeignClient注解的包掃描
2、更具Feign的規則實現接口,並在接口上面加@FeignClient注解
3、程序啟動后,掃描所有的@FeignClient的注解的類,並將這些信息注入到IOC容器
4、當接口被調用時,通過JDK代理生成巨日的RequestTemplate模板對象
5、根據RequestTemplate生成Http請求的Request對象
6、Request對象交給Client(HttpUrlConnection/HttpClient/OkHttp)處理
7、最后Client被封裝到LoadBalanceClient中,結合Ribbon做負載均衡