SpringCloud OpenFeign 服务接口调用

一、前言

        接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第四篇,即介绍 Feign 和 OpenFeign 服务接口调用。

二、概述

2.1 Feign 是什么

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

2.2 Feign 用途

2.2.1 Feign 能干什么

        Feign 旨在使编写 Java Http 客户端变得更容易。前面在使用 Ribbon + RestTemplate 时,利用 RestTemplate http 请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。

        所以,Feign 在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在 Feign 的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是 Dao 接口上面标注 Mapper 注解,现在是一个微服务接口上面标注一个 Feign 注解即可),即可完成对服务提供方的接口绑定,简化了使用 Spring cloud Ribbon 时,自动封装服务调用客户端的开发量。

2.2.2 Feign 集成了 Ribbon

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

2.3 Feign 和 OpenFeign 区别

        Feign Spring Cloud 组件中的一个轻量级 RESTful HTTP 服务客户端,Feign 内置了 Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。

        Feign 的使用方式是:使用 Feign 的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。需要引入的依赖如下:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

        OpenFeign Spring Cloud Feign 的基础上支持了 SpringMVC 的注解,如 @RequesMapping 等等。OpenFeign@FeignClient 可以解析 SpringMVC @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。需要引入的依赖如下:

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

三、OpenFeign 使用步骤

3.1 新建工程

        新建一个子模块工程 cloud-consumer-feign-order80,用于展示 OpenFeign 的使用步骤。

3.2 添加依赖

        在 pom.xml 中,添加如下的依赖:

<?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.springcloud</groupId><artifactId>SpringCloud</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.springcloud</groupId><artifactId>cloud-api-commons</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>

3.3 添加配置文件

        在 application.yml 中添加如下的配置信息:

server:port: 80eureka:client:register-with-eureka: falseservice-url:defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

3.3 修改启动类

        需要在启动类上添加 @EnableFeignClients 注解用于开启 OpenFeign 的使用,代码如下:

package com.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
// 开启 OpenFeign 
@EnableFeignClients
public class OrderFeignMain80
{public static void main(String[] args){SpringApplication.run(OrderFeignMain80.class,args);}
}

3.4 创建业务类

        创建业务逻辑接口 PaymentFeignService,并在接口上添加 @FeignClient 注解,代码如下所示:

package com.springcloud.service;import com.springcloud.entities.CommonResult;
import com.springcloud.entities.Payment;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@Component
// value 值是对外暴露的服务名称
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {@GetMapping(value = "/payment/get/{id}")CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);}

        创建控制层代码 OrderFeignController,用于对外提供服务,代码如下:

package com.springcloud.controller;import com.springcloud.entities.CommonResult;
import com.springcloud.entities.Payment;
import com.springcloud.service.PaymentFeignService;
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;@RestController
public class OrderFeignController {@Resourceprivate PaymentFeignService paymentFeignService;@GetMapping(value = "/consumer/payment/get/{id}")public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){return paymentFeignService.getPaymentById(id);}
}

3.5 测试

        分别启动 cloud-eureka-server7001cloud-eureka-server7002cloud-provider-payment8001cloud-provider-payment8002 cloud-consumer-feign-order80 模块,然后在浏览器输入 http://localhost/consumer/payment/get/1,进行测试,不断刷新界面如下图,可以看到,OpenFeign 还默认实现了负载均衡。

3.6 小结

四、OpenFeign 超时控制

4.1 简介

        默认 Feign 客户端只等待一秒钟,但是服务端处理需要超过 1 秒钟,导致 Feign 客户端不想等待了,直接返回报错。

4.2 现象演示

        在 cloud-provider-payment8001 模块的 PaymentController 中添加一个测试方法,如下:

@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;
}

        在 cloud-consumer-feign-order80 模块的 PaymentFeignService 中添加一个调用方法,代码如下:

@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {@GetMapping(value = "/payment/get/{id}")CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);@GetMapping(value = "/payment/feign/timeout")String paymentFeignTimeOut();}

        在 cloud-consumer-feign-order80 模块的 OrderFeignController 中添加一个调用方法,代码如下:

@RestController
public class OrderFeignController {@Resourceprivate PaymentFeignService paymentFeignService;@GetMapping(value = "/consumer/payment/get/{id}")public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){return paymentFeignService.getPaymentById(id);}@GetMapping(value = "/consumer/payment/feign/timeout")public String paymentFeignTimeOut(){return paymentFeignService.paymentFeignTimeOut();}
}

        分别启动 cloud-eureka-server7001cloud-eureka-server7002cloud-provider-payment8001 和 cloud-consumer-feign-order80 服务,然后在浏览器输入 http://localhost/consumer/payment/feign/timeout,进行测试,如下图,可以看到出现了超时的错误。

4.3 问题解决

        由于 OpenFeign 默认支持 Ribbon,所以只需要在 cloud-consumer-feign-order80 模块的 application.yml 中开启并配置 OpenFeign 的客户端超时控制即可,如下:

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

        重启 cloud-consumer-feign-order80 模块,重新调用测试的 url 如下图:

五、OpenFeign 日志打印功能

5.1 简介

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

5.2 日志级别

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

5.3 配置

        在 cloud-consumer-feign-order80 模块中新建一个配置类 FeignConfig ,代码如下:

package com.springcloud.config;import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FeignConfig {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}

        在 application.yml 中配置日志的 Feign 客户端,因为 spring 的默认日志级别是 info,而 openFegin 打印日志需要 debug,所以需要将 spring 日志级别改为 debug,在 application.yml 中,为了只打印 openFegin 日志,可以只将 openFegin 接口的包路径设置为 dubug

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

5.4 测试

        随便调用一个测试方法,后台输出的日志如下:

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

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

相关文章

C++程序设计-练手题集合【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下C程序设计中的练手题&#xff0c;以供大家期末复习和考研复习的时候使用。 C程序设计系列文章传送门&#xff1a; 第一章 面向对象基础 第四/五章 函数和类和对象 第六/七/八章 运算符重载/包含与继承/虚函数…

dolphin schedulerAPI调用(二)——创建任务

&#xff08;作者&#xff1a;陈玓玏&#xff09; API文档地址&#xff1a;http://192.168.3.100:21583/dolphinscheduler/swagger-ui/index.html?languagezh_CN&langcn#/task%20definition%20related%20operation/createTaskDefinitionUsingPOST_1 实际使用中&#x…

场的概念---数量场(标量场)和矢量场介绍理解

目录 一、场的概念 二、场的分类 三、数量场&#xff08;标量场&#xff09;的等值面 四、矢量场中的矢量线 矢量线方程推导&#xff1a; 一、场的概念 场在数学上是指一个向量到另一个向量或数的映射。场指物体在空间中的分布情况。场是用空间位置函数来表征的。在物理学…

雾锁王国专用服务器设置方法,基于阿里云1分钟开服!

阿里云雾锁王国服务器搭建教程是基于计算巢服务&#xff0c;3分钟即可成功创建Enshrouded游戏服务器&#xff0c;阿里云8核32G雾锁王国专用游戏服务器90元1个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com亲自整理雾锁王国服务器详细搭建教程&#xff1a; 一、前…

全自动内衣洗衣机什么牌子好?热心推荐四款全能硬核的内衣洗衣机

内衣洗衣机这一产品是专为有特殊需求的人士所研发的&#xff0c;其的容量往往都比较小&#xff0c;并且体积也很小巧&#xff0c;安装都非常便捷&#xff0c;作为“家中第二台”补充式洗衣机被很多人推崇&#xff0c;可以作为贴身衣物的专用洗衣机&#xff0c;那么这种内衣洗衣…

Kutools For Excel | 新增 300+ 高级功能

Kutools For Excel 是一个便捷的 Excel 插件&#xff0c;具有 300 多种高级功能&#xff0c;可将各种复杂的任务简化为在 Excel 中的几次单击。 功能强大且用户友好的加载项将为 Excel 用户节省大量工作时间&#xff0c;并大大提高工作效率。支持 Excel 2021 / 2019 / 2016 / …

【Linux】调试工具 - gdb

目录 一、gdb概述&#xff1a; 二、list&#xff08;查看源文件代码&#xff09;&#xff1a; 三、run&#xff08;运行程序&#xff09;&#xff1a; ​四、断点相关操作&#xff1a; 1、查看断点&#xff1a; 2、在指定行设置断点&#xff1a; 3、在函数入口处设置断…

[计算机效率] 便笺的使用

2.4 便笺 便笺程序是一种方便用户记录、查看和编辑便签的简单应用程序。在Windows系统中&#xff0c;便笺通常作为系统自带的实用工具之一&#xff0c;可以帮助用户快速创建、编辑和组织便签&#xff0c;以便随时记录重要的信息、任务或提醒事项。 便笺程序通常具有以下特点&a…

阿里云企业2核4G5M服务器ECS u1性能测评

阿里云服务器ECS u1实例&#xff0c;2核4G&#xff0c;5M固定带宽&#xff0c;80G ESSD Entry盘优惠价格199元一年&#xff0c;性能很不错&#xff0c;CPU采用Intel Xeon Platinum可扩展处理器&#xff0c;购买限制条件为企业客户专享&#xff0c;实名认证信息是企业用户即可&a…

Metasploit(MSF)使用教程(以ms17_010永恒之蓝为例)

一.Metasploit简介&#xff1a; Metasploit就是一个漏洞框架。它的全称叫做The Metasploit Framework&#xff0c;简称MSF。是一个免费、可下载的框架&#xff0c;通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。它本身附带数2000多个已知软件漏洞的专业级漏洞攻击工…

如何运用惟客数据CDP客户数据平台构建好用户画像?

​惟客数据CDP是一个企业级客户数据资产平台&#xff0c;能够跨平台整合全域客户数据&#xff0c;统一客户身份&#xff0c;实时全景客户画像&#xff0c;基于大数据计算和挖分析提供深度客户洞察&#xff0c;实现精细化运营和精准营销。部署更轻更快&#xff0c;快速实现企业数…

API接口数据集接口pytorch api接口获取数据

API是应用程序的开发接口&#xff0c;在开发程序的时候&#xff0c;我们有些功能可能不需要从到到位去研发&#xff0c;我们可以拿现有的开发出来的功能模块来使用&#xff0c;而这个功能模块&#xff0c;就叫做库(libary)。比如说&#xff1a;要实现数据传输的安全&#xff0c…

10分钟读懂Diffusion:图解Diffusion扩散模型

数据派THU 本文通过图解的方式让大家快速了解 Diffusion 原理。 [ 导读 ]想必大家都听说过——图像领域大火的深度生成模型Diffusion Model&#xff0c;为了让大家快速了解 Diffusion 原理&#xff0c;这篇文章我们通过图解的方式。希望对你有所帮助&#xff0c;让你在学习和应…

3D Gaussian Splatting for Real-Time Radiance Field Rendering(慢慢啃,还是挺复杂的)

三个关键要素 从相机配准的过程中得到的稀疏点云开始&#xff0c;使用3D Gaussian表示场景; 3D Gaussian: 是连续体积辐射场能够防止不必要的空空间优化。对 3D Gaussion进行交叉优化和密度控制: 优化各向异性血方差对场景精确表示。使用快速可视感知渲染算法来进行快速的训练…

CVE-2024-27199 JetBrains TeamCity 身份验证绕过漏洞2

漏洞简介 TeamCity Web 服务器中发现了第二个身份验证绕过漏洞。这种身份验证旁路允许在没有身份验证的情况下访问有限数量的经过身份验证的端点。未经身份验证的攻击者可以利用此漏洞修改服务器上有限数量的系统设置&#xff0c;并泄露服务器上有限数量的敏感信息。 项目官网…

当HR问你:“什么事会让你有成就感”你该怎么回答?【文章底部添加进大学生就业交流群】

当HR问你“什么事会让你有成就感”时&#xff0c;你可以通过以下方式回答&#xff1a; 强调目标实现&#xff1a; 表达你在达成挑战性目标时感到的满足感。举例说明你在过去的工作或项目中如何设定并成功实现了目标。 强调对团队成功的贡献&#xff1a; 谈论你与团队合作取得成…

Caffeine--实现进程缓存

本地进程缓存特点 缓存在日常开发中起着至关重要的作用, 由于存储在内存中, 数据的读取速度非常快,能大量减少对数据库的访问,减少数据库的压力. 缓存分为两类: 分布式缓存, 例如Redis: 优点: 存储容量大, 可靠性更好, 可以在集群间共享缺点: 访问缓存存在网络开销场景: 缓存数…

c++: 引用能否替代指针? 详解引用与指针的区别.

文章目录 前言1. 引用和指针的最大区别:引用不能改变指向2. 引用和指针在底层上面是一样的3. 引用和指针在sizeof面前大小不同4. 有多级指针,没有多级引用5.引用是引用的实体,指针会向后偏移同一个类型的大小 总结 前言 新来的小伙伴如果不知道引用是什么?可以看我的上一篇文…

el-table-column嵌套el-form-item不能进行校验问题解决

项目为vue3elementPlus开发的项目 业务要求&#xff1a;table表格展示数据&#xff0c;其中有一行是ip地址可展示可修改&#xff0c;此处要求增加自定义校验规则 先看一下效果&#xff1a; 此处先描述一下&#xff0c;问题出在了哪里&#xff0c;我将el-table的data,使用一个…

日常004:对文件、目录拥有rwx权限后可以做什么?

日常004&#xff1a;对文件、目录拥有rwx权限后可以做什么&#xff1f; ‍ 1.rwx权限针对文件的内容&#xff0c;而非文件本身。 2.文件夹是特殊的文件&#xff0c;它的内容就是ls -a​的所有文件和文件夹 r 读取目录w 添加、删除、重命名文件x 进入目录 ‍ 删除文件使用的是所…