文章目录
Feign 概述
什么是 Feign
Feign 入门案例
引入依赖
Feign 接口编写
Controller
结果
Feign 工作原理
@FeignClient 注解
在开发 Spring Cloud 微服务的时候,我们知道,服务之间都是以 HTTP 接口的形式对外提供服务的,因此消费者在进行调用的时候,底层就是通过 HTTP Client 的这种方式进行访问。当然我们可以使用JDK原生的 URLConnection、Apache 的 HTTP Client、Netty 异步 Http Client,Spring 的 RestTemplate 去实现服务间的调用。但是最方便、最优雅的方式是通过 Spring Cloud Open Feign 进行服务间的调用 Spring Cloud 对 Feign 进行了增强,使 Feign 支持 Spring Mvc 的注解,并整合了 Ribbon 等,从而让 Feign 的使用更加方便。
Feign 概述
什么是 Feign
Feign 是一个声明式的 Web Service 客户端。它的出现使开发 Web Service 客户端变得很简单。使用 Feign 只需要创建一个接口加上对应的注解,比如:@FeignClient 注解。 Feign 有可插拔的注解,包括 Feign 注解和 AX-RS 注解。Feign 也支持编码器和解码器,Spring Cloud Open Feign 对 Feign 进行增强支持 Spring Mvc 注解,可以像 Spring Web 一样使用 HttpMessageConverters 等。
Feign 是一种声明式、模板化的 HTTP 客户端。在 Spring Cloud 中使用 Feign,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问 HTTP 请求。接下来介绍一下 Feign 的特性,具体如下:
可插拔的注解支持,包括 Feign 注解和AX-RS注解。
支持可插拔的 HTTP 编码器和解码器。
支持 Hystrix 和它的 Fallback。
支持 Ribbon 的负载均衡。
支持 HTTP 请求和响应的压缩。Feign 是一个声明式的 WebService 客户端,它的目的就是让 Web Service 调用更加简单。它整合了 Ribbon 和 Hystrix,从而不需要开发者针对 Feign 对其进行整合。Feign 还提供了 HTTP 请求的模板,通过编写简单的接口和注解,就可以定义好 HTTP 请求的参数、格式、地址等信息。Feign 会完全代理 HTTP 的请求,在使用过程中我们只需要依赖注入 Bean,然后调用对应的方法传递参数即可。
Feign 入门案例
此处以调用 Github API 查询服务为例。
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类加入如下注解:
/** 开启 Feign 扫描支持 */
@EnableFeignClients
1
2
Feign 接口编写
/**
* @Author:大漠知秋
* @Description:使用 Feign 访问 Github 查询 API
* @CreateDate:2:36 PM 2018/10/24
*/
@FeignClient(name = "github-client", url = "https://api.github.com")
public interface GitHubFeign {
@RequestMapping(
value = "/search/repositories",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_UTF8_VALUE
)
String searchRepo(@RequestParam("q") String q);
}
Controller
/**
* @Author:大漠知秋
* @Description:使用 Feign 访问 Github 查询 API
* @CreateDate:2:42 PM 2018/10/24
*/
@RestController
@RequestMapping(
value = "/github",
produces = MediaType.APPLICATION_JSON_UTF8_VALUE
)
public class GitHubController {
@Resource
private GitHubFeign gitHubFeign;
@RequestMapping(
value = "/search/repositories",
method = RequestMethod.GET
)
String searchRepo(@RequestParam("q") String q) {
return gitHubFeign.searchRepo(q);
}
}
结果
源码:https://github.com/SlowSlicing/demo-spring-cloud-finchley/tree/Feign基本使用
Feign 工作原理
在开发微服务应用时,我们会在主程序入口添加 @EnableFeignClients 注解开启对 Feign Client 扫描加载处理。根据 Feign Client 的开发规范,定义接口并加 @FeignClients 注解。
当程序启动时,会进行包扫描,扫描所有 @FeignClients 的注解的类,并将这些信息注入 Spring IOC 容器中。当定义的 Feign 接口中的方法被调用时,通过JDK的代理的方式,来生成具体的 RequestTemplate。当生成代理时,Feign 会为每个接口方法创建一个 RequetTemplate 对象,该对象封装了 HTTP 请求需要的全部信息,如请求参数名、请求方法等信息都是在这个过程中确定的。
然后由 RequestTemplate 生成 Request,然后把 Request 交给 Client 去处理,这里指的 Client 可以是 JDK 原生的 URLConnection、Apache 的 Http Client 也可以是 Okhttp。最后 Client 被封装到 LoadBalanceclient 类,这个类结合 Ribbon 负载均衡发起服务之间的调用。
@FeignClient 注解
name:指定 Feign Client 的名称,如果项目使用了 Ribbon,name 属性会作为微服务的名称,用于服务发现。
url:url 一般用于调试,可以手动指定 @FeignClient 调用的地址。
decode404:当发生404错误时,如果该字段为 true,会调用 decoder 进行解码,否则抛出 FeignException。
configuration:Feign 配置类,可以自定义 Feign 的 Encoder、Decoder、LogLevel、Contract。
fallback:定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback 指定的类必须实现 @FeignClient 标记的接口。
fallbackFactory:工厂类,用于生成 fallback 类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码。
path:定义当前 FeignClient 的统一前缀。
相关推荐
Redis作者说到:“灵活性被过分高估–>约束才是解放”。...其实核心模块可以独立的work,但是不免它的能力偏弱,比如只能编码字符串类型、只能解码字符串类型,默认使用java.net.HttpURLConnection作为HC… 本篇将
在大文件分片上传的场景中,Feign可以用来调用远程服务,将每个分片作为独立的请求发送。这种方式可以将文件上传的责任分散到不同的服务节点,提高系统的伸缩性和可靠性。 4. 文件合并: 在接收端,接收到所有分片...
在本项目中,"feign-demo.7z"是一个压缩包文件,包含了使用Spring Cloud Feign实现服务调用的相关代码示例。Feign是Spring Cloud生态中的一个组件,主要用于简化微服务之间的RESTful API调用,它通过声明式的方式...
这个教程将引导你从零开始学习如何使用Feign,并通过实际的示例代码来理解其工作原理。 首先,让我们理解SpringBoot和SpringCloud的基础。SpringBoot简化了创建独立的、生产级的基于Spring的应用程序的过程,而无需...
3. **服务消费者与生产者**:"eureka-client"模块展示了服务消费者的实现,如何配置和使用Feign客户端,而"eureka-server"和"eureka-feign-client"则展示了服务生产者的角色。 4. **服务降级与熔断**:虽然在这个...
它通过内嵌式Servlet容器(如Tomcat或Jetty)和自动配置功能,使得创建独立的、生产级别的Java应用程序变得非常容易。在本项目中,Spring Boot被用作基础框架,负责启动、管理服务以及提供基础的依赖管理和配置。 *...
这是因为Hystrix默认使用线程隔离策略,每个请求都会在一个独立的线程中执行,而Feign请求拦截器是在主线程中执行的。 #### 修改隔离策略为信号量模式 ```yaml hystrix.command.default.execution.isolation....
1. 分离接口定义:为避免接口污染,推荐将Feign接口定义在一个独立的模块中,供多个微服务共同使用。 2. 异常处理:通过自定义`ErrorDecoder`,可以捕获并处理远程服务调用时可能出现的异常,提供友好的错误信息。 3...
而使用Feign时,我们定义一个接口,接口方法上使用@FeignClient注解指定服务名,Feign会根据服务名从Eureka获取服务实例,并自动生成实现该接口的客户端代码。 总结来说,"springboot+springcloud+eureka+ribbon/...
3. spring-cloud-user-service:这是用户服务的实现,作为一个独立的微服务,负责处理与用户相关的业务逻辑。它通常会注册到服务发现组件(如Eureka)上,以便其他服务能够通过服务名找到并调用它。服务内部可能包含...
Feign的使用降低了客户端和服务之间交互的复杂性,提高了开发效率。 MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。它将...
数据库方面,本项目使用的是MySQL,这是一种广泛使用的开源关系型数据库管理系统。由于描述中提到不涉及表数据操作,因此项目可能只包含了基本的数据库连接配置,但没有包含具体的数据库模型和操作。在实际运行时,...
Feign 可以与 Ribbon(Netflix 的客户端负载均衡器)和 Eureka(服务发现组件)结合使用,但在微服务生态中,它也可以很好地与 Nacos 结合。 将 Feign 与 Nacos 整合,可以实现以下功能: 1. **声明式服务调用**:...
标题 "microservice_springmicroservices_feign_auth_" 暗示了我们正在探讨一个使用Spring Microservices框架构建的微服务项目,其中包含了Feign客户端以及基本身份验证(Basic Auth)的功能。描述 "microservice-...
Feign可以与Ribbon(负载均衡器)和Hystrix(断路器)结合使用,为服务之间的通信提供熔断和降级策略,增强系统的容错能力。 **整合SpringBoot、Eureka和Feign** 在SpringBoot项目中整合Eureka和Feign,首先需要...
微服务架构是现代软件开发中的一个热门话题,它提倡将大型单体应用分解为一系列小型、独立的服务,每个服务都可以独立开发、部署和扩展。在这个主题中,我们重点关注的是SpringCloud、Nacos以及Feign这三个关键组件...
这个模块是用户服务的消费者,它使用Feign客户端来调用用户服务的提供者。通过Eureka获取用户服务的地址,Ribbon进行负载均衡,Feign则负责将HTTP请求封装和发送。 - **spring-cloud-order-service-provider** 这个...
Feign 整合了 Ribbon 负载和 Hystrix 熔断,可以不再需要显式地使用这两个组件。Feign 具有如下特性: * 可插拔的注解支持,包括 Feign 注解和 JAX-RS 注解 * 支持可插拔的 HTTP 编码器和解码器 * 支持 Hystrix 和...
`nacos-consumer`、`nacos-config`和`nacos-feign`可能是项目中的三个微服务模块,分别代表消费者服务、配置服务和使用Feign的服务。`.idea`目录包含IDE的项目元数据,而`server`可能是一个或多个服务的运行实例。 ...
分布式微服务架构是一种现代软件开发方法,它将大型应用程序拆分为小型、独立的服务,每个服务都可以独立部署和扩展。在这个例子中,我们看到一个基于Spring Boot 2.x、Spring Cloud、Spring Data JPA、Consul、...