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#使用BouncyCastle生成PKCS#12数字证书

    背景 生成数字证书用于PDF文档数字签名 数字证书需要考虑环境兼容性,如linux.windows 网上资料不全或版本多样 本文章主要介绍了在C#中使用BouncyCastle生成PKCS#12个人信 ...

  2. CodeForces - 1690F

    Problem - F - Codeforces 题意: 给出一个字符串,给出一个序列,每次对应位置的字符变成序列指定位置的字符,即序列中对应位置为2,那么字符串的这个位置的字符就要变成字符串第二个位 ...

  3. Html飞机大战(七):发射第一颗子弹

    好家伙,终于到子弹了 我们先来理一理思路: 子弹由飞机射出,所以我们把发射子弹的方法写在英雄类中 当然了,子弹也必须有自己独立的类 后期会有很多子弹射出,所以一个个将子弹类实例化肯定是不对的 我们也需 ...

  4. Python 爬取网站数据

    一.使用request库实现批量下载HTML 二.使用BeautifulSoup库实现html解析 官网:https://beautifulsoup.readthedocs.io/zh_CN/v4.4 ...

  5. VS Code 之KoroFileHeader插件

    设置 在vscode左下角点击设置按钮,选择"设置",然后输入"fileheader", 文件头部注释:Fileheader:custom Made 函数注释: ...

  6. MYSQL 安装及语法

    Ubuntu 16.04 安装MySql 目录 一.安装MySql服务器和客户端 1.登录 2.创建数据库 3.选择数据库 4.查看数据库 5.创建数据表 6.查看数据表 7.更改数据表名字 8.更改 ...

  7. VM虚拟机安装

    VM虚拟机安装 1.安装vm虚拟机软件 1.1 双击打开虚拟机文件 1.2 根据向导安装 下一步 安装好了 不要着急点完成在 安装目录中有许可证. 1.3激活操作 2.虚拟机原理简介 3. 新建虚拟机 ...

  8. 日志:Redo Log 和 Undo Log

    本篇文章主要介绍 Redo Log 和 Undo Log: 利用 Redo Log 和 Undo Log 实现本地事务的原子性.持久性 Redo Log 的写回策略 Redo Log Buffer 的 ...

  9. .Net7 内容汇总(1)

    .Net7 RC1发布 在9月14号,.Net7 RC1正式发布了. 按照微软的说法 This is the first of two release candidates (RC) for .NET ...

  10. Kubernetes 监控--Prometheus

    在早期的版本中 Kubernetes 提供了 heapster.influxDB.grafana 的组合来监控系统,在现在的版本中已经移除掉了 heapster,现在更加流行的监控工具是 Promet ...