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,一经查实,立即删除!

相关文章

牛客网KY267 对称平方数1

题目 描述&#xff1a; 打印所有不超过256&#xff0c;其平方具有对称性质的数。如2&#xff0c;11就是这样的数&#xff0c;因为2*24&#xff0c;11*11121。 输入描述&#xff1a; 无任何输入数据 输出描述&#xff1a; 输出具有题目要求的性质的数。如果输出数据不止一组&…

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

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

单例模式模板

//单例模板 template <typename T> class Singleton {//使用默认构造和析构函数Singleton() default;~Singleton() default; public://删除默认的移动、拷贝、赋值、取址Singleton(Singleton &&) delete;Singleton(const Singleton &) delete;void op…

hutool导入导出多sheet页的Excel

背景 有个功能需要导入导出多sheet页的Excel&#xff0c;以前用poi搞&#xff0c;想试下用hutool处理一下。接口已弄完&#xff0c;简单总结一下。 导入 controller 正常使用就行&#xff0c;header的参数用来确认租户 ApiOperation(value "导入字段分组excel",…

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…

vue和js常识

计算属性computed是Vue.js中一种方便的属性类型&#xff0c;用于在模板中进行复杂计算和逻辑处理。它们的特点是具有缓存机制&#xff0c;只有在相关依赖发生改变时才会重新计算&#xff0c;避免不必要的重复计算。 Vue.js 中的基础单位是组件。Vue.js的应用通常由一个个组件构…

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

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

热销商品-爬虫销量信息

技术部分详解 1、发送GET请求&#xff1a;使用requests库的get()方法发送GET请求来获取指定网页的内容。在这个例子中&#xff0c;使用了一个自定义的User-Agent&#xff0c;以模拟一个浏览器发送请求。 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) App…

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

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

Golang封装一个request类支持socks和http代理

Golang封装一个request类支持socks和http代理 1. 需要需用国外服务器做代理的时候 2. 需要使用代理服务器做白名单的时候 3. 代码还支持重试机制 封装代码如下 package utilsimport ("bytes""crypto/tls""errors""fmt""io/iou…

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

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

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

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

AIX上的MALLOCTYPE

您可以设置 AIX 中的 MALLOCTYPEwatson 环境变量&#xff0c;以用于 IBM JVM。对于大多数应用程序&#xff0c;因使用该变量而导致性能提升的可能性很低。 特别地&#xff0c;它将有益于所有在代码中大量使用 malloc 调用的应用程序。 Creating the archive (the shared objec…

【基础知识】DPO(Direct Preference Optimization)的原理以及公式是怎样的?

论文&#xff1a;Direct Preference Optimization: Your Language Model is Secretly a Reward Model 1.基本原理 DPO&#xff08;Direct Preference Optimization&#xff09;的核心思想是直接优化语言模型&#xff08;LM&#xff09;以符合人类偏好&#xff0c;而不是首先拟…

【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…