06.OpenFeign接口调用

守听  论坛元老 | 2024-10-8 00:13:31 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1035|帖子 1035|积分 3105

1.提问

1.1 已经有RestTemplate + LoadBalancer的方式进行服务的调用,为什么还要有OpenFeign?

因为OpenFeign的功能更强大,和利用更便携。
1.2 利用那个?

推荐利用OpenFeign
2.OpenFeign是什么

2.1 官网翻译

https://docs.spring.io/spring-cloud-openfeign/reference/spring-cloud-openfeign.html

Feign是一个声明性web服务客户端。它使编写web服务客户端变得更容易。利用Feign创建一个接口并对其进行解释。它具有可插入的注解支持,包罗Feign注解和JAX-RS注解。Feign还支持可插拔编码器息争码器。Spring Cloud添加了对Spring MVC解释的支持,以及对利用Spring Web中默认利用的HttpMessageConverter的支持。Spring Cloud集成了Eureka、Spring Cloud CircuitBreaker以及Spring Cloud LoadBalancer,以便在利用Feign时提供负载平衡的http客户端。
JAX-RS注解:JAX-RS(Java API for RESTful Web Services)是一套用于构建RESTful Web服务的尺度Java API。JAX-RS提供了一组注解来简化HTTP请求处置惩罚和资源的定义。这些注解可以帮助开发者轻松地创建RESTful服务。
@Path,@GET,@POST,@PUT,@DELETE,@HEAD,@OPTIONS,@PATCH等。-- 来源,通义千问2.5。
2.2 GitHub

https://github.com/spring-cloud/spring-cloud-openfeign
2.3 总结

OpenFeign是一个声明式的Web服务客户端,只需要创建一个Rest接口,并在改接口上添加注解@FeignClient即可利用。
OpenFeign基本上就是当前微服务之间的调用的究竟尺度。
3.OpenFeign作用

前面在利用SpringCloud LoadBalancer+RestTemplate时,利用RestTemplate对http请求的封装处置惩罚形成了一套模版化的调用方法。但是在实际开发中,由于对服务依靠的调用可能不止一处,往往一个接口会被多处调用,以是通常都会针对每个微服务自行封装一些客户端类来包装这些依靠服务的调用。以是,OpenFeign在此底子上做了进一步封装,由他来帮助我们定义和实现依靠服务接口的定义。在OpenFeign的实现下,我们只需创建一个接口并利用注解的方式来配置它(在一个微服务接口上面标注一个@FeignClient注解即可),即可完成对服务提供方的接口绑定,统一对外袒露可以被调用的接口方法,大大简化和低沉了调用客户端的开发量,也即由服务提供者给出调用接口清单,消耗者直接通过OpenFeign调用即可,O(∩_∩)O。
OpenFeign同时还集成SpringCloud LoadBalancer

可以在利用OpenFeign时提供Http客户端的负载均衡,也可以集成阿里巴巴Sentinel来提供熔断、降级等功能。而与SpringCloud LoadBalancer不同的是,通过OpenFeign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
总结


  • 可插拔的注解支持,包罗Feign注解和JAX-RS注解;
  • 可插拔的HTTP编码器息争码器;
  • 支持Sentinel和Fallback;
  • 支持SpringCloudLoadBalancer的复杂均衡;
  • 支持HTTP请求和相应的压缩。
4.利用

4.1 接口 + 注解

微服务API接口 + @FeignClient注解
架构阐明

4.2 利用步骤

4.2.1 新建Module

略,新建一个利用OpenFeign的模块。
4.2.2 引入依靠

这是新增的依靠,其他的依靠,还需引入。
  1. <dependency>
  2.     <groupId>org.springframework.cloud</groupId>
  3.     <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>
复制代码
4.2.3 yml(底子)


4.2.4 启动类
  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  4. import org.springframework.cloud.openfeign.EnableFeignClients;
  5. @SpringBootApplication
  6. @EnableDiscoveryClient //该注解用于向使用consul为注册中心时注册服务
  7. @EnableFeignClients//启用feign客户端,定义服务+绑定接口,以声明式的方法优雅而简单的实现服务调用
  8. public class MainOpenFeign80 {
  9.     public static void main(String[] args) {
  10.         SpringApplication.run(MainOpenFeign80.class, args);
  11.     }
  12. }
复制代码
4.2.5 业务类

订单模块要去调用支付模块,订单和支付两个微服务,需要通过Api接口解耦,一样平常不要在订单模块写非订单相关的业务,
自己的业务自己做+别的模块走FeignApi接口调用。
将Feign接口,写在公共的依靠模块中,因为其他模块,可以也会需要远程调用支付模块。
commons模块修改
引入OpenFeign依靠:略
新建Feign接口:
  1. @FeignClient(value = "cloud-payment-service")
  2. public interface PayFeignApi {
  3.     /**
  4.      * 新增一条支付相关流水记录
  5.      * @param payDTO
  6.      * @return
  7.      */
  8.     @PostMapping("/pay/add")
  9.     ResultData<String> addPay(@RequestBody PayDTO payDTO);
  10.     /**
  11.      * 按照主键记录查询支付流水信息
  12.      * @param id
  13.      * @return
  14.      */
  15.     @GetMapping("/pay/get/{id}")
  16.     ResultData getById(@PathVariable("id") Integer id);//注解中的id必须写,
  17.     /**
  18.      * 负载均衡演示
  19.      * @return
  20.      */
  21.     @GetMapping("/pay/get/info")
  22.     String mylb();
  23. }
复制代码
@PathVariable注解的利用方式进行了调解,要求显式地指定路径变量的名称,以确保代码的可读性和维护性。在之前的版本中,假如路径变量名与方法参数名同等,可以省略name属性。但在SpringBoot 3.0及以后的版本中,为了遵循更好的编程实践和制止潜在的混淆,要求必须明确指定路径变量的名称。
修改Controller层的调用:略,将RestTemplate方式,改成Feign远程调用。
4.3 测试


5.OpenFiegn高级特性

5.1 超时控制

5.1.1 测试


在cloud-provider-payment8001模块,故意写暂停62s步伐,order模块,写捕捉异常,进行默认超时时间测试。
[code]//8001模块@GetMapping("/get/{id}")@Operation(summary = "根据id查流水", description = "查询支付流水方法")public ResultData getById(@PathVariable("id") Integer id) {    if (id

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表