在上一节,我们学会了如何使用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统一设置验证token实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
RS注解,SpringCloud又为Feign增加了对SpringMVC注解的支持,同时为了能够使用和Spring Web中默认使用的相同的httpMessageConverter,SpringCloud集成了Ribbon和Eureka,用来在使用Feign时能够为其提供一个负载均衡...
springcloud feign 服务消费者 类似 webservice ====== http://knight-black-bob.iteye.com/blog/2356222
springcloud feign整合hystrix 示例,希望对大家有所帮助
springcloud整合openFeign,包括feign的基本使用、传参、指定特定的服务器、负载均衡等使用方法。 模块有: springcloud-feign-api springcloud-feign-consumer springcloud-feign-provider springcloud-feign-...
主要介绍了spring cloud feign实现远程调用服务传输文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
SpringCloud之Feignhttps://blog.csdn.net/u012081441/article/details/80763738
SpringCloud中关于Feign的常见问题总结,包括常用的请求注解、@PathVariable、FeignClient多参数的构造等
NULL 博文链接:https://huangyongxing310.iteye.com/blog/2381467
文档:https://blog.csdn.net/jameshadoop/article/details/82026772
SpringCloud之四 负载均衡Feign,使用Feign进行微服务的负载均衡处理
主要介绍了SpringCloud Feign的使用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
springcloudf feign 服务间相互调用示例
Feign的Service做对应的修改:通过以上的代码,我们可以看出,其实Feign的Service接口内的方法,其实就是提供者Controller里的方法,包
SpringCloud eureka zuul feign 负载均衡 微服务
Spring Cloud中使用Feign,将feign框架整合到Spring Cloud之中,实现负载均衡等低耦合客户端
spring cloud eureka zuul ribbon hystrix feign config 示例代码
主要介绍了Spring Cloud Feign 自定义配置(重试、拦截与错误码处理) 实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
第五章 SpringCloud 使用Feign调用服务.pdf