微服务 - 远程调用 OpenFeign

文章目录

  • 前言
  • 文档
  • 核心类
  • 流程
  • 资源


前言

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 的核心组件,如 ClientContractEncoderDecoder 等,完成对远程服务的调用。OpenFeign 还提供了超时和重试的机制,可以通过配置文件来设置。

文档

可以在 OpenFeign 文档页面,根据使用的版本查看。

核心类

OpenFeign 的核心类有以下几个:

  • @EnableFeignClients:注解,标记应用启动 @FeignClient 客户端。
  • @FeignClient:注解,用于标记一个接口,表示这个接口是一个远程服务的调用客户端。注解中可以指定服务名,URL,配置类等属性。
  • Client:接口,用于定义底层的 HTTP 客户端,如何发送 HTTP 请求。OpenFeign 默认使用 Java 的 URLConnection,也可以使用其他的客户端,如 Apache HttpClient,OkHttp 等。
  • Retryer:接口,用于定义重试的策略,如何在请求失败时进行重试。OpenFeign 默认提供了两种重试器,NeverRetryerRetryer.Default,也可以自定义重试器。
  • Logger:接口,用于定义日志的记录规则,如何记录请求和响应的信息。OpenFeign 默认提供了四种日志级别,NONEBASICHEADERSFULL,也可以自定义日志器。
  • 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<DataPage> queryPage(@RequestParam("pageIndex") Integer pageIndex, @RequestParam("pageSize") Integer pageSize);
}

资源

OpenFeign/feign
spring-cloud/spring-cloud-openfeign
OpenFeign 文档

你可能感兴趣的:(微服务,微服务,java,spring,openfeign,feign)