spring cloud feign的基本使用
在上一节,我们学会了如何使用ribbon进行来进行服务之间的调用,但是那种需要通过RestTemplate来进行调用而且当参数比较多时,使用起来就比较麻烦。那么有没有一种调用远程方法(别的服务)就像调用本地方法呢?feign就是这样的一种声明式的http客户端,使调用远程方法就像调用本地方法一样。
前置条件-工程的创建
eureka-server
|- 服务注册中心
feign
product-provider-8083
product-provider-8084
|- 服务提供者
product-consumer-8082
|- 服务消费者,使用feign进行调用(演示Feign调用各种方法的参数)
需求:
1、使用feign完成基本的curd操作
2、使用feign调用各种传参的方法,比如传递对象,传递map,同时传递多个参数等
实现步骤:
1、新建服务提供者:
product-provider-8083和product-provider-8084,就是一个普通的spring boot工程,对外暴露基本的crud api.
2、新建服务提供者
product-consumer-8082
|- 启动类上增加 @EnableFeignClients 注解
|- client接口上需要增加 @FeignClient(name="上面product-provider-%d工程中的spring.application.name的值") 注解
3、@FeignClient注解下的方法注意事项:
1、@PathVariable注解的使用
使用这个注解的使用,必须要写里面的name或value的值,即@PathVariable("field"),不写启动报错
2、返回值可以返回实体类或Map类型等等
3、@RequestParam注解传递参数的问题
|- 不存在@RequestParam注解
>> 请求类型将会变成post请求,即使你在方法上指定为get也不行。这个时候可以存在一个没有带注解的参数
** 示例:
1、 @GetMapping("product/selectByProductIdAndName")
Map<String, Object> selectByProductIdAndNameMap(Map<String, Object> params);
结果:此时是post请求,即使上方加上了@GetMapping注解也会是发送post请求
2、 @GetMapping("product/selectByProductIdAndName")
Map<String, Object> selectByProductIdAndName(String productId, String productName)
结果:程序启动报错,因为存在多个参数没有@RequestParam注解
|- 存在@RequestParam注解
>> 不指定value的情况下,必须加载Map类型的参数上,里面的值会附加在url后面
** 示例:
1、 @GetMapping("product/selectByProductIdAndName")
Map<String, Object> selectByProductIdAndNameMap(@RequestParam Map<String, Object> params);
结果:没有指定value,注解加载map类型的参数上
2、 @GetMapping("product/selectByProductIdAndName")
Map<String, Object> selectByProductIdAndName(@RequestParam String productId, String productName);
结果:启动报错,没有指定value的值,且参数不是map类型
3、 @GetMapping("product/selectByProductIdAndName")
Map<String, Object> selectByProductIdAndName(@RequestParam("productId") String productId, String productName);
结果:由于后面有一个参数没有加上@RequestParam注解,此时这个请求就变成了post请求发送,即使申明的是get请求
4、 @GetMapping("product/selectByProductIdAndName")
Map<String, Object> selectByProductIdAndName(@RequestParam("productId") String productId, @RequestParam("productName") String productName);
结果:正常的get请求
|- 传递对象
>> 服务提供方在控制层使用的是@RequestBody接收参数
** 调用方 feignClient 的写法: 直接传递一个对象(默认就是@RequestBody)
参考:com.huan.study.feign.ProductServiceFeign.addProduct(@RequestBody ProductVO productVO); 此时前面的@RequestBody可以不写
>> 服务提供方没有使用@RequestBody进行接收
** 调用方 feignClient 的写法: 需要传递一个Map
参考:com.huan.study.feign.ProductServiceFeign.updateProduct(@RequestParam Map<String,Object> params);
1、需要以Map的参数传递
2、@RequestParam注解不可少
代码结构:

代码:
1、服务提供者和注册中心(略)
2、声明式客户端feign的编写
@FeignClient(name = "product-provider")
public interface ProductServiceFeign {
/**
* PathVariable 注解使用时,必须里面要有值,即@PathVariable("")或@PathVariable(name="")
*
* @param productId
* @return
*/
@GetMapping("product/selectOne/{productId}")
ProductVO selectByProductId(@PathVariable("productId") String productId);
/**
* 去掉 @RequestParam 注解将变成post请求,加上为get请求
*
* @param params
* @return
*/
@GetMapping("product/selectByProductIdAndName")
Map<String, Object> selectByProductIdAndNameMap(@RequestParam Map<String, Object> params);
// 程序启动报错,存在多个参数没有@requestParam注解
// @GetMapping("product/selectByProductIdAndName")
// Map<String, Object> selectByProductIdAndName(String productId, String productName);
// 程序启动报错,没有指定value的值,且参数不是map
// @GetMapping("product/selectByProductIdAndName")
// Map<String, Object> selectByProductIdAndName(@RequestParam String productId, String productName);
// 由于后面有一个参数没有加上@RequestParam注解,此时这个请求就变成了post请求发送,即使申明的是get请求
// @GetMapping("product/selectByProductIdAndName")
// Map<String, Object> selectByProductIdAndName(@RequestParam("productId") String productId, String productName);
@GetMapping("product/selectByProductIdAndName")
Map<String, Object> selectByProductIdAndName(@RequestParam("productId") String productId, @RequestParam("productName") String productName);
@PostMapping("product/addProduct")
Map<String, Object> addProduct(@RequestBody ProductVO productVO);
@PostMapping("product/updateProduct")
Map<String, Object> updateProduct(@RequestParam Map<String, Object> params);
@PostMapping("product/delete")
Map<String, Object> delteProduct(@RequestParam("productId") String productId);
}
参数传递对应图:

spring cloud feign的基本使用的更多相关文章
- 笔记:Spring Cloud Feign Ribbon 配置
由于 Spring Cloud Feign 的客户端负载均衡是通过 Spring Cloud Ribbon 实现的,所以我们可以直接通过配置 Ribbon 的客户端的方式来自定义各个服务客户端调用的参 ...
- 笔记:Spring Cloud Feign Hystrix 配置
在 Spring Cloud Feign 中,除了引入了用户客户端负载均衡的 Spring Cloud Ribbon 之外,还引入了服务保护与容错的工具 Hystrix,默认情况下,Spring Cl ...
- 笔记:Spring Cloud Feign 其他配置
请求压缩 Spring Cloud Feign 支持对请求与响应进行GZIP压缩,以减少通信过程中的性能损耗,我们只需要通过下面二个参数设置,就能开启请求与响应的压缩功能,yml配置格式如下: fei ...
- 笔记:Spring Cloud Feign 声明式服务调用
在实际开发中,对于服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以我们通常会针对各个微服务自行封装一些客户端类来包装这些依赖服务的调用,Spring Cloud Feign 在此基础上做了进 ...
- 第六章:声明式服务调用:Spring Cloud Feign
Spring Cloud Feign 是基于 Netflix Feign 实现的,整合了 Spring Cloud Ribbon 和 Spring Cloud Hystrix,除了提供这两者的强大功能 ...
- Spring Cloud Feign Ribbon 配置
由于 Spring Cloud Feign 的客户端负载均衡是通过 Spring Cloud Ribbon 实现的,所以我们可以直接通过配置 Ribbon 的客户端的方式来自定义各个服务客户端调用的参 ...
- Spring Cloud feign
Spring Cloud feign使用 前言 环境准备 应用模块 应用程序 应用启动 feign特性 综上 1. 前言 我们在前一篇文章中讲了一些我使用过的一些http的框架 服务间通信之Http框 ...
- 微服务架构之spring cloud feign
在spring cloud ribbon中我们用RestTemplate实现了服务调用,可以看到我们还是需要配置服务名称,调用的方法 等等,其实spring cloud提供了更优雅的服务调用方式,就是 ...
- Spring Cloud Feign 在调用接口类上,配置熔断 fallback后,输出异常
Spring Cloud Feign 在调用接口类上,配置熔断 fallback后,出现请求异常时,会进入熔断处理,但是不会抛出异常信息. 经过以下配置,可以抛出异常: 将原有ErrorEncoder ...
- RestTemplate OR Spring Cloud Feign 上传文件
SpringBoot,通过RestTemplate 或者 Spring Cloud Feign,上传文件(支持多文件上传),服务端接口是MultipartFile接收. 将文件的字节流,放入ByteA ...
随机推荐
- [源码解析] 深度学习流水线并行 PipeDream(5)--- 通信模块
[源码解析] 深度学习流水线并行 PipeDream(5)--- 通信模块 目录 [源码解析] 深度学习流水线并行 PipeDream(5)--- 通信模块 0x00 摘要 0x01 前言 0x02 ...
- 菜狗、《灵笼》、《时光代理人》,重新审视Z世代的电商逻辑
来源:懂懂笔记 B站还有多少潜力可以挖掘? 虽然B站的最新财报依然还是亏损,但同时也让人看到更多的可能性. 从财报数据的亮点来看,一是营收增长,B站二季度营收为44.95亿元,同比增长72%.营收上B ...
- java基础语法以及进制的转换
关键字 关键字: 被Java语言赋予特定含义的单词 关键字特点 组成关键字的字母全部小写 关键字注意事项 goto和const作为保留字存在,目前并不使用 类似IDEA这样的集成工具,针对关键字有特殊 ...
- linux系列之:告诉他,他根本不懂kill
目录 简介 使用kill来杀死进程 kill的深入用法 僵尸进程和kill java thread dump 总结 简介 和很多程序员打过交道,这些程序员可能熟知for遍历的好几种写法,但是却对写出来 ...
- CentOS获取公网IP
Curl 纯文本格式输出: curl icanhazip.com curl ifconfig.me curl curlmyip.com curl ip.appspot.com curl ipinfo. ...
- (未完)Java集合框架梳理(基于JDK1.8)
Java集合类主要由两个接口Collection和Map派生出来的,Collection派生出了三个子接口:List.Set.Queue(Java5新增的队列),因此Java集合大致也可分成List. ...
- python函数模块
python函数模块 学习完本篇,你将会深入掌握 函数相关知识 1.函数定义 2.函数如何调用 3.递归函数以及匿名函数使用 模块相关知识 1.模块如何导入调用 2.函数调用顺序 函数定义 函数代码块 ...
- PHP多文件上传格式化
文件上传是所有web应用中最常见的功能,而PHP实现这一功能也非常的简单,只需要前端设置表单的 enctype 值为 multipart/form-data 之后,我们就可以通过 $_FILES 获得 ...
- Dede后台广告管理模块增加图片上传功能插件
用户问题:网站广告后台管理非常方便,但是织梦后台的广告管理模块,发布广告时图片没有上传选项,只能用URL地址,很不方便,那么织梦帮就教大家一个方法实现广告图片后台直接上传,非常方便.先给大家看下修改后 ...
- js屏蔽右键代码
<script type="text/javascript"> document.body.oncontextmenu=document.body.ondragstar ...