OpenFeign—服务间的调用

一.什么是Feign和OpenFeign?

在使用Feign或者OpenFeign前,服务之间的调用路径在函数内部设置:

能不能像controller调用service一样,通过注入的方式设置呢。Feign和OpenFeign可以实现。

Feign:是声明式的web service客户端,它让微服务之间的调用变得更简单了,可以帮助我们实现面向接口编程,类似controller调用service。Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务

OpenFeign:是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign 没有内置 Ribbon,需要单独对 Ribbon 进行配置

springboot 2.0 以上基本上使用openfeign,openfeign 如果从框架结构上看就是2019年feign停更后出现版本,也可以说大多数新项目都用openfeign ,2018年以前的项目在使用feign。

二.OpenFeign怎么使用?

1.入门案例

在前面Eureka和Ribbon案例的基础之上

1.1 添加Jar包

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

1.2 添加注解

1.3 创建客户端接口

@FeignClient 指定服务的名称

@RequestMapping 中的value是设置目标服务的请求路径 method设置请求方法

1.4 使用

1.5 访问

​ 访问服务消费者,服务消费者会调用服务提供者中的方法

​ http://localhost:8080/goods

2.如何传递参数?

2.1参数传递原则

​ 1.传递单个参数时,建议使用@PathVariable

​ 2.传递多个参数时,建议采用@RequestParam

​ 3.传递对象参数时,统一采用json的方式,添加@RequestBody注解。

​ 4. 如果传递的参数比较复杂时,默认会采用post的请求方式

2.2 在服务提供方添加带参数的方法

//创建接口,当只有单个参数传递时,建议使用@PathVariable
@GetMapping("/goods/{id}")
public ResponseResult searchGoodsById(@PathVariable Integer id)
{
Goods goods=new Goods(id,"手机",100*id); ResponseResult<Goods> result= Response.createOkResp("单个参数",goods); return result;
} //创建接口,当有多个参数时,建议用@RequestParam
@GetMapping("/searchGoodsByParam")
public ResponseResult searchGoodsByParam(@RequestParam Integer id, @RequestParam String name)
{
Goods goods=new Goods(id,name,100*id); ResponseResult<Goods> result= Response.createOkResp("多个参数",goods); return result;
} //创建接口,对象参数时,使用@RequestBody
//如果传递的参数比较复杂时,默认会采用post的请求方式
@PostMapping("/saveGoods")
public ResponseResult saveGoods(@RequestBody Goods goods) { ResponseResult<Goods> result= Response.createOkResp("对象参数",goods); return result; }

2.3 在服务消费方创建接口,用来调用服务

注意:

接口中不支持GetMapping 和PostMapping要用RequestMapping方式,然后指定RequestMethod为Get
@PathVariable和@RequestParam中的value不要省

@RequestMapping(value="/goods/{id}",method = RequestMethod.GET)
public ResponseResult searchGoodsById(@PathVariable(value = "id") Integer id); @RequestMapping(value="/searchGoodsByParam",method = RequestMethod.GET)
public ResponseResult searchGoodsByParam(@RequestParam(value = "id") Integer id, @RequestParam(value = "name") String name); @RequestMapping(value = "/saveGoods",method = RequestMethod.GET)
public ResponseResult saveGoods(@RequestBody Goods goods) ;

2.4 在服务消费方的控制层通过接口调用服务

Author:呆萌老师 QQ:2398779723 微信:it_daimeng

2.5 测试

2.6 错误测试

1.如果传递的参数为对象或其它复杂类型时,默认的请求方式是Post。

如果我们在服务提供方这里设置为Get,会报错。

结论:

为什么FeignClient发起的GetMapping会报错,是因为FeignClient最后是用HttpURLConnectiion发起的网络连接,在发起的过程中,Connection会判断其自身的body是否为空,如果不为空,则将 GET Method 转换为 POST Method。

按照上面的GET会转POST的理论,所以我们FeignClient调用端写的是GetMapping,参数不贴注解,只要服务端的生产者是PSOT请求加@RequestBody接收,那么就能正确接收并响应数据。

2.FeignClient接口中的@PathVariable和@RequestParam 中的value不能省,否则会报语法错误。

但服务提供者和服务消费者对应的控制层方法中可以省

OpenFeign的更多相关文章

  1. springboot~openfeign从此和httpClient说再见

    在微服务设计里,服务之间的调用是很正常的,通常我们使用httpClient来实现对远程资源的调用,而这种方法需要知识服务的地址,业务接口地址等,而且需要等他开发完成后你才可以去调用它,这对于集成开发来 ...

  2. springboot~openfeign从JSON文件读取数据

    对openfeign不清楚的同学可以先看我这篇文章:springboot~openfeign从此和httpClient说再见 对于openfeign来说,帮助我们解决了服务端调用服务端的问题,你不需要 ...

  3. OpenFeign封装为springboot starter

    OpenFeign是什么 随着业务的增多,我们的单体应用越来越复杂,单机已经难以满足性能的需求,这时候出现了分布式.分布式通讯除了RPC, REST HTTP请求是最简单的一种方式.OpenFeign ...

  4. OpenFeign使用笔记

    是什么 Feign是一个声明式Web Service客户端.使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注 ...

  5. 解决OpenFeign默认无法上传文件的问题

    前言 最近在项目中使用OpenFeign时,发现其不支持文件上传功能.网上找了很多资料,最后找到feign-form和feign-form-spring的解决方案.但其默认只支持单文件上传,不支持多文 ...

  6. Method has too many Body parameters openfeign

    feign 调用问题,最新版本的feign和旧版本的稍微有一些不一样,具体如下(eureka 作为服务发现与注册 ) 依赖: compile('io.github.openfeign:feign-ja ...

  7. Nacos(三):Nacos与OpenFeign的对接使用

    前言 上篇文章中,简单介绍了如何在SpringCloud项目中接入Nacos作为注册中心,其中服务消费者是通过RestTemplate+Ribbon的方式来进行服务调用的. 实际上在日常项目中服务间调 ...

  8. Maven项目 - OpenFeign使用细节 - 从此和httpClient说再见

    maven项目使用openfeign,从此和httpClient说拜拜 pom.xml: <dependency> <groupId>io.github.openfeign&l ...

  9. 解决spring-test中Feign问题: No qualifying bean of type 'org.springframework.cloud.openfeign.FeignContext' available

    问题现象: 启动测试类(含通过Feign远程调用的组件),报错: No qualifying bean of type 'org.springframework.cloud.openfeign.Fei ...

  10. openfeign与gateway中的httpClient类声明冲突

    启动spring cloud中的网关,报错: ***************************APPLICATION FAILED TO START*********************** ...

随机推荐

  1. C#基础_理解类

    构造函数主要是用来创建对象时为对象赋初值来初始化对象.总与new运算符一起使用在创建对象的语句中 .A a=new A(); 构造函数具有和类一样的名称:但它是一个函数具有函数的所有特性,同一个类里面 ...

  2. 【JDBC】学习路径3-密码登录&SQL注入攻击

    最后再提醒一句,每次在测试JDBC程序的时候,一定要确保MySQL正在运行. 打开控制台(终端),输入mysql 如果没启动,则出现以下提示: Mac端启动MySQL数据库,需要在系统便好设置中启动. ...

  3. java.lang.UnsatisfiedLinkError报错

    是因为使用maven时,运行web项目时,在maven的依赖包没有打包到tomcat中(out目录中),所以要手动加上

  4. HPC+时代,携手亚马逊云科技,共赴数字化升级的星辰大海!

    高性能计算(HPC)和云计算曾是两个"平行世界",各自演绎着精彩,却鲜有交集. 传统上,HPC主要应用于大规模计算,如天气预报.石油勘探.药物研发等.这些任务通常借助超级计算机或计 ...

  5. KingbaseES批量数据加载的实践技巧

    有时,KingbaseES数据库需要在单个或最少的步骤中导入大量数据,这通常称为批量数据导入.其中数据源通常是一个或多个大文件,这个过程有时可能非常慢. 造成性能不佳的原因有很多:索引.触发器.外键. ...

  6. 输入法词库解析(三)紫光拼音词库.uwl

    详细代码:https://github.com/cxcn/dtool 前言 .uwl 是紫光拼音输入法(现在叫华宇拼音输入法)使用的词库. 解析 紫光的词库有点复杂,拼音用的索引,但是拼音表没有写在词 ...

  7. 百度ueditor工具栏配置大全

    toolbars: [[ 'source', // 源代码 'anchor', // 锚点 'undo', // 撤销 'redo', // 重做 'bold', // 加粗 'indent', // ...

  8. 「国产系统」Tubian 0.1,兼容Windows和Android的GNU/Linux系统!

    Tubian 0.42已发布:https://www.cnblogs.com/tubentubentu/p/16745926.html Tubian是我的自用系统整理而成的Linux发行版,基于Deb ...

  9. count(*), count(1), count(列名)的区别

    1.从结果上来看 count(1)和count(*)之间没有区别,因为count(*)count(1)都不会去过滤空值,但count(列名)就有区别了,因为count(列名)会去过滤空值. 2.从执行 ...

  10. Java开发学习(三十七)----SpringBoot多环境配置及配置文件分类

    一.多环境配置 在工作中,对于开发环境.测试环境.生产环境的配置肯定都不相同,比如我们开发阶段会在自己的电脑上安装 mysql ,连接自己电脑上的 mysql 即可,但是项目开发完毕后要上线就需要该配 ...