`
y806839048
  • 浏览: 1121419 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

feign的独立使用

阅读更多

文章目录

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 的统一前缀。

 

分享到:
评论

相关推荐

    [享学Feign] 九、Feign + OkHttp和Feign + Apache HttpClient哪个更香?

    Redis作者说到:“灵活性被过分高估–&gt;约束才是解放”。...其实核心模块可以独立的work,但是不免它的能力偏弱,比如只能编码字符串类型、只能解码字符串类型,默认使用java.net.HttpURLConnection作为HC… 本篇将

    大文件分片合并上传 feign调用

    在大文件分片上传的场景中,Feign可以用来调用远程服务,将每个分片作为独立的请求发送。这种方式可以将文件上传的责任分散到不同的服务节点,提高系统的伸缩性和可靠性。 4. 文件合并: 在接收端,接收到所有分片...

    feign-demo.7z

    在本项目中,"feign-demo.7z"是一个压缩包文件,包含了使用Spring Cloud Feign实现服务调用的相关代码示例。Feign是Spring Cloud生态中的一个组件,主要用于简化微服务之间的RESTful API调用,它通过声明式的方式...

    从零开始学springcloud-Feign附带的示例代码

    这个教程将引导你从零开始学习如何使用Feign,并通过实际的示例代码来理解其工作原理。 首先,让我们理解SpringBoot和SpringCloud的基础。SpringBoot简化了创建独立的、生产级的基于Spring的应用程序的过程,而无需...

    feign-parent.rar

    3. **服务消费者与生产者**:"eureka-client"模块展示了服务消费者的实现,如何配置和使用Feign客户端,而"eureka-server"和"eureka-feign-client"则展示了服务生产者的角色。 4. **服务降级与熔断**:虽然在这个...

    springcloud+springboot+feign项目demo

    它通过内嵌式Servlet容器(如Tomcat或Jetty)和自动配置功能,使得创建独立的、生产级别的Java应用程序变得非常容易。在本项目中,Spring Boot被用作基础框架,负责启动、管理服务以及提供基础的依赖管理和配置。 *...

    Feign调用丢失Header的解决方案.docx

    这是因为Hystrix默认使用线程隔离策略,每个请求都会在一个独立的线程中执行,而Feign请求拦截器是在主线程中执行的。 #### 修改隔离策略为信号量模式 ```yaml hystrix.command.default.execution.isolation....

    Feign的最佳实践方式二

    1. 分离接口定义:为避免接口污染,推荐将Feign接口定义在一个独立的模块中,供多个微服务共同使用。 2. 异常处理:通过自定义`ErrorDecoder`,可以捕获并处理远程服务调用时可能出现的异常,提供友好的错误信息。 3...

    springboot+springcloud+eureka+ribbon/feign

    而使用Feign时,我们定义一个接口,接口方法上使用@FeignClient注解指定服务名,Feign会根据服务名从Eureka获取服务实例,并自动生成实现该接口的客户端代码。 总结来说,"springboot+springcloud+eureka+ribbon/...

    spring-cloud-user-feign.zip

    3. spring-cloud-user-service:这是用户服务的实现,作为一个独立的微服务,负责处理与用户相关的业务逻辑。它通常会注册到服务发现组件(如Eureka)上,以便其他服务能够通过服务名找到并调用它。服务内部可能包含...

    springcloud-eureka-feign-mybatis-seata.zip

    Feign的使用降低了客户端和服务之间交互的复杂性,提高了开发效率。 MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。它将...

    分布式集群springBoot+springCloud+Eureka+Feign.zip

    数据库方面,本项目使用的是MySQL,这是一种广泛使用的开源关系型数据库管理系统。由于描述中提到不涉及表数据操作,因此项目可能只包含了基本的数据库连接配置,但没有包含具体的数据库模型和操作。在实际运行时,...

    微服务整合Nacos,Feign

    Feign 可以与 Ribbon(Netflix 的客户端负载均衡器)和 Eureka(服务发现组件)结合使用,但在微服务生态中,它也可以很好地与 Nacos 结合。 将 Feign 与 Nacos 整合,可以实现以下功能: 1. **声明式服务调用**:...

    microservice_springmicroservices_feign_auth_

    标题 "microservice_springmicroservices_feign_auth_" 暗示了我们正在探讨一个使用Spring Microservices框架构建的微服务项目,其中包含了Feign客户端以及基本身份验证(Basic Auth)的功能。描述 "microservice-...

    springboot+eureka+feign.rar

    Feign可以与Ribbon(负载均衡器)和Hystrix(断路器)结合使用,为服务之间的通信提供熔断和降级策略,增强系统的容错能力。 **整合SpringBoot、Eureka和Feign** 在SpringBoot项目中整合Eureka和Feign,首先需要...

    微服务 : SpringCloud + Nacos + Feign

    微服务架构是现代软件开发中的一个热门话题,它提倡将大型单体应用分解为一系列小型、独立的服务,每个服务都可以独立开发、部署和扩展。在这个主题中,我们重点关注的是SpringCloud、Nacos以及Feign这三个关键组件...

    springcloud+eureka+ribbon+feign搭建 分布式项目.zip

    这个模块是用户服务的消费者,它使用Feign客户端来调用用户服务的提供者。通过Eureka获取用户服务的地址,Ribbon进行负载均衡,Feign则负责将HTTP请求封装和发送。 - **spring-cloud-order-service-provider** 这个...

    Spring cloud Feign 深度学习与应用详解

    Feign 整合了 Ribbon 负载和 Hystrix 熔断,可以不再需要显式地使用这两个组件。Feign 具有如下特性: * 可插拔的注解支持,包括 Feign 注解和 JAX-RS 注解 * 支持可插拔的 HTTP 编码器和解码器 * 支持 Hystrix 和...

    SpringCloud + SpringBoot + Nacos + feign +config整合测试.zip

    `nacos-consumer`、`nacos-config`和`nacos-feign`可能是项目中的三个微服务模块,分别代表消费者服务、配置服务和使用Feign的服务。`.idea`目录包含IDE的项目元数据,而`server`可能是一个或多个服务的运行实例。 ...

    分布式微服务例子:SpringBoot2.X+SpringCloud+SpringDataJPA+Consul+Feign+Swagger

    分布式微服务架构是一种现代软件开发方法,它将大型应用程序拆分为小型、独立的服务,每个服务都可以独立部署和扩展。在这个例子中,我们看到一个基于Spring Boot 2.x、Spring Cloud、Spring Data JPA、Consul、...

Global site tag (gtag.js) - Google Analytics