上一节,我们学会了如何使用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的基本使用的更多相关文章

  1. 笔记:Spring Cloud Feign Ribbon 配置

    由于 Spring Cloud Feign 的客户端负载均衡是通过 Spring Cloud Ribbon 实现的,所以我们可以直接通过配置 Ribbon 的客户端的方式来自定义各个服务客户端调用的参 ...

  2. 笔记:Spring Cloud Feign Hystrix 配置

    在 Spring Cloud Feign 中,除了引入了用户客户端负载均衡的 Spring Cloud Ribbon 之外,还引入了服务保护与容错的工具 Hystrix,默认情况下,Spring Cl ...

  3. 笔记:Spring Cloud Feign 其他配置

    请求压缩 Spring Cloud Feign 支持对请求与响应进行GZIP压缩,以减少通信过程中的性能损耗,我们只需要通过下面二个参数设置,就能开启请求与响应的压缩功能,yml配置格式如下: fei ...

  4. 笔记:Spring Cloud Feign 声明式服务调用

    在实际开发中,对于服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以我们通常会针对各个微服务自行封装一些客户端类来包装这些依赖服务的调用,Spring Cloud Feign 在此基础上做了进 ...

  5. 第六章:声明式服务调用:Spring Cloud Feign

    Spring Cloud Feign 是基于 Netflix Feign 实现的,整合了 Spring Cloud Ribbon 和 Spring Cloud Hystrix,除了提供这两者的强大功能 ...

  6. Spring Cloud Feign Ribbon 配置

    由于 Spring Cloud Feign 的客户端负载均衡是通过 Spring Cloud Ribbon 实现的,所以我们可以直接通过配置 Ribbon 的客户端的方式来自定义各个服务客户端调用的参 ...

  7. Spring Cloud feign

    Spring Cloud feign使用 前言 环境准备 应用模块 应用程序 应用启动 feign特性 综上 1. 前言 我们在前一篇文章中讲了一些我使用过的一些http的框架 服务间通信之Http框 ...

  8. 微服务架构之spring cloud feign

    在spring cloud ribbon中我们用RestTemplate实现了服务调用,可以看到我们还是需要配置服务名称,调用的方法 等等,其实spring cloud提供了更优雅的服务调用方式,就是 ...

  9. Spring Cloud Feign 在调用接口类上,配置熔断 fallback后,输出异常

    Spring Cloud Feign 在调用接口类上,配置熔断 fallback后,出现请求异常时,会进入熔断处理,但是不会抛出异常信息. 经过以下配置,可以抛出异常: 将原有ErrorEncoder ...

  10. RestTemplate OR Spring Cloud Feign 上传文件

    SpringBoot,通过RestTemplate 或者 Spring Cloud Feign,上传文件(支持多文件上传),服务端接口是MultipartFile接收. 将文件的字节流,放入ByteA ...

随机推荐

  1. 经典多级时间轮定时器(C语言版)

    经典多级时间轮定时器(C语言版) 文章目录 经典多级时间轮定时器(C语言版) 1. 序言 2. 多级时间轮实现框架 2.1 多级时间轮对象 2.2 时间轮对象 2.3 定时任务对象 2.4 双向链表 ...

  2. 【第九篇】- Git 标签之Spring Cloud直播商城 b2b2c电子商务技术总结

    Git 标签 如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签. 比如说,我们想为我们的 xxx 项目发布一个"1.0"版本. ...

  3. 关联数组VS索引数组

    关联数组和常规说的数组类似,它包含标量抄数据,可用索引值来单独选择这些数据,和常规数组不同的是, 关联数组的索引值不是非负的整数而是任意的标量袭.这些标量称为百Keys,可以在以后用于检索数组中的数值 ...

  4. PTA 面向对象程序设计6-2 统计数字

    对于给定的一个字符串,统计其中数字字符出现的次数. 类和函数接口定义: 设计一个类Solution,其中包含一个成员函数count_digits,其功能是统计传入的string类型参数中数字字符的个数 ...

  5. 深入剖析RocketMQ源码-NameServer

    一.RocketMQ架构简介 1.1 逻辑部署图 (图片来自网络) 1.2 核心组件说明 通过上图可以看到,RocketMQ的核心组件主要包括4个,分别是NameServer.Broker.Produ ...

  6. Jmeter系列(17)- 常用断言之JSON断言

    模块分析 Assert JSON Path exists:需要断言的 JSON 表达式 Additionally assert value:如果要根据值去断言,请勾选 Match as regular ...

  7. Java基础系列(6)- 注释

    注释 平时我们编写代码,在代码量比较少的时候,我们还可以看懂自己写的,但是当项目结构一旦复杂起来,我们就需要用到注释了 注释不会被执行,是给开发人员看的 书写注释是一个非常好的习惯 Java中的注释有 ...

  8. 鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务 | 百篇博客分析OpenHarmony源码 | v41.03

    百篇博客系列篇.本篇为: v41.xx 鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...

  9. P5163-WD与地图【tarjan,整体二分,线段树合并】

    正题 题目链接:https://www.luogu.com.cn/problem/P5163 题目大意 给出\(n\)个点\(m\)条有向边,点有权值,要求支持操作 删除一条边 修改一个点的权值 求一 ...

  10. WPF进阶技巧和实战03-控件(5-列表、树、网格04)

    ListView控件 ListView继承自简单的没有特色的ListBox,增加了对基于列显示的支持,并增加了快速切换视图或显示模式的能力,而不需要重新绑定数据以重新构建列表. ListView类继承 ...