在上一节,我们学会了如何使用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. git 提交本地项目

    在新文件夹中] 1.右键 git bash here,执行 2.git init 生成.git文件,存在则跳过 依次执行 1.git add . 2.git commit -m "提交信息& ...

  2. 动态拼接表达式——Expression

    我们在项目中会遇到以下查询需求吗? 比如需要查询出满足以下条件的会员: 条件组一:30-40岁的男性会员 条件组二:20-30岁的女性会员 条件组三:60-80岁性别未知的会员 条件组内是并且关系,但 ...

  3. ysoserial CommonsColletions5分析

    我们知道,AnnotationInvocationHandler类在JDK8u71版本以后,官方对readobject进行了改写. 所以要挖掘出一条能替代的类BadAttributeValueExpE ...

  4. Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!

    前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...

  5. Optional容器类

    一.Optional 容器类:用于尽量避免空指针异常 方法 /* * Optional.of(T t) : 创建一个 Optional 实例 * Optional.empty() : 创建一个空的 O ...

  6. ldconfig与 /etc/ld.so.conf

    现在我们知道了动态与静态函数库,也知道了当前的Linux大多是将函数库做成动态函数库,下面来讨论增加函数库读取性能的方法.我们知道,内存的访问速度是硬盘的好几倍,所以,如果将常用的动态函数库加载到内存 ...

  7. ecshop transport.js IE报错(608行),对象不支持此属性或方法 的解决办法

    解决办法: 将if (this.hasOwnProperty(k)) { 改为: if (this.hasOwnProperty && this.hasOwnProperty(k)) ...

  8. Java基础系列(33)- 计算器

    package method; import java.util.Scanner; public class Demo09 { static double result; static String ...

  9. 显式等待until传入自定义方法

    WebDriverWait(driver,10).until(expected_conditions.element_to_be_clickable(ele)) 通过追踪代码,可以发现上面的eleme ...

  10. Appium 自动化测试改造思路

    流水账脚本 从头到尾编写测试脚本 PO封装 业务行为与操作具体页面元素分离 basepage封装 如封装find方法,目的时增强稳定性 数据驱动封装 将常用的数据改为配置文件 为构建测试平台打基础