首页 > 其他分享 >OpenFeign

OpenFeign

时间:2022-11-13 22:01:56浏览次数:39  
标签:goods RequestParam OpenFeign ResponseResult value 参数 id

OpenFeign—服务间的调用

一.什么是Feign和OpenFeign?

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

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 添加注解

OpenFeign_spring_02

1.3 创建客户端接口

@FeignClient 指定服务的名称

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

OpenFeign_spring_03

1.4 使用

OpenFeign_提供方_04

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) ;

OpenFeign_spring_05

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


OpenFeign_客户端_06

OpenFeign_提供方_07

2.5 测试

OpenFeign_提供方_08

OpenFeign_提供方_09

OpenFeign_客户端_10

OpenFeign_提供方_11

2.6 错误测试

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

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

OpenFeign_提供方_12

OpenFeign_spring_13

结论:

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

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

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

OpenFeign_客户端_14

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

OpenFeign_spring_15

标签:goods,RequestParam,OpenFeign,ResponseResult,value,参数,id
From: https://blog.51cto.com/u_15707781/5847960

相关文章

  • OpenFeign
    OpenFeign—服务间的调用一.什么是Feign和OpenFeign?在使用Feign或者OpenFeign前,服务之间的调用路径在函数内部设置:能不能像controller调用service一样,通过注......
  • 5.OpenFeign:Spring Cloud声明式服务调用组件(非常详细)
    NetflixFeign是Netflix公司发布的一种实现负载均衡和服务调用的开源组件。SpringCloud将其与Netflix中的其他开源服务组件(例如Eureka、Ribbon以及Hystrix等)一......
  • 记录一次springboot 集成 openfeign 实现模块间调用异常
    记录一次springboot集成openfeign实现模块间调用异常 问题背景product 服务作为服务端,提供了一个对外通信Fegin接口ProductClient,放在了com.imooc.product.clie......
  • OpenFeign 降级
    一、场景服务间相互调用时,分为服务调用方与服务提供方两个角色。今天我们所解决的问题就是在服务提供方发生超时或者异常(比如400、500ErrorCode)的时候,自动执行的一段......
  • OpenFeign和Ribbon的过期时间
    在openfeign之前的版本中集成了ribbon,并且openfeign和ribbon都有超时时间,那在项目中具体以哪个超时时间为准,我们一探究竟首先是依赖的版本:<dependency><groupId>com.......
  • 【分布式】-- 基于Nacos、OpenFeign搭建的微服务抽奖系统后台小案例
    1.项目介绍最近入项目之前要求熟悉一下SpringCloudNacos微服务基于Feign接口调用并整合Swagger2进行接口文档展示给前端,所以自己按照要求来编写并整合了一套基于SpringClou......
  • sentinel中如何使用@SentinelResource和openFeign来进行服务熔断和降级的操作
    今天我们就来好好说一下,sentinel中如何使用@SentinelResource和openFeign来进行服务熔断和降级的操作SentinelResource在上一节中,我们也使用到过这个注解,我们需要了解的......
  • spring cloud Alibaba 集成openfeign 和 loadbalancer
    springcloudAlibaba集成openfeign和loadbalancer1.1引入依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring......
  • OpenFeign 使用
    一、调用方Client1. 创建Springboot项目,并注册到服务注册中心2. 应用OpenFeign依赖3. 启动类添加注解@EnableFeignClients4. 创建接口+@F......
  • SpringBoot引入OpenFeign,不使用注册中心
    转自:https://blog.csdn.net/wind_chasing_boy/article/details/123822427(做了部分修改)【前言】最近接到一个需求,需要对接第三方平台的api,在设计方案通过之后,打算将对接服......