spring cloud 之 Feign 使用HTTP请求远程服务的实现方法

一、Feign 简介

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

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

二、feign的使用在spring cloud中的使用

1、添加依赖

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

2、创建FeignClient 

@FeignClient(name="SPRING-PRODUCER-SERVER/spring")
public interface FeignUserClient {
 @RequestMapping( value = "/findAll/{name}",method = RequestMethod.GET)
 public List<SpringUser> findAll(@PathVariable("name") String name);

 @RequestMapping( value = "/findUserPost",method = RequestMethod.POST)
 public SpringUser findUserPost(@RequestBody SpringUser springUser);//复合类型好像默认是POST请求
}

@FeignClient(name="SPRING-PRODUCER-SERVER/spring"):用于通知Feign组件对该接口进行代理(不需要编写接口实现),name属性指定我们要调用哪个服务。使用者可直接通过@Autowired注入。

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

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

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

3、启动类上添加注解

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableEurekaClient
@EnableFeignClients
public class SpringConsumerServerFeignApplication {
  public static void main(String[] args) {
    SpringApplication.run(SpringConsumerServerFeignApplication.class, args);
  }
}

4、配置文件 application.yml

spring:
 application:
 name: spring-consumer-server-feign
server:
 port: 8084
 context-path: /spring
#服务注册中心的配置内容,指定服务注册中心的位置
eureka:
 client:
 serviceUrl:
  defaultZone: http://user:password@localhost:8761/eureka/

三、自定义Feign的 配置

1、自定义Configuration

@Configuration
public class FooConfiguration {
  @Bean
  public Contract feignContract() {
    //这将SpringMvc Contract 替换为feign.Contract.Default
    return new feign.Contract.Default();
  }
}

2、使用自定义的Configuration

@FeignClient(name="SPRING-PRODUCER-SERVER/spring",configuration=FooConfiguration.class)
public interface FeignUserClient {
  @RequestLine("GET /findAll/{name}")
  public List<SpringUser> findAll(@Param("name") String name);
 /* @RequestMapping( value = "/findAll/{name}",method = RequestMethod.GET)
 public List<SpringUser> findAll(@PathVariable("name") String name);

 @RequestMapping( value = "/findUserPost",method = RequestMethod.POST)
 public SpringUser findUserPost(@RequestBody SpringUser springUser);*/
}

@RequestLine:是feign的注解

四、Feign日志的配置

为每个创建的Feign客户端创建一个记录器。默认情况下,记录器的名称是用于创建Feign客户端的接口的完整类名。Feign日志记录仅响应DEBUG级别。logging.level.project.user.UserClient: DEBUG

在配置文件application.yml 中加入:

logging:
 level:
 com.jalja.org.spring.simple.dao.FeignUserClient: DEBUG 

在自定义的Configuration的类中添加日志级别

@Configuration
public class FooConfiguration {
  /* @Bean
  public Contract feignContract() {
    //这将SpringMvc Contract 替换为feign.Contract.Default
    return new feign.Contract.Default();
  }*/
  @Bean
  Logger.Level feignLoggerLevel() {
    //设置日志
    return Logger.Level.FULL;
  }
}

PS:Feign请求超时问题

Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入fallback代码。而首次请求往往会比较慢(因为Spring的懒加载机制,要实例化一些类),这个响应时间可能就大于1秒了

解决方案有三种,以feign为例。

方法一

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000

该配置是让Hystrix的超时时间改为5秒

方法二

hystrix.command.default.execution.timeout.enabled: false

该配置,用于禁用Hystrix的超时时间

方法三

feign.hystrix.enabled: false

该配置,用于索性禁用feign的hystrix。该做法除非一些特殊场景,不推荐使用。

以上这篇spring cloud 之 Feign 使用HTTP请求远程服务的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决Spring Cloud中Feign/Ribbon第一次请求失败的方法

    前言 在Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入fallback代码.而首次请求往往会比较慢(因为Spring的懒加载机制,要实例化一些类),这个响应时间可能就大于1秒了.知道原因后,我们来总结一下解决放你. 解决方案有三种,以feign为例. 方法一 hystrix.command.default.execution.

  • Spring Cloud中关于Feign的常见问题总结

    一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user") public interface UserFeignClient { @RequestMapping(value = "/simple/{id}", method = RequestMethod.GET) public User findById(@PathVariable(&quo

  • spring cloud 之 Feign 使用HTTP请求远程服务的实现方法

    一.Feign 简介 在spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Apache的Http Client.Netty的异步HTTP Client, Spring的RestTemplate.但是,用起来最方便.最优雅的还是要属Feign了. Feign是一种声明式.模板化的HTTP客户端.在Spring Cloud中使用Feign, 我们可以做到使用

  • Spring Cloud使用Feign实现Form表单提交的示例

    之前,笔者写了<使用Spring Cloud Feign上传文件>.近日,有同事在对接遗留的Struts古董系统,需要使用Feign实现Form表单提交.其实步骤大同小异,本文附上步骤,算是对之前那篇的补充. 添加依赖: <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <version>

  • spring cloud oauth2 feign 遇到的坑及解决

    目录 springcloudoauth2feign遇到的坑 客户端模式 基于springsecurity springcloud微服务增加oauth2权限后feign调用报null 一般是这样实现的 spring cloud oauth2 feign 遇到的坑 关于oauth2相关的内容这里不重复描述,在spring cloud中在管理内部api时鉴权相信有很多人会有疑问,这里描述两种比较low的用法,由于公司内部使用的是阿里云edas这里仅仅是记录一下,如果有更好的用法在请赐教,不喜勿喷! 客

  • Spring Cloud详解实现声明式微服务调用OpenFeign方法

    目录 OpenFeign介绍 项目实战 创建项目 启动项目验证 总结 OpenFeign介绍 一开始,我们使用原生的 DiscoveryClient 发现服务和使用RestTemplate进行服务间调用,然后我们自己手动开发了一个负载均衡组件,最后介绍了负载均衡组件Ribbon.每个章节调用服务的方式也有所不同,共同点则是都是基于RestTemplate 来实现的,想必大家都会觉得这样的调用方式有点麻烦,每次调用前都要写请求协议,服务名称,接口名称.组装参数.处理响应数据类型,这些都是一些重复的

  • 详解Spring cloud使用Ribbon进行Restful请求

    写在前面 本文由markdown格式写成,为本人第一次这么写,排版可能会有点乱,还望各位海涵.  主要写的是使用Ribbon进行Restful请求,测试各个方法的使用,代码冗余较高,比较适合初学者,介意轻喷谢谢. 前提 一个可用的Eureka注册中心(文中以之前博客中双节点注册中心,不重要) 一个连接到这个注册中心的服务提供者 一个ribbon的消费者 注意:文中使用@GetMapping.@PostMapping.@PutMapping.@DeleteMapping等注解需要升级 spring

  • spring cloud gateway中如何读取请求参数

    spring cloud gateway读取请求参数 1. 我的版本: spring-cloud:Hoxton.RELEASE spring-boot:2.2.2.RELEASE spring-cloud-starter-gateway 2. 请求日志 import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springfram

  • spring cloud中Feign导入jar失败的问题及解决方案

    目录 Feign导入jar失败的问题 网上很多人在使用的feign时在pom.xml中填写的是 用以下的方式也能够完美导入feign Springcloudfeign异常报错及解决 报错异常如下 这里是我报错前的代码 改造后 Feign导入jar失败的问题 网上很多人在使用的feign时在pom.xml中填写的是    <dependency>        <groupId>org.springframework.cloud</groupId>        <

  • Spring Cloud如何使用Feign构造多参数的请求

    本节我们来探讨如何使用Feign构造多参数的请求.笔者以GET以及POST方法的请求为例进行讲解,其他方法(例如DELETE.PUT等)的请求原理相通,读者可自行研究. GET请求多参数的URL 假设我们请求的URL包含多个参数,例如http://microservice-provider-user/get?id=1&username=张三 ,要如何构造呢? 我们知道,Spring Cloud为Feign添加了Spring MVC的注解支持,那么我们不妨按照Spring MVC的写法尝试一下:

  • spring cloud feign不支持@RequestBody+ RequestMethod.GET报错的解决方法

    1.问题梳理: 异常:org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported 很明显是最终feign执行http请求时把这个方法认定为POST,但feign client中又定义了RequestMethod.GET 或 @GetMapping,冲突导致报错 那么为什么feign会认为这个方法是post呢? 源码追踪: 1.我们从feignClient注解

随机推荐