我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何用SpringCloud的OpenFeign进行服务调用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何用SpringCloud的OpenFeign进行服务调用

本篇内容介绍了“如何用SpringCloud的OpenFeign进行服务调用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

前言

Feign是一个声明式的Web服务客户端,是面向接口编程的。也就是说使用Feign,只需要创建一个接口并使用注解方式配置它,就可以完成对微服务提供方的接口绑定。

在使用RestTemplate时,每次调用服务都需要指定服务的具体路径,当在多个地方同时使用时要写多次,显得代码冗余也难以维护,而openfeign就可以避免这种操作。

1、OpenFeign

1.1、OpenFeign概述

是什么?

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

源码地址

能干嘛?

  • Feign旨在使编写Java Http客户端变得更容易。

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

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

Feign和OpenFeign的区别

FeignOpenFeign
Feign是SpringCloud组件中的一个轻量级restful的Http服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务OpenFeign是SpringCloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式实现类,实现类中做负载均衡并调用其他服务

1.2、OpenFeign的使用步骤

建Module

Module的名称为cloud-consumer-feign-order80。

改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">    <parent>        <artifactId>cloud02</artifactId>        <groupId>com.xiao</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>cloud-consumer-feign-order80</artifactId>    <!--openfeign-->    <dependencies>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-openfeign</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>        </dependency>        <dependency>            <groupId>com.xiao</groupId>            <artifactId>cloud-api-commons</artifactId>            <version>1.0-SNAPSHOT</version>        </dependency>        <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>

改YML

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

主启动

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

@EnableFeignClients开启OpenFeign

PaymentFeignService接口

import com.xiao.cloud.entities.CommonResult;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@FeignClient(value = "CLOUD-PAYMENT-SERVICE")  // 使用OpenFeignpublic interface PaymentFeignService {    @GetMapping("/payment/get/{id}")    public CommonResult getPaymentById(@PathVariable("id") Long id);}

@FeignClient(value = "CLOUD-PAYMENT-SERVICE")使用OpenFeign。

Controller类

import com.xiao.cloud.entities.CommonResult;import com.xiao.cloud.entities.Payment;import com.xiao.cloud.service.PaymentFeignService;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;@RestController@Slf4jpublic class PaymentFeignController {    @Autowired    private PaymentFeignService paymentFeignService;    @GetMapping("/consumer/payment/get/{id}")    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){        return paymentFeignService.getPaymentById(id);    }}

测试结果

如何用SpringCloud的OpenFeign进行服务调用

当我们多次点击刷新时,端口在8001和8002之间依次变化。

8. 小总结

如何用SpringCloud的OpenFeign进行服务调用

1.3、超时控制

1.3.1、是什么?

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

在yml文件中开启配置。

1.3.2、修改代码设置超时错误

1. 修改支付模块8001的Controller

添加以下代码

    @GetMapping(value = "/payment/feign/timeout")    public String timeOUt(){        try {            Thread.sleep(3000);        } catch (InterruptedException e) {            e.printStackTrace();        }        return ServerPort;    }

2. 修改订单模块的PaymentFeignService

添加以下代码

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

3. 修改订单模块的OrderFeignController

添加以下代码

    @GetMapping(value = "/consumer/payment/feign/timeout")    public String timeOUt(){        return paymentFeignService.timeOUt();    }

4. 测试结果

如何用SpringCloud的OpenFeign进行服务调用

直接对支付模块8001的暴露的服务接口进行调用,测验通过

如何用SpringCloud的OpenFeign进行服务调用

如果通过订单模块进行调用,那么就会报超时错误

1.3.3、进行超时配置

在订单模块的YML文件中添加以下代码

ribbon:  ReadTimeout:  8000  ConnectTimeout: 8000

1. 测试结果

如何用SpringCloud的OpenFeign进行服务调用

自测通过

1.4、日志打印

1.4.1、是什么?

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

1.4.2、日志级别
  1. NONE:默认的,不显示任何日志

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

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

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

1.4.3、如何开启日志打印

1. 编写日志配置类

import feign.Logger;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class FeignConfig {    @Bean    Logger.Level feignLoggerLevel(){        return Logger.Level.FULL;    }}

2. 在YML文件中进行相关配置

server:  port: 80eureka:  client:    register-with-eureka: false    service-url:      defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eurekaribbon:  ReadTimeout:  8000  ConnectTimeout: 8000logging:  level:    com.atguigu.springcloud.service.PaymentFeignService: debug

3. 测试结果

如何用SpringCloud的OpenFeign进行服务调用

4. 包结构图示

如何用SpringCloud的OpenFeign进行服务调用

“如何用SpringCloud的OpenFeign进行服务调用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何用SpringCloud的OpenFeign进行服务调用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何用SpringCloud的OpenFeign进行服务调用

本篇内容介绍了“如何用SpringCloud的OpenFeign进行服务调用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言Feign是一
2023-06-26

SpringCloud服务接口调用OpenFeign及使用详解

这篇文章主要介绍了SpringCloud服务接口调用——OpenFeign,在学习Ribbon时,服务间调用使用的是RestTemplate+Ribbon实现,而Feign在此基础上继续进行了封装,使服务间调用变得更加方便,需要的朋友可以参考下
2023-05-14

如何分析SpringCloud中的Ribbon进行服务调用的问题

这篇文章将为大家详细讲解有关如何分析SpringCloud中的Ribbon进行服务调用的问题,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、Robbon1.1、Ribbon概述(1)、Ri
2023-06-26

SpringCloud服务接口调用OpenFeign及使用的方法是什么

这篇“SpringCloud服务接口调用OpenFeign及使用的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“S
2023-07-05

SpringCloud openfeign声明式服务调用实现方法介绍

在springcloud中,openfeign是取代了feign作为负载均衡组件的,feign最早是netflix提供的,他是一个轻量级的支持RESTful的http服务调用框架,内置了ribbon,而ribbon可以提供负载均衡机制,因此feign可以作为一个负载均衡的远程服务调用框架使用
2022-12-08

如何使用Eclipse进行PHP的服务器端调试

这篇文章将为大家详细讲解有关如何使用Eclipse进行PHP的服务器端调试,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先,得将您PHP本地运行时的php.ini里的xdebug.remote_enab
2023-06-04

如何进行调用C++函数

如何进行调用C++函数,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在C++的语言中,和一些程序设计语言中,可以将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,这就
2023-06-17

SpringCloud微服务的调用与远程调用测试示例

这篇文章主要介绍了SpringCloud微服务的调用与远程调用测试示例,服务调用者-可以暂时认为是与用户交互的角色(因为存在微服务之间的调用),可以根据该用户的类型将其赋予不同的服务调用权限,通过一次http请求访问调用对应的微服务获取想要的数据
2023-05-14

Java/Web如何调用Hadoop进行MapReduce

这篇文章主要为大家展示了“Java/Web如何调用Hadoop进行MapReduce”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java/Web如何调用Hadoop进行MapReduce”这篇
2023-05-30

如何使用pdb进行Python调试

调试应用有时是一个不受欢迎的工作,当你长期编码之后,只希望写的代码顺利运行。但是,很多情况下,我们需要学习一个新的语言功能或者实验检测新的方法,从而去理解其中运行的机制原理。 即使不考虑这样的场景,调试代码仍然是有必要的,所以学会在工作中使
2022-06-02

WCF服务怎么利用JAVA进行调用

这篇文章给大家介绍WCF服务怎么利用JAVA进行调用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。.生成WCF客户端使用的就是上面提到的wsimport,如果您正确的配置了java环境变量,就可以直接在控制台中使用了,
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录