上一节,我们学会了如何使用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. VUE003. 解决data中使用vue-i18n不更新视图问题(computed属性)

    案例 在国际化开发中,有一部分需要国际化的文字是由数据驱动的储存在data中,然而VUE的data存在很多无法实时更新视图的问题,比如v-for循环的标签,当数据层次过深,通过源数据数组的索引改变它的 ...

  2. [CVE-2020-1956] Apache Kylin远程命令执行漏洞复现

    Apache Kylin是一个开源的.分布式的分析型数据仓库,提供Hadoop/Spark之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由 eBay 开发并贡献至开源社区. ...

  3. XXE从0到1

    XXE从0到1 1. XXE概述 XXE(XML External Entity Injection)即XML外部实体注入.漏洞是在对不安全的外部实体数据进行处理时引发的安全问题. 下面我们主要介绍P ...

  4. JDK源码阅读:Object类阅读笔记

    Object 1. @HotSpotIntrinsicCandidate @HotSpotIntrinsicCandidate public final native Class<?> g ...

  5. FastAPI(6)- get 请求 - 详解 Query

    可选参数 上一篇文章讲过查询参数可以不是必传的,可以是可选参数 from fastapi import FastAPI from typing import Optional import uvico ...

  6. Jupyter Notebook 修改字体和大小

    1 打开这个目录 D:\SoftWare\Anaconda\Lib\site-packages\notebook\static\custom 点开这个 也就是你安装的 python下面的 jupyte ...

  7. qsc oj-17 喵哈哈村的排队

    http://qscoj.cn/problem/17/ 喵哈哈村的排队 描述 有一堆喵哈哈村的村民们在排队,他们从队列的尾部开始标号,标号为1的村民站在最后面,标号为n的村民站在队列的最前面,而且每个 ...

  8. ACID的实现原理

    引言 ACID是事务的特点也是必须的要求,只有保证ACID事务的执行才不会出错,分别是原子性.一致性.隔离性和持久性.我们知道典型的MySQL事务是这样执行的: start transaction 开 ...

  9. Node.js躬行记(10)——接口日志查询

    当运营向我们上报BUG时,我们第一时间是捕获相关的接口.从监控系统中,就可以查到用户使用时接口的请求和响应数据. 若接口的请求正常,那么就需要深入到接口代码中,查看相关的日志,通常会先浏览数据库查询语 ...

  10. mysql操作中卡死 解决方法

    1.使用指令查询当前进程 show full processlist; -- 查询全部当前进程; show processlist;-- 只列出前100条 2.找出卡死的进程id 3.删除卡死进程 k ...