OpenFeign

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 在服务提供方添加带参数的方法

//&#x521B;&#x5EFA;&#x63A5;&#x53E3;&#xFF0C;&#x5F53;&#x53EA;&#x6709;&#x5355;&#x4E2A;&#x53C2;&#x6570;&#x4F20;&#x9012;&#x65F6;&#xFF0C;&#x5EFA;&#x8BAE;&#x4F7F;&#x7528;@PathVariable
@GetMapping("/goods/{id}")
public ResponseResult searchGoodsById(@PathVariable Integer id)
{
    Goods goods=new Goods(id,"&#x624B;&#x673A;",100*id);

    ResponseResult<goods> result= Response.createOkResp("&#x5355;&#x4E2A;&#x53C2;&#x6570;",goods);

    return result;
}

//&#x521B;&#x5EFA;&#x63A5;&#x53E3;&#xFF0C;&#x5F53;&#x6709;&#x591A;&#x4E2A;&#x53C2;&#x6570;&#x65F6;&#xFF0C;&#x5EFA;&#x8BAE;&#x7528;@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("&#x591A;&#x4E2A;&#x53C2;&#x6570;",goods);

    return result;
}

//&#x521B;&#x5EFA;&#x63A5;&#x53E3;&#xFF0C;&#x5BF9;&#x8C61;&#x53C2;&#x6570;&#x65F6;&#xFF0C;&#x4F7F;&#x7528;@RequestBody
//&#x5982;&#x679C;&#x4F20;&#x9012;&#x7684;&#x53C2;&#x6570;&#x6BD4;&#x8F83;&#x590D;&#x6742;&#x65F6;&#xFF0C;&#x9ED8;&#x8BA4;&#x4F1A;&#x91C7;&#x7528;post&#x7684;&#x8BF7;&#x6C42;&#x65B9;&#x5F0F;
@PostMapping("/saveGoods")
public ResponseResult saveGoods(@RequestBody Goods goods) {

    ResponseResult<goods> result= Response.createOkResp("&#x5BF9;&#x8C61;&#x53C2;&#x6570;",goods);

    return result;

}
</goods></goods></goods>

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不能省,否则会报语法错误。

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

Original: https://www.cnblogs.com/daimenglaoshi/p/16886960.html
Author: 呆萌老师
Title: OpenFeign

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/714009/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球