【SpringCloud10】OpenFeign服务接口调用

news2025/1/21 13:04:19

1.概述

1.1OpenFeign是什么

官网
Feign是一个声明式WebService客户端,使用Feign能让编写Web Service客户端更加简单。

它的使用方法是定义一个服务接口然后在上面添加注解,Feign也支持可拔插式的编码器和解码器,Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters,Feign可以与Eureka和Ribbon组合使用以支持负载均衡

在这里插入图片描述

Feign是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可

Github网址

1.2作用

Feign能干什么
Feign旨在使编写Java Http客户端变得更容易。
前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用。所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。
在这里插入图片描述

以前主要用的是RestTemplate,每个人都要去写一遍
尽量的面向接口编程,分层解耦以后,8001服务肯定要对外暴露服务接口,order和payment就用接口沟通,8001所要提供的服务在8001中肯定是已经定义好的,那8001中定义了哪些方法,order与之相对应的也创造一个接口规定为Feign接口,8001中有什么方法,我这个Feign就调哪些方法,实现Feign接口到业务提供方的服务接口的一一配对,这样就可以更好的面向微服务接口编程

Feign集成了Ribbon
Feign集成了Ribbon,利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用

1.3Feign和OpenFeign两者区别

Feign:

  • Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端
  • Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务
  • Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

OpenFeign(选择这个):

  • OpenFeign是Spring Cloud 在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等
  • OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.OpenFeign使用步骤

在这里插入图片描述

1.接口+注解

微服务调用接口+@FeignClient

2.新建cloud-consumer-feign-order80

Feign是用在消费端

在这里插入图片描述

3.POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.atguigu.springcloud</groupId>
        <artifactId>cloud2022</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>cloud-consumer-feign-order80</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-common</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--一般基础通用配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

在这里插入图片描述

天生具有Ribbon

4.YML

server:
  port: 80

eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka 

5.主启动

添加注解激活并开启Feign

@EnableFeignClients
package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * 简要描述
 *
 * @Author: ASuLe
 * @Date: 2023/1/13 17:42
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
@SpringBootApplication
//激活并开启Feign
@EnableFeignClients
public class OrderFeignMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderFeignMain80.class, args);
    }
}

6.业务类

  1. 业务逻辑接口+@FeignClient配置provider配置

  2. 新建PaymentFeignService接口并新增注解@FeignClient
    将Payment8001控制层的方法复制到PaymentFeginService接口
    在这里插入图片描述
    将所要调用接口的微服务的服务名添加到@FeignClient中
    在这里插入图片描述

  3. 控制层Controller

    package com.atguigu.springcloud.controller;
    
    import com.atguigu.springcloud.entities.CommonResult;
    import com.atguigu.springcloud.entities.Payment;
    import com.atguigu.springcloud.service.PaymentFeignService;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    
    /**
     * 简要描述
     *
     * @Author: ASuLe
     * @Date: 2023/1/13 18:53
     * @Version: 1.0
     * @Description: 文件作用详细描述....
     */
    @RestController
    @Slf4j
    public class OrderFeignController {
    
        @Resource
        private PaymentFeignService paymentFeignService;
    
        @GetMapping("/consumer/payment/get/{id}")
        public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){
            return paymentFeignService.getPaymentById(id);
        }
    
    }
    
    

7.测试

  1. 先启动2个eureka集群7001/7002
  2. 再启动2个微服务8001/8002
  3. 启动FeignOrder80
  4. 访问http://localhost/consumer/payment/get/1
  5. 重点:Feign自带负载均衡配置项

第一次查询
在这里插入图片描述
第二次查询
在这里插入图片描述

8.小总结

在这里插入图片描述

3.OpenFeign超时控制

对于服务提供者支付微服务,这个业务处理完成需要3s对支付微服务而言是正常的,但是对于消费者而言只能等待2s,那这样就会导致时间差,就会导致超时调用报错

超时设置,故意设置超时演示出错情况

  1. 服务提供方8001故意写暂停程序
    服务提供方8001控制层添加

    @GetMapping(value = "/payment/feign/timeout")
    public String paymentFeignTimeOut() {
        System.out.println("*****paymentFeignTimeOut from port: " + serverPort);
        //暂停几秒钟线程
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return serverPort;
    }
    

    在这里插入图片描述

  2. 服务消费方80添加超时方法PaymentFeignService

    @GetMapping(value = "/payment/feign/timeout")
    public String paymentFeignTimeOut();
    

    在这里插入图片描述

  3. 服务消费方80添加超时方法OrderFeignController

    @GetMapping(value = "/consumer/payment/feign/timeout")
    public String paymentFeignTimeOut(){
        //OpenFeign底层有Ribbon,客户端一般默认等待1s
        return paymentFeignService.paymentFeignTimeOut();
    }
    

    在这里插入图片描述

  4. 测试
    访问8001
    在这里插入图片描述
    访问80
    在这里插入图片描述

    OpenFeign默认等待1秒钟,超过后报错

    默认Feign客户端只等待一秒钟,但是服务端处理需要超过1秒钟,导致Feign客户端不想等待了,直接返回报错。为了避免这样的情况,有时候我们需要设置Feign客户端的超时控制

OpenFeign默认支持Ribbon

在这里插入图片描述

天生支持负载均衡,它的超时控制也由Ribbon来进行限制

YML文件里需要开启OpenFeign客户端超时控制

#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
  #指的是建立连接后从服务器读取到可用资源所用的时间
  ReadTimeout: 5000
  #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
  ConnectTimeout: 5000

在这里插入图片描述
重新测试
在这里插入图片描述

但是此时如果Payment8002没有配置超时接口,那刷新一次就是8001的方法调用,再刷新一次就是8002的方法调用,但由于8002没有这个方法所以会报错

4.OpenFeign日志打印功能

在这里插入图片描述

4.1日志打印功能

我们现在通过OpenFeign80端口去调用8001支付,我们可能需要用到头,状态码,时间,接口,需要更加明细的了解Feign的调用,OpenFeign自身就提供了日志打印功能,方便调整。

4.2是什么

  • Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节。
  • 说白了就是对Feign接口的调用情况进行监控和输出

4.3日志级别

  • NONE:默认的,不显示任何日志

  • BASIC:仅记录请求方法、URL、响应状态码及执行时间

  • HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息

  • FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据

4.4配置日志bean

package com.atguigu.springcloud.config;

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;



/**
 * 简要描述
 *
 * @Author: ASuLe
 * @Date: 2023/1/13 19:26
 * @Version: 1.0
 * @Description: 文件作用详细描述....
 */
@Configuration
public class FeignConfig {

    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}

4.5YML文件里需要开启日志的Feign客户端

logging:
  level:
    # feign日志以什么级别监控哪个接口
    com.atguigu.springcloud.service.PaymentFeignService: debug

在这里插入图片描述

4.6后台日志查看

测试
在这里插入图片描述
日志非常详细
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/161095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式-JDBC中的桥接模式

一、首先看整个brige模式的结构图。如下&#xff1a;Abstraction — 抽象化角色&#xff1a;定义抽象的接口&#xff0c;包含一个对实现化角色的引用Refined Abstraciotn — 扩展抽象化角色&#xff1a;抽象化角色的子类&#xff0c;实现父类中的业务方法&#xff0c;并通过组合…

录屏专家怎么用?录屏软件使用教程(附下载)

想要更好地录制电脑屏幕可以使用电脑录屏专家&#xff0c;但有很多人在安装录屏专家之后&#xff0c;不知道如何使用。录屏专家怎么用&#xff1f;怎样使用录屏专家录制电脑屏幕&#xff1f;下面小编给您分享录屏软件使用的教程&#xff08;附安装教程&#xff09;&#xff0c;…

RabbitMQ实战:性能和安全

本系列是「RabbitMQ实战&#xff1a;高效部署分布式消息队列」书籍的总结笔记。 前两篇介绍了RabbitMQ在可用性、监控方面的考虑&#xff0c;这是基础保障&#xff0c;因为在某些场景下是不容许丢失消息的&#xff0c;但它和性能往往是对立的&#xff0c;需要根据业务场景做取舍…

JSP SSM众包网站系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP SSM众包网站系统 是一套完善的系统源码&#xff0c;对理解JSP java SrpingMVC mybiats 框架 MVC编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;以及相应配套的设计文档&#xff0c;系统主要采用B/S模式开发。 研究的基本内容…

JUC并发编程学习笔记——CAS个人理解

1. CAS引出 1.1 悲观锁 顾名思义&#xff0c;就是比较悲观的锁&#xff0c;总是假设最坏的情况&#xff0c;每次去拿数据的时候都认为别人会修改&#xff0c;所以每次在拿数据的时候都会上锁&#xff0c;这样别人想拿这个数据就会阻塞直到它拿到锁&#xff08;共享资源每次只…

什么是 HTTP?

什么是 HTTP&#xff1f; 超文本传输协议 (HTTP) 是万维网的基础&#xff0c;用于通过超文本链接加载网页。HTTP 是应用程序层协议&#xff0c;旨在在联网设备之间传输信息&#xff0c;并在网络协议栈的其他层之上运行。HTTP 上的典型流涉及客户端计算机向服务器发出请求&…

2023CUPT第十四题 射流的折射 思路与解法

文章未完首先声明一点&#xff0c;这个题我还没想好最后的答案&#xff0c;欢迎交流&#xff08;备注&#xff1a;博主今年不参加CUPT 博主去做电子设计大赛了&#xff01;有电赛谁还玩CUPT啊&#xff09;声明2&#xff1a;博主没有学过流体力学所以。。声明3&#xff1a;博主的…

[oeasy]python0045_转化为10进制数_int_integrate_integer_entire_整数

转化为10进制 回忆上次内容 上这次总结了四种进制 函数名对应单词进制类型数字事例前缀bin()binary20b11000010boct()octal80o1410ohex()hexadecimal160x610x?decimal1097无 十进制数 可以转化 为 其他进制 的 字符串状态 那反过来 其他进制形态的字符串 可以转化回 10进制…

Qt 自带标题处理方法思路

目录 需求 相关方法也有两种 1.只需要继承QAbstractNativeEventFilter类&#xff0c;从写放nativeEventFilter&#xff0c;并调用安装函数installNativeEventFilter 2.第二种是Qt提供的继承QWidget 重写bool nativeEvent(const QByteArray &eventType, void *message, …

RocketMQ事务消息原理简析

零、业务场景 在项目中&#xff0c;经常遇到这样一个场景&#xff0c;需要保证数据持久化和消息发送要么同时成功&#xff0c;要么同时失败。比如当用户在交易系统下了一个订单&#xff0c;购物车需要消费订单消息清除加购数据、积分系统需要变更用户积分、短信平台需要给买家…

如何选择显示检波器

之所以介绍频谱仪的显示检波器&#xff0c;是因为在宽带信号功率测试、功率谱密度测试及相噪测试等应用中&#xff0c;对显示检波器的选择有一定的要求。如果选择的检波器不合适&#xff0c;那么将无法准确完成测试。本文的目的也是想让初学者对这一块内容有更多的认识&#xf…

新手运营适合哪个跨境电商平台

很多企业的网站被收录却没有排名&#xff0c;关键词优化不上去&#xff0c;网站也没有什么流量&#xff0c;不断更新文章&#xff0c;即使是原创&#xff0c;也排不上去&#xff0c;这究竟是由于哪些原因造成的呢&#xff1f;米贸搜作为专业的SEO平台&#xff0c;整理了以下几种…

茶叶为啥那么贵?

60000个嫩芽才制作一斤好茶 茶叶采摘成本太高 如何通过机器人采茶&#xff1f; 趣讲大白话&#xff1a;茶叶贵是有道理滴 *********** 浙江理工大学智能采茶机器人 能自主识别茶树芽叶 控制机械臂进行精准采摘 芽叶识别准确率能达到82%左右 平均采摘速度2.5秒/颗 采摘成功率达…

【NI Multisim 14.0原理图的设计——简单电路设计】

目录 &#x1f95d;&#x1f95d;序言 &#x1f34d;1.使用菜单命令 &#x1f34d;2.右键快捷命令 &#x1f34d;3. 使用快捷键 &#x1f95d;&#x1f95d;一、放置导线 &#x1f34d;1.自动连线 &#x1f34d;2. 手动连线 &#x1f34d; 3.设置导线的属性 &#x1f3…

单目ADAS系列教程-相机基础篇

文章目录前言相机相关的4大坐标系像素坐标系与图像坐标系的转换图像坐标系与相机坐标系的转换相机坐标系与世界坐标系的转换相机畸变标定方法小结前言 PS&#xff1a;本文仅讨论针孔模型相机&#xff0c;其余类型相机并不涉及&#xff01; 相机基础包括相机内参&#xff0c;相…

(1)WireShark

1.工具简介(1)定义WireShark是一个网络封包分析软件。网络封包分析软件的功能是抓取网络封包&#xff0c;并尽可能显示出最为详细的网络封包资料。使用WinPACA作为接口&#xff0c;直接与网卡进行数据报文交换。(2)嗅探器工作原理收集&#xff1a;从网络线缆上收集原始二进制数…

Redis客户端命令基础操作二

目录 Redis中五种常用的结构&#xff1a; 字符串&#xff1a;String 字符串可以存储三种类型的值:字节串、整数、浮点数 列表&#xff1a;List Redis中五种常用的结构&#xff1a; 字符串(string)、列表(list)、集合(set)、散列(hash)、有序集合(zset)客户端基础命令操作 字…

Java项目:旅游网站管理系统设计和实现(java+springboot+jsp+mysql+spring)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 运行环境: java jdk 1.8 IDE环境&#xff1a; IDEA tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 主要功能说明&#xff1a; 管理员角色包含以下功能&#xff1a;管理员登录,用户管理,旅游路线管…

集装箱号识别率99.98%+实时返回结果高泛化,全球领先飞瞳引擎集装箱识别检测云服务全球三千企业用户,集装箱信息识别铅封识别免费

飞瞳引擎™AI集装箱识别检测云服务全球三千企业使用&#xff0c;顶尖AI科技集装箱号识别率99.98%以上高泛化性高鲁棒性&#xff0c;可二次开发或小程序拍照使用&#xff0c;集装箱号铅封号识别API免费实时返回结果。CIMCAI是全球规模领先应用范围领先&#xff0c;核心技术领先的…

帆软数据决策平台连接SAP RFC实例

一、介绍由于SAP ABAP开发出来的报表很单一&#xff0c;形式很有限&#xff0c;而且调整报表格式和形式都显得特别的鸡肋&#xff0c;所以现在将SAP系统通过RFC接口模式接入到帆软报表数据决策平台下展示。本文将详细介绍如何将数据从SAP传输到帆软平台上。二、准备工作首先得先…