004-OpenFeign服务接口调用

news2024/11/13 9:29:56

文章目录

  • 1 简介
  • 2 OpenFeign 通用步骤
    • 2.1 建module
    • 2.2 改POM
    • 2.3 写YML
    • 2.3 主启动类
    • 2.4 cloud-api-commons模块修改
      • 2.4.1 按照架构说明进行编码准备
      • 2.4.2 引入openfeign依赖
      • 2.4.3 新建服务接口PayFeignApi
    • 2.5 编写controller
    • 2.6 测试
    • 2.7 总结
  • 3 OpenFeign高级特性
    • 3.1 注意
    • 3.2 OpenFeign超时控制
      • 3.2.1 超时设置,故意设置超时演示出错情况,自己使坏写bug
      • 3.2.2 服务提供方cloud-provider-payment8001故意写暂停62秒钟程序
      • 3.2.3 服务调用方cloud-consumer-feign-order80写好捕捉超时异常
      • 3.2.4 测试
      • 3.2.5 结论
      • 3.2.6 官网解释+配置处理
      • 3.2.7 修改cloud-consumer-feign-order80的YML文件
      • 3.2.8 三秒测试
    • 3.3 OpenFeign重试机制
      • 3.3.1 默认重试是关闭的,给了默认值
      • 3.3.2 默认关闭重试机制,测试看看
      • 3.3.3 开启Retryer功能
      • 3.3.4 测试
      • 3.3.5 打开OpenFeign日志
      • 3.3.6 测试
    • 3.4 OpenFeign默认HttpClient修改
      • 3.4.1 是什么
      • 3.4.2 如何查看
      • 3.4.3 替换
        • 3.4.3.1 FeignConfig类里面将Retryer属性修改为默认
        • 3.4.3.2 POM修改
        • 3.4.3.3 Apache HttpClient5 配置开启说明
        • 3.4.3.4 YML修改
      • 3.4.4测试
    • 3.5 OpenFeign请求/响应压缩
      • 3.5.1是什么
      • 3.5.2 改YML
      • 测试,后台日志查看
    • 3.6 OpenFeign和Sentinel集成实现fallback服务降级 后续springcloud alibaba篇章会写,之后会在此处加说明

通过百度网盘分享的文件:springcloud
链接:https://pan.baidu.com/s/1_hU27PMZb5UM8E3ZbkfRUg
提取码:msr3

官网翻译:https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#spring-cloud-feign
github:https://github.com/spring-cloud/spring-cloud-openfeign

1 简介

  1. 可插拔的注解支持,包括Feign注解和JAX-RS注解
  2. 支持可插拔的HTTP编码器和解码器
  3. 支持Sentinel和它的Fallback
  4. 支持SpringCloudLoadBalancer的负载均衡
  5. 支持HTTP请求和响应的压缩

2 OpenFeign 通用步骤

服务消费者80 → 调用含有@FeignClient注解的Api服务接口 → 服务提供者(8001/8002)
在这里插入图片描述

2.1 建module

创建模块:cloud-consumer-feign-order80

feign在消费端使用

2.2 改POM

<dependencies>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- httpclient5-->
        <dependency>
            <groupId>org.apache.httpcomponents.client5</groupId>
            <artifactId>httpclient5</artifactId>
            <version>5.3</version>
        </dependency>
        <!-- feign-hc5-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-hc5</artifactId>
            <version>13.1</version>
        </dependency>
        <!--SpringCloud consul discovery-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包 -->
        <dependency>
            <groupId>com.msr.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--web + actuator-->
        <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>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--hutool-all-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>
        <!--fastjson2-->
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
        </dependency>
        <!-- swagger3 调用方式 http://你的主机IP地址:5555/swagger-ui/index.html -->
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

2.3 写YML

**server:
  port: 80

spring:
  application:
    name: cloud-consumer-openfeign-order
  ####Spring Cloud Consul for Service Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        prefer-ip-address: true #优先使用服务ip进行注册
        service-name: ${spring.application.name}**

2.3 主启动类

修改为:MainOpenFeign80

主启动类上面配置@EnableFeignClients表示开启OpenFeign功能并激活

@SpringBootApplication
@EnableDiscoveryClient//该注解用于向使用consul为注册中心时注册服务
@EnableFeignClients//启用feign客户端,定义服务+绑定接口,以生命式的方法优雅而简单的实现服务调用
public class MainOpenFeign80 {
    public static void main(String[] args) {
        SpringApplication.run(MainOpenFeign80.class,args);
    }
}

2.4 cloud-api-commons模块修改

2.4.1 按照架构说明进行编码准备

订单模块要去调用支付模块,订单和支付两个微服务,需要通过Api接口解耦,一般不要在订单模块写非订单相关的业务,

自己的业务自己做+其它模块走FeignApi接口调用
在这里插入图片描述
在这里插入图片描述

2.4.2 引入openfeign依赖

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

2.4.3 新建服务接口PayFeignApi

类添加注解:@FeignClient(value = “cloud-payment-service”)//value填写对应的服务名
并参考8001的controller层,添加方法

@FeignClient(value = "cloud-payment-service")
public interface PayFeignApi {
    @PostMapping("/pay/add")
    public ResultData addPay(PayDTO payDTO);

    @GetMapping("/pay/get/{id}")
    public ResultData getPayInfo(@PathVariable("id") Integer id);

    @GetMapping("/pay/get/info")
    public String mylb();
}

2.5 编写controller

cloud-consumer-feign-order80模块controller编写
创建OrderController类

@RestController
public class OrderController {

    @Resource
    private PayFeignApi payFeignApi;
    @PostMapping(value = "/feign/pay/add")
    public ResultData addOrder(@RequestBody PayDTO payDTO){
        ResultData resultData = payFeignApi.addPay(payDTO);
        return resultData;
    }
    @GetMapping(value = "feign/pay/get/{id}")
    public ResultData getPayInfo(@PathVariable("id") Integer id){
        System.out.println("-------支付微服务远程调用,按照id查询订单支付流水信息");
        ResultData resultData = null;
        try
        {
            System.out.println("调用开始-----: "+ DateUtil.now());
            resultData = payFeignApi.getPayInfo(id);
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("调用结束-----: "+ DateUtil.now());
            ResultData.fail(ReturnCodeEnum.RC500.getCode(),e.getMessage());
        }
        return resultData;
    }

    @GetMapping(value = "feign/pay/mylb")
    public String mylb(){
        return payFeignApi.mylb();
    }

}

2.6 测试

测试是否连通

  1. 先启动consul服务器
  2. 启动服务8001
  3. 启动cloud-consumer-feign-order80
  4. 测试:http://localhost/feign/pay/get/1

测试OpenFegin默认集成了LoadBalancer

  1. 启动服务8002
  2. 测试:http://localhost/feign/pay/mylb

2.7 总结

在这里插入图片描述

3 OpenFeign高级特性

3.1 注意

OpenFeign版本要注意,最新版和网络上你看到的配置不一样

3.2 OpenFeign超时控制

在Spring Cloud微服务架构中,大部分公司都是利用OpenFeign进行服务间的调用,而比较简单的业务使用默认配置是不会有多大问题的,但是如果是业务比较复杂,服务要进行比较繁杂的业务计算,那后台很有可能会出现Read Timeout这个异常,因此定制化配置超时时间就有必要了

3.2.1 超时设置,故意设置超时演示出错情况,自己使坏写bug

3.2.2 服务提供方cloud-provider-payment8001故意写暂停62秒钟程序

在这里插入图片描述

3.2.3 服务调用方cloud-consumer-feign-order80写好捕捉超时异常

在这里插入图片描述

3.2.4 测试

http://localhost/feign/pay/get/1
在这里插入图片描述

3.2.5 结论

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

3.2.6 官网解释+配置处理

在这里插入图片描述
默认OpenFeign客户端等待60秒钟,但是服务端处理超过规定时间会导致Feign客户端返回报错。

为了避免这样的情况,有时候我们需要设置Feign客户端的超时控制,默认60秒太长或者业务时间太短都不好

yml文件中开启配置:
connectTimeout 连接超时时间
readTimeout 请求处理超时时间
在这里插入图片描述

3.2.7 修改cloud-consumer-feign-order80的YML文件

server:
  port: 80

spring:
  application:
    name: cloud-consumer-openfeign-order
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        prefer-ip-address: true #优先使用服务ip进行注册
                service-name: ${spring.application.name}
    openfeign:
      client:
        config:
          default:
            #连接超时时间
            connectTimeout: 3000
            #读取超时时间
            readTimeout: 3000

3.2.8 三秒测试

在这里插入图片描述

3.3 OpenFeign重试机制

3.3.1 默认重试是关闭的,给了默认值

在这里插入图片描述

3.3.2 默认关闭重试机制,测试看看

http://localhost/feign/pay/get/1
结果,只会调用一次后就结束
在这里插入图片描述

3.3.3 开启Retryer功能

feign80服务新增配置类FeignConfig并修改Retryer配置

@Configuration
public class FeignConfig
{
    @Bean
    public Retryer myRetryer()
    {
        //return Retryer.NEVER_RETRY; //Feign默认配置是不走重试策略的

        //最大请求次数为3(1+2),初始间隔时间为100ms,重试间最大间隔时间为1s
        return new Retryer.Default(100,1,3);
    }
}

3.3.4 测试

测试完成耗时12秒
只有时间没有看到三次调用的过程,看后续打开日志
在这里插入图片描述

3.3.5 打开OpenFeign日志

1.在FeignConfig配置类里添加OpenFeign的log

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

@Configuration
public class FeignConfig {
    @Bean
    public Retryer myRetryer()
    {
//        return Retryer.NEVER_RETRY; //Feign默认配置是不走重试策略的

        //最大请求次数为3(1+2),初始间隔时间为100ms,重试间最大间隔时间为1s
        return new Retryer.Default(100,1,3);
    }

    /**
     * log日志
     * @return
     */
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

2.修改yml
logging.level.com.msr.cloud.apis.PayFeignApi:debug

# feign日志以什么级别监控哪个接口
logging:
  level:
    com:
      msr:
        cloud:
          apis:
            PayFeignApi: debug 

3.3.6 测试

再次测试就会看到三次调用

3.4 OpenFeign默认HttpClient修改

3.4.1 是什么

OpenFeign中http client
如果不做特殊配置,OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求,

由于默认HttpURLConnection没有连接池、性能和效率比较低,如果采用默认,性能上不是最牛B的,所以加到最大。

3.4.2 如何查看

替换之前,还是按照超时报错的案例
在这里插入图片描述

3.4.3 替换

3.4.3.1 FeignConfig类里面将Retryer属性修改为默认
Configuration
public class FeignConfig
{
    @Bean
    public Retryer myRetryer()
    {
        return Retryer.NEVER_RETRY; //Feign默认配置是不走重试策略的
    }
}
3.4.3.2 POM修改
<!-- httpclient5-->
<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.3</version>
</dependency>
<!-- feign-hc5-->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-hc5</artifactId>
    <version>13.1</version>
</dependency>
3.4.3.3 Apache HttpClient5 配置开启说明
#  Apache HttpClient5 配置开启
spring:
  cloud:
    openfeign:
      httpclient:
        hc5:
          enabled: true
3.4.3.4 YML修改
server:
  port: 80

spring:
  application:
    name: cloud-consumer-openfeign-order
  ####Spring Cloud Consul for Service Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        prefer-ip-address: true #优先使用服务ip进行注册
        service-name: ${spring.application.name}
    openfeign:
      client:
        config:
          default:
            connectTimeout: 4000 #连接超时时间
                        readTimeout: 4000 #读取超时时间
            httpclient:
          hc5:
            enabled: true
          #cloud-payment-service:
            #connectTimeout: 4000 #连接超时时间
                        #readTimeout: 4000 #读取超时时间

3.4.4测试

在这里插入图片描述

3.5 OpenFeign请求/响应压缩

3.5.1是什么

对请求和响应进行GZIP压缩
Spring Cloud OpenFeign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。
通过下面的两个参数设置,就能开启请求与相应的压缩功能:
spring.cloud.openfeign.compression.request.enabled=true
spring.cloud.openfeign.compression.response.enabled=true

细粒度化设置
对请求压缩做一些更细致的设置,比如下面的配置内容指定压缩的请求数据类型并设置了请求压缩的大小下限,
只有超过这个大小的请求才会进行压缩:
spring.cloud.openfeign.compression.request.enabled=true
spring.cloud.openfeign.compression.request.mime-types=text/xml,application/xml,application/json #触发压缩数据类型
spring.cloud.openfeign.compression.request.min-request-size=2048 #最小触发压缩的大小

3.5.2 改YML

server:
  port: 80

spring:
  application:
    name: cloud-consumer-openfeign-order
  ####Spring Cloud Consul for Service Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        prefer-ip-address: true #优先使用服务ip进行注册
        service-name: ${spring.application.name}
    openfeign:
      client:
        config:
          default:
          #cloud-payment-service:
            #连接超时时间
                        connectTimeout: 4000
            #读取超时时间
                        readTimeout: 4000
      httpclient:
        hc5:
          enabled: true
      compression:
        request:
          enabled: true
          min-request-size: 2048 #最小触发压缩的大小
          mime-types: text/xml,application/xml,application/json #触发压缩数据类型
        response:
          enabled: true

测试,后台日志查看

带着压缩调用
在这里插入图片描述
去掉压缩调用
在这里插入图片描述

3.6 OpenFeign和Sentinel集成实现fallback服务降级 后续springcloud alibaba篇章会写,之后会在此处加说明

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

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

相关文章

QGC 修改为双路视频介绍

文章目录 一、效果图二、简要流程关于QGC地面站其它文章请点击这里: QGC地面站 一、效果图 右下角切换视频通道; 左下角切换地图与当前的视频 二、简要流程 ● C++ 后端 C++ 中利用 QGC 原有的红外热成像视频流,修改几处即可 // src\VideoManager\VideoManager.cc Vi…

快排找基准值之挖坑法

思路&#xff1a;把数组里第一个数据拿出来记为标准值&#xff0c;然后两边交替&#xff0c;从右往左找比基准值小的数据放到前面缺数据的坑里。放完后该位置也缺数据成为了新的坑&#xff0c;再把坑的下标移到新的位置。 从左到右找比基准值大的数据&#xff0c;后面同理。 …

装饰器(Decorators)的实现

1、Python 中的函数可以像普通变量一样当做参数传递给另外一个函数&#xff1b; 2、装饰器&#xff1a;不修改函数源码但是要实现给函数添加额外功能。python使用语法糖即来实现装饰器。 3、装饰器的作用&#xff1a; &#xff08;1&#xff09;抽离出大量函数中与函数功能本…

Spring框架 基础介绍

目录 Spring框架 IOC: AOP: 一站式&#xff1a; spring搭建 Maven 导入 spring 核心基础 jar 编写 spring 配置文件 编写一个 User 实体类 测试 spring IOC(控制反转) 依赖注入&#xff1a; 1、通过属性注入 2、通过构造方法注入 spring中bean管理 1、基于xml配置方…

AI模型:追求全能还是专精?

AI模型&#xff1a;追求全能还是专精&#xff1f; 近日&#xff0c;OpenAI预计在秋季推出代号为“草莓”的新AI。从专注于数学问题到处理主观营销策略&#xff0c;"草莓"模型展现出惊人的多样性。而这种全能型 AI 是否代表了未来趋势&#xff1f;相比专攻于某一领域…

I get HttpClient.Timeout Error in C# OpenAI library

题意&#xff1a;“我在 C# OpenAI 库中遇到 HttpClient.Timeout 错误。” 问题背景&#xff1a; I am using the OpenAI library in my c# project, but I get the following error if it does not receive a response for more than 100 seconds. I cannot add a custom htt…

宠物空气净化器应该怎么选择?希喂、IAM、有哈哪款性价比高

在当今社会&#xff0c;养宠已然渐渐成为现在年轻人生活中的一种标配。可爱的宠物们以它们的忠诚、活泼与温暖&#xff0c;给予像我们这类年轻人无尽的陪伴。这种陪伴在时光的消逝中渐渐升华&#xff0c;成为年轻人心灵的慰藉和生活中不可或缺的一部分。然而&#xff0c;在享受…

【软件测试】软件测试生命周期与Bug

目录 &#x1f4d5; 前言 &#x1f334;软件测试的生命周期 ​编辑&#x1f332;BUG &#x1f6a9; 概念 &#x1f6a9;描述bug的要素 &#x1f6a9;bug的级别 &#x1f6a9;bug的生命周期 &#x1f3c0;先检查自身&#xff0c;是否bug描述不清楚 &#x1f3c0;站在用…

JavaScript学习文档(9):事件流、事件委托、其他事件、元素尺寸与位置

目录 一、事件流 1、事件流的两个阶段 2、事件捕获 3、事件冒泡 4、阻止冒泡 5、解绑事件 &#xff08;1&#xff09;解绑事件 &#xff08;2&#xff09;鼠标经过事件区别 二、事件委托 1、优点 2、原理 3、实现 4、tab栏切换案例改造 三、其他事件 1、页面加载…

不可不知的HDMI之前世今生

1、HDMI的产生 2002年4月&#xff0c;来自电子电器行业的7家公司——日立、松下、飞利浦、SiliconImage、索尼、汤姆逊、东芝&#xff0c;共同组建了HDMI接口组织——HDMIFounders&#xff08;HDMI论坛&#xff09;&#xff0c;开始着手制定一种符合高清时代标准的全新数字化视…

nginx转发接口地址【非常实用】

使用场景 由于客户的需求是要访问一个外网接口 比如http://58.20.57.190:6652 实例 http://58.20.57.190:6652//uploadBasePatient?Barcode1000000073&customerCode1 比如外网才能访问&#xff0c;科室电脑是访问不了外网的 我们就需要中间在一个既有外网又有内网的前置…

数据结构(邓俊辉)学习笔记】串 09——BM_BC算法:以终为始

文章目录 1. 不对称性2. 善待教训3.前轻后重4.以终为始 1. 不对称性 上一节所介绍的 KMP 算法计算时间&#xff0c;在最坏情况下也可以保证不超过线性。这的确是一个好消息。然而&#xff0c;倘若我们因此就停下继续优化的脚步&#xff0c;那就大错特错了。 实际上&#xff0c…

如何在Java爬虫中设置代理IP:详解与技巧

在进行网络爬虫时&#xff0c;使用代理IP可以有效地避免被目标网站封禁&#xff0c;提升数据抓取的成功率。本文将详细介绍如何在Java爬虫中设置代理IP&#xff0c;并提供一些实用的技巧和示例代码。 为什么需要代理IP&#xff1f; 在进行爬虫操作时&#xff0c;频繁的请求可能…

深度学习基础—彩色图片的卷积运算

深度学习基础—卷积运算http://t.csdnimg.cn/2mRei 上篇文章卷积运算实际是灰度图像的运算&#xff08;2维空间&#xff09;&#xff0c;但是实际中我们彩色图片使用的更多&#xff0c;和灰度图像不同的是&#xff1a;彩色图片是由三原色&#xff08;红、绿、蓝&#xff09;组成…

C# 对桌面快捷方式的操作设置开机启动项

首先在项目中引入Windows Script Host Object Model&#xff0c;引入方式如下图。 对于桌面快捷方式的修改无非就是将现有的快捷方式修改和添加新的快捷方式。 1、遍历桌面快捷方式&#xff0c;代码如下。 string desktopPath Environment.GetFolderPath(Environment.Special…

机器学习:DBSCAN算法(内有精彩动图)

目录 前言 一、DBSCAN算法 1.动图展示&#xff08;图片转载自网络&#xff09; 2.步骤详解 3.参数配置 二、代码实现 1.完整代码 2.代码详解 1.导入数据 2.通过循环确定参数最佳值 总结 前言 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications w…

World of Warcraft [CLASSIC][80][Grandel] Call to Arms: Strand of the Ancients

Call to Arms: Strand of the Ancients - Quest - 魔兽世界怀旧服CTM4.34《大地的裂变》数据库_大灾变85级魔兽数据库_ctm数据库 Call to Arms: Strand of the Ancients 战斗的召唤&#xff1a;远古海滩 打掉最后一个门【古代圣物之厅】&#xff0c;人跳进去就赢了

算法之二分查找法和双指针

用二分查找法刷leetcode算法题目的时候&#xff0c;经常遇到视频看着理解很透彻&#xff0c;当上手写时一看就会&#xff0c;一写就废。二分查找法涉及边界条件很多&#xff0c;逻辑很简单&#xff0c;就是写不好。何时写 while(left<right)&#xff0c;while(left<right…

【动态规划】背包问题 - 二维费用的01背包问题

文章目录 1. 前言2. 二位费用的01背包问题2.1_一和零2.2_盈利计划2.3_珠宝的最高价值 3. 似包非包问题3.1_不同的二叉搜索树3.2_组合总和Ⅳ 1. 前言 关于 动态规划的理解 与例题&#xff0c;点击&#x1f447; 【动态规划】C解决斐波那契模型题目&#xff08;三步问题、爬楼梯…

winXP下构建python开发环境

近期车间有个动平衡检测仪数采的需求&#xff0c;工控机是xp系统&#xff0c;原理也很简单&#xff0c;监控文件变化&#xff0c;发现有新的检测数据就调用远程接口传输到服务器上去。 通常python监控文件变化会用watchdog这个库&#xff0c; 可是xp太老了&#xff0c;测试了一…