一、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请求远程服务的更多相关文章

  1. spring cloud 使用feign 遇到问题

    spring cloud 使用feign 项目的搭建 在这里就不写了,本文主要讲解在使用过程中遇到的问题以及解决办法 1:示例 @RequestMapping(value = "/gener ...

  2. Spring Cloud 整合 Feign 的原理

    前言 在 上篇 介绍了 Feign 的核心实现原理,在文末也提到了会再介绍其和 Spring Cloud 的整合原理,Spring 具有很强的扩展性,会把一些常用的解决方案通过 starter 的方式 ...

  3. spring cloud(四) feign

    spring cloud 使用feign进行服务间调用 1. 新建boot工程 pom引入依赖 <dependency> <groupId>org.springframewor ...

  4. spring cloud关于feign client的调用对象列表参数、设置header参数、多环境动态参数试配

    spring cloud关于feign client的调用 1.有些场景接口参数需要传对象列表参数 2.有些场景接口设置设置权限等约定header参数 3.有些场景虽然用的是feign调用,但并不会走 ...

  5. 解决Spring Cloud中Feign第一次请求失败的问题

    在Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题 com.netflix.hystrix.exception.HystrixTimeoutE ...

  6. Spring Cloud 之 Feign

    新建Spring Boot工程,命名为feign 1.pom.xml添加依赖 <?xml version="1.0" encoding="UTF-8"?& ...

  7. Spring Cloud中Feign如何统一设置验证token

    代码地址:https://github.com/hbbliyong/springcloud.git 原理是通过每个微服务请求之前都从认证服务获取认证之后的token,然后将token放入到请求头中带过 ...

  8. Spring Cloud 组件 —— feign

    feign 作为一个声明式的 Http Client 开源项目.在微服务领域,相比于传统的 apache httpclient 与在 spring 中较为活跃的 RestTemplate 更面向服务化 ...

  9. spring cloud 之 Feign的使用

    1.添加依赖 2.创建FeignClient 原理:Spring Cloud应用在启动时,Feign会扫描标有@FeignClient注解的接口,生成代理,并注册到Spring容器中.生成代理时Fei ...

随机推荐

  1. oauth2-server-php-docs 概念

    PHP的OAuth2服务器库 将OAuth2.0干净地安装到您的PHP应用程序中. 从GitHub 下载代码开始. 要求 这个库需要PHP 5.3.9+.然而,有一个稳定的版本和开发分支的PHP 5. ...

  2. 【Python】torrentParser1.00

    代码: #------------------------------------------------------------------------------------ # torrentP ...

  3. Linux网络编程:基于TCP的程序开发回顾篇《转》

    面向连接的TCP程序设计 基于TCP的程序开发分为服务器端和客户端两部分,常见的核心步骤和流程: 其实按照上面这个流程调用系统API确实可以完全实现应用层程序的开发,一点问题没有.可随着时间的推移,你 ...

  4. asp.net 定时执行任务代码 定时采集数据

    using System; using System.Data; using System.Configuration; using System.Collections; using System. ...

  5. linux2.6.30.4内核移植(4)——完善串口驱动

    在内核里支持两个串口,也就是芯片的UART0和UART1,而UART2的驱动是针对红外接口的,而不是串口驱动,这里将其修改为串口驱动. 一.修改内核源码arch/arm/mach-s3c2440/ma ...

  6. kafka文档(转)

    来自:http://www.inter12.org/archives/842 一 BROKER 的全局配置 最为核心的三个配置 broker.id.log.dir.zookeeper.connect ...

  7. SqlDataAdapter概述

    SqlDataAdapter是 DataSet和 SQL Server之间的桥接器,用于检索和保存数据.SqlDataAdapter通过对数据源使用适当的Transact-SQL语句映射 Fill(它 ...

  8. 写带有清晰图片的博客:如何将word中的图片复制到windows live writer保持大小不变--清晰度不变

    写blog的习惯,先在word写了,复制到windows live writer,再发布到博客园.word中的文章,图片有缩放比例,复制到windows live writer后图片变得不清晰.除了一 ...

  9. Linux内核中的软中断、tasklet和工作队列具体解释

    [TOC] 本文基于Linux2.6.32内核版本号. 引言 软中断.tasklet和工作队列并非Linux内核中一直存在的机制,而是由更早版本号的内核中的"下半部"(bottom ...

  10. log4j的详细配置(最省心完美配置)

    先说下我的需求 1,可以记录日记在我们的java开发项目周期中: 2,很简单即可输出日志: 3,每天按照时间将不同的日志输出到不同的文件中,每天输出日志到一个带有当前时间戳的文件中: 4,可以修改当前 ...