当前位置: 首页 > 编程笔记 >

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

司徒隐水
2023-03-14
本文向大家介绍spring cloud 之 Feign 使用HTTP请求远程服务的实现方法,包括了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请求远程服务的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍SpringCloud使用Feign实现服务调用,包括了SpringCloud使用Feign实现服务调用的使用技巧和注意事项,需要的朋友参考一下 Spring Cloud Feign简介 Spring Cloud Feign也是一个基础工具类,它整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能以外,它还提供了一种声明式的

  • 主要内容:1. 概述,2. AbstractProxyProtocol,3. HttpProtocol1. 概述 基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现 涉及类图(红圈部分)如下: 2. AbstractProxyProtocol 现 AbstractProtocol 抽象类,Proxy 协议抽象类。为 HttpProtocol 、RestProtocol 等子类,提供公用的服务暴露、服务引用的公用方法,同时定义了如下抽象方法,用于不同子类协议实

  • 本文向大家介绍SpringCloud之Feign示例详解,包括了SpringCloud之Feign示例详解的使用技巧和注意事项,需要的朋友参考一下 Feign简介 Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cl

  • 我们正在尝试将Spring Cloud Netflix投入生产环境。目前,我们遇到了一个关于业务逻辑错误处理的问题。 我们使用Feign作为HTTP REST客户端。微服务A需要调用部署在不同JVM(或物理服务器)中的微服务B。微服务B可能会返回一些属于业务的错误消息。例如,A需要从B查询订单信息,但订单ID可能不存在,因此B必须返回错误消息,告诉A此订单不存在。A必须从返回消息中执行判断,以确定

  • Python 的标准库 urllib 提供了大部分 HTTP 功能,但使用起来较繁琐。通常,我们会使用另外一个优秀的第三方库:Requests,它的标语是:Requests: HTTP for Humans。 Requests 提供了很多功能特性,几乎涵盖了当今 Web 服务的需求,比如: 浏览器式的 SSL 验证 身份认证 Keep-Alive & 连接池 带持久 Cookie 的会话 流下载

  • 主要内容:1.概述,2.ExchangeHandler,3. Codec1.概述 本文涉及类图如下: 2.ExchangeHandler 在 DubboProtocol 中,实现了 ExchangeHandler ,代码如下: 3. Codec 实现 Codec2 接口,支持多消息的编解码器。 3.1 DubboCountCodec 3.2 DubboCodec 实现 Codec2 接口,继承 ExchangeCodec 类,Dubbo 编解码器实现类。 构造方法 3