Feign 是一个声明式的 HTTP 客户端,它可以让你像调用本地方法一样访问远程服务。Feign 的灵感来源于 Retrofit、JAXRS-2.0 和 WebSocket,它通过可定制的解码器和错误处理,编写任意的 HTTP API。Feign 还整合了 Ribbon 和 Hystrix,具有负载均衡和熔断的能力。
Feign 有两种实现:Netflix Feign 和 OpenFeign。Netflix Feign 是 Netflix 开源的原始版本,OpenFeign 是 Spring Cloud 对 Netflix Feign 的封装和扩展,增加了对 Spring MVC 注解的支持,以及对 Spring Boot 的自动化配置。
OpenFeign 的核心作用是为 HTTP 形式的 Rest API 提供了简洁高效的 RPC 调用方式。OpenFeign 的工作原理是通过动态代理的方式,生成接口的实现类,然后通过 Feign 的核心组件,如
Client,Contract,Encoder,Decoder等,完成对远程服务的调用。OpenFeign 还提供了超时和重试的机制,可以通过配置文件来设置。
可以在 OpenFeign 文档页面,根据使用的版本查看。
OpenFeign 的核心类有以下几个:
@EnableFeignClients:注解,标记应用启动 @FeignClient 客户端。@FeignClient:注解,用于标记一个接口,表示这个接口是一个远程服务的调用客户端。注解中可以指定服务名,URL,配置类等属性。Client:接口,用于定义底层的 HTTP 客户端,如何发送 HTTP 请求。OpenFeign 默认使用 Java 的 URLConnection,也可以使用其他的客户端,如 Apache HttpClient,OkHttp 等。Retryer:接口,用于定义重试的策略,如何在请求失败时进行重试。OpenFeign 默认提供了两种重试器,NeverRetryer 和 Retryer.Default,也可以自定义重试器。Logger:接口,用于定义日志的记录规则,如何记录请求和响应的信息。OpenFeign 默认提供了四种日志级别,NONE,BASIC,HEADERS,FULL,也可以自定义日志器。Contract:接口,用于定义注解的处理规则,如何将注解转换为请求模板。OpenFeign 默认使用Spring MVC 的注解,如 @RequestMapping,@PathVariable 等,也可以自定义注解。Encoder:接口,用于定义请求参数的编码规则,如何将请求参数转换为请求体。OpenFeign 默认使用 Spring 的 HttpMessageConverter,也可以自定义编码器。Decoder:接口,用于定义响应体的解码规则,如何将响应体转换为 Java 对象。OpenFeign 默认使用 Spring 的 HttpMessageConverter,也可以自定义解码器。在应用主类上添加 @EnableFeignClients,则注解里的 FeignClientsRegistrar#registerFeignClients 方法将 FeignClientFactoryBean 的 BeanDefinition 添加到 Spring 容器。
@EnableFeignClients // this
@SpringBootApplication
public class XxxApplication {public static void main(String[] args) {SpringApplication.run(XxxApplication.class, args);}
}
然后通过 FeignClientFactoryBean#getObject 创建 Feign.Builder,最后通过 Feign.Builder#target 把 @FeignClient 修饰的类创建代理 Client 放入 Spring 容器。
@FeignClient("xxx-service")
public interface XxxClient {@GetMapping("/queryPage")Response queryPage(@RequestParam("pageIndex") Integer pageIndex, @RequestParam("pageSize") Integer pageSize);
}
OpenFeign/feign
spring-cloud/spring-cloud-openfeign
OpenFeign 文档