Feign与OpenFeign声明式服务调用介绍

2021-10-22 0 By admin

Spring Cloud Feign 基于Netflix Feign 实现,整合了Spring Cloud Ribbon 与 Spring Cloud Hystrix ,除了提供这两者的强大功能之外,还提供了一种声明式的 WebService 客户端定义方式。

Feign 是 Netflix 开发的声明式、模块化的HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及WebSocket。Feign可帮助我们更加便捷、优雅的调用HTTP API。
在Spring Cloud中,使用Feign非常简单,通过创建一个接口,并在接口上添加一些注解,代码就完成了。Feign 支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
Spring Cloud对 feign 进行了增强,使Feign支持了Spring MVC注解,并整合了 Ribbon 和 Eureka,从而让 Feign的使用更加便捷。

一、Feign 概述

1.1、Feign是什么

Feign 是一个声明式 WebService 客户端。使用Feign能让编写Web Service客户端更加简单。
它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。
Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

1.2、Feign能干什么

Feign旨在使编写Java Http客户端变得更容易。
前面在使用 Ribbon+RestTemplate 时,利用 RestTemplate 对 http 请求的封装处理,形成了一套模版化的调用方法。
但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。

所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在 Feign 的实现下,我们只需创建一个接口并使用注解的方式来配置它,即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。

二、Feign 与 Ribbon、OpenFeign 的关系

2.1、Feign集成了Ribbon

之前在使用 Ribbon 封装 RestTemplate 工具时,利用 Ribbon 维护了注册中心生产者的服务列表信息,并且通过轮询实现了客户端的负载均衡。
而与Ribbon不同的是,通过 feign 只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用;底层功能有 Ribbon、RestTemplate 自动实现。

2.2、Feign和OpenFeign两者区别

Feign是Spring Cloud组件中的一个轻量级 RESTful的 HTTP服务客户端 Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。
Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

OpenFeign是Spring Cloud 在Feign的基础上支持了SpringMVC的注解,如 @RequestMapping 等等。OpenFeign的 @Feignclient 可以解析 SpringMVC 的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>