SpringCloud入门(微服务调用 OpenFeign)——从RestTemplate到OpenFeign & OpenFeign的相关配置 & 源码的分析和请求流程拆解

这篇具有很好参考价值的文章主要介绍了SpringCloud入门(微服务调用 OpenFeign)——从RestTemplate到OpenFeign & OpenFeign的相关配置 & 源码的分析和请求流程拆解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

前言

在之前的博客中,我们介绍了RestTemplate的使用,博客文章如下连接。但是在使用RestTemplate的时候,需要把生产者的路径拼出来,非常繁琐,另外参数的传递的也比较繁琐,解决方案就是使用openFeign。

SpringCloud入门(RestTemplate + Ribbon)——微服务调用的方式 & RestTemplate的使用 & 使用nacos的服务名初步(Ribbon负载均衡)

本篇博客介绍OpenFeign,声明式的HTTP客户端,用于简化服务间的调用这一SpringCloud组件,并尝试对源码进行了初步分析。

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

引出


1.spring提供的restTemplate,发送HTTP请求的客户端工具类;
2.OpenFeign,声明式的HTTP客户端,用于简化服务间的调用;
3.和ribbon的关系,其他的配置,超时时间,日志级别;
4.源码分析,@EnableFeignClient和@FeignClient的作用;
5.尝试分析OpenFeign请求发送的流程;文章来源地址https://www.toymoban.com/news/detail-847893.html

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

初识OpenFeign

声明式的HTTP客户端,用于简化服务间的调用

OpenFeign的主要特点和功能包括:

  1. 声明式的API定义:通过使用注解,开发者可以定义和描述服务间的API接口,包括请求方法、路径、参数、请求头等信息。这样可以使得服务间的调用代码更加简洁和易于维护。
  2. 自动化的服务发现和负载均衡:OpenFeign集成了服务注册中心,可以自动发现和调用其他微服务。它还支持负载均衡,可以根据配置的负载均衡策略选择合适的服务实例进行调用。
  3. 内置的请求和响应拦截器:OpenFeign提供了一些内置的拦截器,可以在请求和响应的不同阶段进行拦截和处理。开发者可以自定义拦截器来实现日志记录、错误处理等功能。
  4. 支持多种编码器和解码器:OpenFeign支持多种编码器和解码器,可以处理不同的数据格式,如JSON、XML等。开发者可以根据需要选择合适的编码器和解码器。
  5. 整合了Hystrix和Ribbon:OpenFeign与Hystrix和Ribbon等其他Spring Cloud组件集成,可以实现服务的容错和熔断机制,提高系统的可靠性和稳定性。

总之,OpenFeign简化了微服务架构中的服务间调用,提供了一种简洁、声明式的方式来定义和调用服务API。它与Spring Cloud的其他组件集成良好,是构建和管理微服务架构的重要工具之一。

为什么用feign?

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

上面的代码存在以下问题:

  • 远程调用需要拼接地址,不符合我们的使用习惯(注入一个对象,通过方法调用)
  • 参数拼接,如果参数比较复杂的话,拼接较为麻烦(参数为DTO的话)
  • 返回的result对象里面的data数据是一个Map数据结构

因此采用OpenFeign技术来解决上述问题

Feign是什么

Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求。

Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix 实现负载均衡和断路器,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。

Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring CloudRibbon时自行封装服务调用客户端的开发量。

通俗的讲:feign使远程调用的代码写法更加符合我们的编程习惯,也内置了负载均衡策略。

Feign的使用流程初步

1.引入依赖

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

2.主启动类加注解

import org.springframework.cloud.openfeign.EnableFeignClients;

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

3.在消费端写feign接口

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

package com.tianju.consumer.api;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

// contextId唯一,可以随便写;
//@FeignClient(value = "springCloud-provider",contextId = "providerFeignTest") // openfeign用来远程连接
@FeignClient(value = "springCloud-provider",fallback = ProvideFallback.class) // openfeign用来远程连接
public interface IProvideFeign {
    @GetMapping("/api/provider/hello")
    String helloFeign();
    /**
     * 这个去调用生产者provider
     * @param msg 路径变量信息
     * @return 返回结果
     */
    @GetMapping("/api/provider/hiPath/{msg}")
    String pet(@PathVariable("msg") String msg);
}

    @Autowired
    private IProvideFeign feign;

    @GetMapping("/hiCall")
    public String callFeign(){
        String s = feign.helloFeign();
        System.out.println(s);
        System.out.println("消费者获取生产者提供的数据"+s);
        return s;
    }

注意事项:

  1. 是一个接口,一个feignClient就对应一个controller地址
  2. @FeignClient(name=”mall-product”, path=”/product”) name是服务的名称,path是controller
    上面的requestMapping对应的地址
  3. 接口中方法的命名不要自己写,从controller中复制过来

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

4.controller中直接调用feign

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

深入认识feign

1.代理对象

从上面的feign使用可以知道,ProductFeignClient是一个接口,我们在OrderController中注入的
ProductFeignClient不可能是一个接口,肯定是一个实例化的对象。

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

2.feign与ribbon的关系

Ribbon是一个基于 HTTP 和 TCP 客户端 的负载均衡的工具。它可以 在客户端 配置RibbonServerList(服务端列表),使用 HttpClient 或 RestTemplate 模拟http请求,步骤相当繁琐。

Feign 是在 Ribbon的基础上进行了一次改进,是一个使用起来更加方便的 HTTP 客户端。采用接口的方式, 只需要创建一个接口,然后在上面添加注解即可 ,将需要调用的其他服务的方法定义成抽象方法即可, 不需要自己构建http请求。然后就像是调用自身工程的方法调用,而感觉不到是调用远程方法,使得编写客户端变得非常容易。

3.fegin的其他配置

(1)超时时间

消费端进行配置

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

feign:
  # 打开阿里的 sentinel
  sentinel:
    enabled: true

  # 调用生产者的配置
  client:
    config:
      springCloud-provider:
        connect-timeout: 3000 # 连接超时时间,单位毫秒,默认2秒
        read-timeout: 3000 # 处理请求的时间,默认是5s

生产者进行线程的休眠

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

    @GetMapping("/hello")
    public String hello(){
        String s = "服务"+serverId+",端口:"+port+",电影名:"+movieName;
        System.out.println(s);

        try {
            Thread.sleep(4000); // 生产者休眠4s之后响应
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return s;
    }

消费者调用feign报错500

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

(2)请求压缩

Spring Cloud Feign 支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。通过下面的参数,即可开启请求与响应的压缩功能:

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

feign:
  # 打开阿里的 sentinel
  sentinel:
    enabled: true

  # 调用生产者的配置
  client:
    config:
      springCloud-provider:
        connect-timeout: 3000 # 连接超时时间,单位毫秒,默认2秒
        read-timeout: 3000 # 处理请求的时间,默认是5s
  compression:
    request:
      enabled: true # 开启请求压缩,默认为false
      # 设置支持压缩的数据类型
      mime-types: text/html,application/xml,application/json
      # 设置触发压缩的数据下限
      min-request-size: 1  # 2048 2M?
    response:
      # 开启响应压缩,默认值为false
      enabled: true

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

4.日志级别的配置

在开发或者运行阶段往往希望看到Feign请求过程的日志记录,默认情况下Feign的日志是没有开启的。
要想用属性配置方式来达到日志效果,只需在 application.yml 中添加如下内容即可:

日志级别

  • NONE:默认的,不显示任何日志
  • BASIC:仅记录请求方法、RUL、响应状态码及执行时间(在生产环境使用)
  • HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息
  • FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据(在开发环境使用)

(1)配置文件yml

feign:
  # 打开阿里的 sentinel
  sentinel:
    enabled: true
  # 调用生产者的配置
  client:
    config:
      springCloud-provider:
        connect-timeout: 3000 # 连接超时时间,单位毫秒,默认2秒
        read-timeout: 3000 # 处理请求的时间,默认是5s
        loggerLevel: BASIC # 设置feign调用的日志级别 NONE BASIC HEADERS FULL

配置文件的方式配置,只能针对某一个服务起作用,可以使用配置类的方式进行配置

(2)配置类配置

级别 解释
NONE 默认的,不显示任何日志
BASIC 仅记录请求方法、URL、响应状态码及执行时间
HEADERS 除了 BASIC 中定义的信息之外,还有请求和响应的头信息
FULL 除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据

在consumer-feign中添加feign日志配置类,指定日志输出级别以显示指定的内容

注意Level的包为:feign.Logger

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

package com.tianju.consumer.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * 定义feign的日志打印级别,作为全局的日志输出控制
 * @return
 */
@Configuration
public class FeignLogConfig {
    @Bean
    public Logger.Level level(){
        return Logger.Level.FULL;
    }
}

因为feign日志的输出级别都是debug级别,因此如果想要看到日志信息,还需要设置service包的日志级别

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

logging:
  level:
    com.tianju.consumer: debug

此时再调用就会显示feign的日志

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

feign的源码分析

通过上面的使用过程,@EnableFeignClients和@FeignClient两个注解就实现了Feign的功能,那我们从
@EnableFeignClients注解开始分析Feign的源码

1)@EnableFeignClients与@FeignClient

通过 @EnableFeignClients 引入了FeignClientsRegistrar客户端注册类

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

然后通过registerFeignClient 注册了feign客户端对象

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

创建代理对象注册到spring容器中

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

工厂模式,生成feign的bean工厂

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

创建代理对象

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

2)请求的发送拆解

FeignClientFactoryBean.getObject()具体返回的是一个代理类,具体为FeignInvocationHandler,调
用该类中的invoke方法

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

先要找到url

先在feign的核心包中,找到生产者的url

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

紧着这获取了后面拼的路径

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

拿到路径

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

两者拼一下,然后把生产者url作为消费者的url的一个子路径请求

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

invoke方法执行创建RequestTemplate

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

类似于RestTemplat

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式

执行生产者的调用feign的map,似乎是一个一个调用,获取响应

openfeign调用,Spring全家桶技术专区,spring cloud,微服务,spring,分布式


总结

1.spring提供的restTemplate,发送HTTP请求的客户端工具类;
2.OpenFeign,声明式的HTTP客户端,用于简化服务间的调用;
3.和ribbon的关系,其他的配置,超时时间,日志级别;
4.源码分析,@EnableFeignClient和@FeignClient的作用;
5.尝试分析OpenFeign请求发送的流程;

到了这里,关于SpringCloud入门(微服务调用 OpenFeign)——从RestTemplate到OpenFeign & OpenFeign的相关配置 & 源码的分析和请求流程拆解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 声明式调用 —— SpringCloud OpenFeign

    Spring Cloud Feign 是一个 HTTP 请求调用的轻量级框架,可以以 Java 接口注解的方式调用 HTTP 请求,而不用通过封装 HTTP 请求报文的方式直接调用 Feign 通过处理注解,将请求模板化,当实际调用的时候传入参数,根据参数再应用到请求上,进而转化成真正的请求 本小节介绍如何通

    2024年02月08日
    浏览(41)
  • 【springcloud 微服务】springcloud openfeign使用详解

    目录 一、前言 二、openfeign介绍 2.1 openfeign介绍 2.2  openfeign优势 三、Spring Cloud Alibaba整合OpenFeign

    2024年02月05日
    浏览(36)
  • 【springcloud微服务】springcloud整合openfeign使用详解

    目录 一、前言 二、微服务接口之间的调用问题 2.1 Httpclient 2.2 Okhttp 2.3 HttpURLConnection 2.

    2024年02月02日
    浏览(31)
  • 微服务—远程调用(RestTemplate)

              在微服务的所有框架中,SpringCloud脱颖而出,它是目前国内使用的最广泛的微服务框架   (官网地址),它集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用的体验 服务拆分注意事项: 单一职责:不同的微服务,

    2024年02月12日
    浏览(29)
  • SpringCloud 微服务系列——【服务间的通信方式、OpenFeign、Hystrix组件使用】

    ✅作者简介:2022年 博客新星 第八 。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:SpringCloud 微服务学习专栏 ✨特色专栏:国学周更-心性养成之路 🥭本文内容:SpringCloud 微服

    2023年04月24日
    浏览(30)
  • 微服务之OpenFeign服务接口调用

    OpenFeign客户端是一个web声明式http远程调用工具,直接可以根据服务名称去注册中心拿到指定的服务IP集合,提供了接口和注解方式进行调用,内嵌集成了Ribbon本地负载均衡器。 Feign是一个 声明性web服务客户端 。它使编写web服务客户端变得更容易。 使用Feign创建一个接口并对

    2024年04月16日
    浏览(27)
  • day07-OpenFeign-服务调用

    https://github.com/spring-cloud/spring-cloud-openfeign OpenFeign是一个声明式WebService客户端,使用OpenFeign让编写Web Service客户端更加简单 它的使用方法是定义一个服务端口然后在上面添加注解 OpenFeign也支持可插拔式的编码器和解码器 SpringCloud对OpenFeign进行了封装使其支持SpringMVC标准注解和

    2023年04月11日
    浏览(27)
  • 微服务远程调用openFeign整合

    ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 微服务探索之旅 ✨特色专栏: MySQL学习 🥭本文内容:微服务远程调用openFeign整合 🖥️个人小站 :个人博客,欢迎大家访问 📚个人知识库:

    2024年02月09日
    浏览(29)
  • SpringCloud微服务之间如何进行用户信息传递(涉及:Gateway、OpenFeign组件)

    在业务微服务中通过工具类获取当前用户信息 网关微服务(Gateway)往业务微服务传递用户信息 业务微服务之间通过OpenFeign传递用户信息 只要把上面两处打通,然后业务微服务在通过拦截器获取到用户信息,之后再将用户信息存在ThreadLocal中,这样我们就可以实现在业务微服

    2024年02月13日
    浏览(39)
  • 【springcloud微服务】Spring Cloud Alibaba 整合dubbo与openfeign

    dubbo与springcloud都可以单独作为微服务治理框架在生产中进行使用,但使用过springcloud的同学大概了解到,springcloud生态的相关组件这些年已经逐步停更,这就导致在服务架构演进过程中的迭代断层,以至于一些新的技术组件引入困难重重,于是在国内的市场上就有了升级版的

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包