`

使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务

 
阅读更多
在spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端。我们可以使用JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client, Spring的RestTemplate。但是,用起来最方便、最优雅的还是要属Feign了。

Feign简介

Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。比如:

@Autowired
private AdvertGropRemoteService service; // 远程服务

public AdvertGroupVO foo(Integer groupId) {
    return service.findByGroupId(groupId); // 通过HTTP调用远程服务
}


开发者通过service.findByGroupId()就能完成发送HTTP请求和解码HTTP返回结果并封装成对象的过程.

Feign的定义

为了让Feign知道在调用方法时应该向哪个地址发请求以及请求需要带哪些参数,我们需要定义一个接口:
@FeignClient(name = "ea")  //  [A]
public interface AdvertGroupRemoteService {

    @RequestMapping(value = "/group/{groupId}", method = RequestMethod.GET) // [B]
    AdvertGroupVO findByGroupId(@PathVariable("groupId") Integer adGroupId) // [C]

    @RequestMapping(value = "/group/{groupId}", method = RequestMethod.PUT)
    void update(@PathVariable("groupId") Integer groupId, @RequestParam("groupName") String groupName)

A: @FeignClient用于通知Feign组件对该接口进行代理(不需要编写接口实现),使用者可直接通过@Autowired注入。

B: @RequestMapping表示在调用该方法时需要向/group/{groupId}发送GET请求。

C: @PathVariable与SpringMVC中对应注解含义相同。

Spring Cloud应用在启动时,Feign会扫描标有@FeignClient注解的接口,生成代理,并注册到Spring容器中。生成代理时Feign会为每个接口方法创建一个RequetTemplate对象,该对象封装了HTTP请求需要的全部信息,请求参数名、请求方法等信息都是在这个过程中确定的,Feign的模板化就体现在这里。

在本例中,我们将Feign与Eureka和Ribbon组合使用,@FeignClient(name = "ea")意为通知Feign在调用该接口方法时要向Eureka中查询名为ea的服务,从而得到服务URL。

Feign的Encoder、Decoder和ErrorDecoder

Feign将方法签名中方法参数对象序列化为请求参数放到HTTP请求中的过程,是由编码器(Encoder)完成的。同理,将HTTP响应数据反序列化为Java对象是由解码器(Decoder)完成的。

默认情况下,Feign会将标有@RequestParam注解的参数转换成字符串添加到URL中,将没有注解的参数通过Jackson转换成json放到请求体中。注意,如果在@RequetMapping中的method将请求方式指定为POST,那么所有未标注解的参数将会被忽略,例如:

@RequestMapping(value = "/group/{groupId}", method = RequestMethod.GET)
void update(@PathVariable("groupId") Integer groupId, @RequestParam("groupName") String groupName, DataObject obj);


此时因为声明的是GET请求没有请求体,所以obj参数就会被忽略。

在Spring Cloud环境下,Feign的Encoder*只会用来编码没有添加注解的参数*。如果你自定义了Encoder, 那么只有在编码obj参数时才会调用你的Encoder。对于Decoder, 默认会委托给SpringMVC中的MappingJackson2HttpMessageConverter类进行解码。只有当状态码不在200 ~ 300之间时ErrorDecoder才会被调用。ErrorDecoder的作用是可以根据HTTP响应信息返回一个异常,该异常可以在调用Feign接口的地方被捕获到。我们目前就通过ErrorDecoder来使Feign接口抛出业务异常以供调用者处理。

Feign的HTTP Client

Feign在默认情况下使用的是JDK原生的URLConnection发送HTTP请求,没有连接池,但是对每个地址会保持一个长连接,即利用HTTP的persistence connection 。我们可以用Apache的HTTP Client替换Feign原始的http client, 从而获取连接池、超时时间等与性能息息相关的控制能力。Spring Cloud从Brixtion.SR5版本开始支持这种替换,首先在项目中声明Apache HTTP Client和feign-httpclient依赖:
<!-- 使用Apache HttpClient替换Feign原生httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
        <dependency>
            <groupId>com.netflix.feign</groupId>
            <artifactId>feign-httpclient</artifactId>
            <version>${feign-httpclient}</version>
        </dependency>

然后在application.properties中添加:
feign.httpclient.enabled=true
总结

通过Feign, 我们能把HTTP远程调用对开发者完全透明,得到与调用本地方法一致的编码体验。这一点与阿里Dubbo中暴露远程服务的方式类似,区别在于Dubbo是基于私有二进制协议,而Feign本质上还是个HTTP客户端。如果是在用Spring Cloud Netflix搭建微服务,那么Feign无疑是最佳选择。
分享到:
评论

相关推荐

    使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务的方法(推荐)

    Feign是Spring Cloud中一个非常重要的组件,它作为一个声明式的HTTP客户端,使得调用远程服务如同调用本地方法一样简单。Feign简化了微服务之间的通信,提供了更加直观的编程模型,极大地提升了开发效率。 首先,...

    spring cloud feign实现远程调用服务传输文件的方法

    Spring Cloud Feign 是一个基于 Java 的声明式 RESTful 客户端,提供了一种简单、可靠的方式来调用远程服务。在本文中,我们将介绍如何使用 Spring Cloud Feign 实现远程调用服务传输文件的方法。 Feign 介绍 ...

    springcloud feign服务间的相互调用.doc

    Spring Cloud Feign 是一个基于 annotations 的声明式 RESTful 客户端,它提供了对服务间调用的一种简单而高效的解决方案。在本文中,我们将基于 Spring Cloud Feign来实现服务间的相互调用。 首先,让我们来创建一...

    Spring Cloud Feign统一设置验证token实现方法解析

    Feign组件是一个基于Annotation的接口调用方式,它可以将远程服务调用转换为本地方法调用,使得微服务之间的调用变得更加简洁和高效。在Feign组件中,我们可以使用RequestInterceptor来实现请求的拦截和处理。在这里...

    springcloud feign 服务消费者 类似 webservice

    Spring Cloud Feign是Spring Cloud生态系统中的一个组件,它作为一个声明式的服务调用客户端,使得编写Web服务客户端变得简单。Feign的设计灵感来源于Netflix的Feign库,它的主要目的是简化微服务之间的通信,使得...

    微服务springcloud之feign使用demo

    同时为了能够使用和Spring Web中默认使用的相同的httpMessageConverter,SpringCloud集成了Ribbon和Eureka,用来在使用Feign时能够为其提供一个负载均衡的HTTP客户端,大神必备神器,导入即用,无需更改配置!

    spring cloud feign方式使用服务

    【Spring Cloud Feign服务使用详解】 在分布式系统中,服务间的通信是至关重要的,Spring Cloud Feign就是一种声明式的服务调用工具,它使得服务之间的调用变得简单且直观。Feign是Netflix开源的一个接口绑定工具,...

    springcloud-alibaba服务注册发现整合feign:webflux调用

    本文将深入探讨如何在 Spring Cloud Alibaba 环境下,整合 Feign 实现服务间的 WebFlux 调用。WebFlux 是 Spring Framework 5.0 引入的一种响应式编程模型,适用于低延迟、高并发场景。 首先,让我们了解服务注册与...

    spring cloud feign demo

    Spring Cloud Feign 是一个声明式的 Web 服务客户端,它使得编写 Web 服务客户端变得简单。Feign 让消费者能够以一种声明式的方式定义接口,这些接口将被自动映射到 HTTP 请求。它整合了 Ribbon 和 Eureka,可以方便...

    springcloud feign整合hystrix(服务降级).doc

    在Spring Cloud微服务架构中,Feign和Hystrix是两个重要的组件,它们协同工作以实现服务间的调用和容错处理。Feign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得简单,而Hystrix则是一个用于处理延迟和...

    【云原生】Spring Cloud Alibaba 之 Feign 远程调用 实战 【源码】

    6. 服务提供者:在服务提供者的启动类上添加`@EnableFeignClients`注解,表示该服务可以被其他服务通过Feign调用。同时,服务提供者也需要注册到Nacos集群,以便服务消费者发现。 在实际开发中,我们还可以利用...

    SpringCloud——声明性REST客户端(Feign)

    【SpringCloud——声明性REST客户端(Feign)】 在分布式微服务架构中,服务之间的通信是至关重要的。Spring Cloud提供了一种优雅的方式,通过Feign客户端来实现这一目标。Feign是一个声明式的Web服务客户端,它...

    第五章 SpringCloud 使用Feign调用服务.pdf

    在SpringCloud框架中,Feign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得简单。Feign的设计目标是让微服务之间的调用更加优雅,它通过注解和接口的方式,使得客户端调用服务就像调用本地方法一样简单...

    spring cloud 整合Feign经行远程调用

    spring cloud 整合Feign经行远程调用

    SpringCloud-创建服务消费者-Feign方式示例代码.zip

    在这个名为"SpringCloud-创建服务消费者-Feign方式示例代码.zip"的压缩包中,我们预计将看到一个简单的Spring Cloud应用,该应用展示了如何利用Feign作为服务消费者来调用其他服务。 首先,让我们了解Feign的基本...

    《深入理解Spring Cloud与微服务构建》学习笔记(十二)~写一个Feign客户端

    在本篇学习笔记中,我们将深入探讨如何在Spring Cloud框架下构建一个Feign客户端,用于在微服务架构中实现服务间的远程调用。Feign是一个声明式的Web服务客户端,它使得编写HTTP客户端变得简单,而Spring Cloud对...

    使用Spring Cloud Feign远程调用的方法示例

    在Spring Cloud生态系统中,Spring Cloud Feign是一个重要的组件,它为开发者提供了声明式的Web服务客户端功能,使得构建微服务间的通信变得更加简洁。Feign通过模仿使用API的方式,将HTTP请求的定义与服务调用的...

    SpringCloud之Feign

    综上所述,SpringCloud Feign作为Spring Cloud生态中的重要组件,通过声明式API简化了服务间的调用,结合Hystrix提供了强大的容错能力。开发者只需要关注业务逻辑,无需关心底层通信细节,提高了开发效率和系统稳定...

    75-Spring Cloud Feign使用笔记1

    Spring Cloud Feign 是一个声明式客户端,用于简化微服务之间的通信,它通过接口定义远程调用的 API。在本文中,我们将深入探讨如何使用 Feign,并了解其与 Spring Cloud 结合的工作原理。 首先,要在主应用类中...

    Spring Cloud 之 Eureka集群整合Zuul、Feign-源码

    在实际开发中,还需要考虑安全、性能优化等因素,例如使用Ribbon进行客户端负载均衡,添加Hystrix熔断机制以防止服务雪崩,以及使用Spring Cloud Gateway替换Zuul以获取更多高级特性。 总之,通过Eureka集群实现...

Global site tag (gtag.js) - Google Analytics