文档章节

Spring Cloud 声明式REST 客户端-Feign

jurson86
 jurson86
发布于 2017/08/25 14:48
字数 1118
阅读 47
收藏 0
点赞 0
评论 0

一、  什么是 Feign? 

Feign 是一种声明式、模板化的 HTTP 客户端,在 Spring Cloud 中使用 Feign,可以做到使用 HTTP
请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是
个 HTTP 请求。 
Feign 的灵感来源于Retrofit、JAXRS-2.0 和 WebSocket,它使得 Java HTTP 客户端编写更方便,
旨在通过最少的资源和代码来实现和 HTTP API 的连接。 
   


二、 引入 jar  

<dependency> 
<groupId>org.springframework.cloud</groupId> 
<artifactId>spring-cloud-starter-feign</artifactId> 
</dependency> 
说明:里面的 jar 包含有spring-cloud-starter-Ribbon,是基于 Ribbon 来实现的 
 

三、  使用 

1、 加入注解 
@EnableFeignClients 
说明:这个是开启 Feign 注解 

让 Spring 扫描到@FeignClient 注解,可以设置:@EnableFeignClients(basePackages = "包名") 

@EnableCircuitBreaker
@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public class ConsumerApplication {

	public static void main(String[] args) {
		SpringApplication.run(ConsumerApplication.class, args);
	}
}


2、 添加 IuserBiz 接口类 

import org.springframework.cloud.netflix.feign.FeignClient; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
 

@FeignClient(value = "spring-cloud-provider") 
public interface IUserBiz { 
  /** 
   * @return 
   */ 
  @RequestMapping(value = "/api/user/{id}", method = RequestMethod.GET) 
  String view(@PathVariable(value = "id") int id); 
} 

3、方法请求 

@RestController 
@RequestMapping(value = "/feign/user", method = RequestMethod.POST) 
public class FeignUserController { 
 
  @Autowired 
  private IUserBiz userBiz; 
 
  @RequestMapping(value = "/{id}", method = RequestMethod.GET) 
  public String get(@PathVariable(value = "id") int id) { 
    return userBiz.view(id); 
  } 
} 

 

四、  姿势说明 

1、 关于@PathVariable 
说明:使用@PathVariable 注解的时候,必须要定义里面的 value 或者 name 
比如:@PathVariable(value = "id")或者@PathVariable(name = "id") 
 
@RequestMapping(value = "/api/user/{id}", method = RequestMethod.GET) 
String view1(@PathVariable(name = "id") int id); 
 

2、 返回类型 
说明:可以有多种返回形式 
 
@RequestMapping(value = "/api/user/{id}", method = RequestMethod.GET) 
Map<String, Object> view2(@PathVariable(value = "id") int id); 
 
@RequestMapping(value = "/api/user/{id}", method = RequestMethod.GET) 
User view3(@PathVariable(value = "id") int id); 
 

3、 传参的问题-没有加@RequestParam 注解的情况下 
说明:请求类型将变为 post(即使指定为 get,也变为 post),将通过 Jackson 转换成json 放到请求体
中,存在一个没有带注解的参数 【存放请求body的内容】
@RequestMapping(value = "/api/user/get/{id}", method = RequestMethod.GET) 
User get1(@PathVariable(value = "id") int id, String name); 
 
@RequestMapping(value = "/api/user/get/{id}", method = RequestMethod.GET) 
User get2(@PathVariable(value = "id") int id, Map<String, Object> name); 

4、 传参的问题-有@RequestParam 注解的情况下  
说明:不指定的 value 的情况下:必须是 Map 的形式,会将其参数转换成键值的形式添加到 URL 中 ,指
定 value 的情况下:按照value 传值 
 
// 不支持该方式传值,启动出错。 
//@RequestMapping(value = "/api/user/get/{id}", method = RequestMethod.GET) 
//User get3(@PathVariable(value = "id") int id, @RequestParam String name); 
 
@RequestMapping(value = "/api/user/get/{id}", method = RequestMethod.GET) 
User get4(@PathVariable(value = "id") int id, @RequestParam Map<String, Object> name); 
 
@RequestMapping(value = "/api/user/get/{id}", method = RequestMethod.GET) 
User get5(@PathVariable(value = "id") int id, @RequestParam(value = "name") String name); 

 

五、高级配置说明

一、  Feign 的默认配置 


Spring Cloud Netflix 提供的默认实现类:FeignClientsConfiguration 
解码器:Decoder feignDecoder: ResponseEntityDecoder (which wraps a SpringDecoder) 
编码器:Encoder feignEncoder: SpringEncoder 
日志框架:Logger feignLogger: Slf4jLogger 
契约:Contract feignContract: SpringMvcContract 
生成器:Feign.Builder feignBuilder: HystrixFeign.Builder 
 
说明: 
解码器的作用:将 HTTP 响应数据反序列化为 Java 对象 
编码器的作用:将方法签名中方法参数对象序列化为请求参数放到 HTTP 请求中 

 

二、  自定义配置 

 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
 
import feign.Contract; 
 
// @Configuration  //配置Configuration 如被 SpringContext 扫描,否则会被@FeignClien 共用,会覆盖。 
public class RcFeignConfiguration { 
   
} 

配置 FeignClient: 
@FeignClient(value = "spring-cloud-provider", configuration = RcFeignConfiguration.class) 

 

三、  日志配置 

 

# 日志配置,默认是不打印任何的日志 
logging.level.com.hlian.education.feign.IUserBiz=debug 
 
需要在配置类里面添加以下代码 
@Bean 
    public Logger.Level feignLoggerLevel() { 
        return feign.Logger.Level.FULL; 

 
  说明:四种级别 

NONE:默认,不打印任何日志 
BASIC:打印请求方法和 URL,和请求返回状态码和执行时间。 
HEADERS:打印请求和返回的头部信息。 
FULL:打印以上的全部信息。 

 

四、  契约配置  [少用] RequestLine


1、在配置类里面添加以下代码 

@Bean 
public Contract feignContract() { 
  return new feign.Contract.Default(); 

 
2、修改 IuserBiz 类 

@RequestLine("GET /api/user/{id}") 
String view1(@Param(value = "id") int id); 

 

五、  支持压缩 


# 开启压缩 
feign.compression.request.enabled=true 
feign.compression.response.enabled=true 
# 更多配置 
feign.compression.request.mime-types=text/xml,application/xml,application/json 
feign.compression.request.min-request-size=2048 

 

六、  URL属性配置 

定义了 url 之后,vaule 为必选值,这时的 value 只是一个标识,直接跳转到对应url地址

@FeignClient(value = "hlian", url = "www.baidu.com") 
public interface IRoncooBiz { 
@RequestMapping(value = "/{url}", method = RequestMethod.GET) 
String get(@PathVariable(name = "url") String url); 
 
} 
 

 

七、  支持继承 


1、定义一个普通接口 

public interface UserService { 
 
  @RequestMapping(method = RequestMethod.GET, value = "/api/user/find/{id}") 
  User find(@PathVariable(value = "id") int id); 
} 
 

2、实现接口 

@RestController 
public class FeignApiUserController implements UserService { 
 
  protected final Logger logger = LoggerFactory.getLogger(this.getClass()); 
 
  @Override 
  public User find(@PathVariable int id) { 
    User user = new User(); 
    user.setId(id); 
    user.setName("aabbcc"); 
    user.setCreateTime(new Date()); 
    logger.info("请求接口返回:{}", user); 
    return user; 
  } 
 
} 

 

说明:springmvc 里面不支持方法参数映射的继承 
 
3、继承 
public interface IUserBiz extends UserService{ 
  // … 

 

 

 

© 著作权归作者所有

共有 人打赏支持
jurson86
粉丝 2
博文 246
码字总数 242323
作品 0
深圳
个人站长
疯狂Spring Cloud连载(11)——Feign的编码器与解码器

本文节选自《疯狂Spring Cloud微服务架构实战》 京东购买地址:https://item.jd.com/12256011.html 当当网购买地址:http://product.dangdang.com/25201393.html Spring Cloud教学视频:htt...

杨大仙的程序空间
2017/10/23
0
4
Spring Cloud学习:02服务消费者(Ribbon&Feign)

在微服务架构中,业务会拆分成一个独立的服务,服务与服务之间基于http restful进行通信。Spring Cloud有两种服务调用方式,一种是Ribbon+restTemplate,另一种是Feign。 1 Ribbon+restTempl...

寒武没有纪
2017/10/21
0
0
疯狂Spring Cloud连载(10)——Rest客户端Feign介绍

本文节选自《疯狂Spring Cloud微服务架构实战》 京东购买地址:https://item.jd.com/12256011.html 当当网购买地址:http://product.dangdang.com/25201393.html Spring Cloud教学视频:htt...

杨大仙的程序空间
2017/10/19
0
3
springCloud(9):使用Feign实现声明式REST调用-为消费者整合Feign与自定义Feign配置

一、简介 前面我们是使用RestTemplate实现rest api调用的,代码如下: @GetMapping("/user/{id}")public User findById(@PathVariable Long id) throws Exception { return this.restTempla......

我爱大金子
2017/07/17
0
0
疯狂Spring Cloud连载(14)Spring Cloud整合Feign

本文节选自《疯狂Spring Cloud微服务架构实战》 京东购买地址:https://item.jd.com/12256011.html 当当网购买地址:http://product.dangdang.com/25201393.html Spring Cloud教学视频:htt...

杨大仙的程序空间
2017/10/29
0
2
spring cloud 建一个服务消费者client-feign(最好用这种方式)

Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign默认集成了Ribbon,...

lsjlgo
05/28
0
0
java 电子商务云平台b2b b2c o2o springmvc+mybatis+spring cloud+spring boot

大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B、B2C、C2C、O2O、新零售、直播电商等子平台。 技术解决方案 开发语言: java、j2ee 数据库:mysql J...

SpringCloud关注者
2017/10/23
0
0
java电子商务系统源码 Spring MVC+mybatis+spring cloud+spring boot+spring security

鸿鹄云商大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B、B2C、C2C、O2O、新零售、直播电商等子平台。 分布式、微服务、云架构电子商务平台 java b...

SpringCloud关注者
2017/10/23
0
0
《Spring Cloud Netflix官方文档》7.声明式 REST 客户端: Feign

原文链接 Feign 是一个声明式的web服务客户端。它使得编写web服务客户端更简单,创建一个接口并加上注解就能使用Feign了,它还支持JAX-RS类型的注解,可插入式的编码和解码,Spring cloud 为他...

floder
2017/01/05
0
0
Spring Cloud--Honghu Cloud分布式微服务云系统—组件化

Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的。在学习Spring Cloud之前大家必...

itcloud
04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
今天
0
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
1
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
0
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部