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

发布时间 - 2026-01-11 01:53:25    点击率:

一、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请求远程服务的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# spring  # cloud  # Feign  # 使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务的方法(推荐)  # SpringCloudAlibaba整合Feign实现远程HTTP调用的简单示例  # @FeignClient 实现简便http请求封装方式  # 自定义  # 客户端  # 记录器  # 给大家  # 这将  # 创建一个  # 配置文件  # 都是  # 这是  # 在这里  # 是一种  # 在这个  # 首次  # 将会  # 不需要  # 推荐使用  # 我们可以  # 希望能  # 可以使用  # 为例 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Laravel如何实现文件上传和存储?(本地与S3配置)  MySQL查询结果复制到新表的方法(更新、插入)  Java垃圾回收器的方法和原理总结  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  Laravel如何处理表单验证?(Requests代码示例)  jQuery中的100个技巧汇总  微信h5制作网站有哪些,免费微信H5页面制作工具?  Android 常见的图片加载框架详细介绍  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  nginx修改上传文件大小限制的方法  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  成都网站制作公司哪家好,四川省职工服务网是做什么用?  想要更高端的建设网站,这些原则一定要坚持!  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  如何在宝塔面板中修改默认建站目录?  简历在线制作网站免费版,如何创建个人简历?  如何正确下载安装西数主机建站助手?  北京企业网站设计制作公司,北京铁路集团官方网站?  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  三星网站视频制作教程下载,三星w23网页如何全屏?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  高性能网站服务器配置指南:安全稳定与高效建站核心方案  中国移动官方网站首页入口 中国移动官网网页登录  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  如何在 Pandas 中基于一列条件计算另一列的分组均值  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Laravel集合Collection怎么用_Laravel集合常用函数详解  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  深入理解Android中的xmlns:tools属性  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  在centOS 7安装mysql 5.7的详细教程  EditPlus中的正则表达式 实战(1)  高防服务器:AI智能防御DDoS攻击与数据安全保障  高端网站建设与定制开发一站式解决方案 中企动力  Laravel如何实现事件和监听器?(Event & Listener实战)  微信小程序 wx.uploadFile无法上传解决办法  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  如何用美橙互联一键搭建多站合一网站?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Python正则表达式进阶教程_复杂匹配与分组替换解析