springcloud-alibba之FeignClient

代码地址:springcloud系列: springcloud 组件分析拆解

1.FeignClient的集成

springboot版本:3.1.5

springcloud组件版本:2022.0.4

nacos客户端的版本:2.3.2

1.引pom

这里引入了nacos和feginclient的版本

            <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><!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--nacos-discovery--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>

2.加注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class, args);}}

3.使用

feignclient支持按照springmvc的框架,按照mvc的接口形式,将接口通过代理的方式解析成httpclient,发送请求。

一个最简单的使用示例

我现在有一个用户服务和一个订单服务,需要用户通过订单号查询订单

定一个FeginClient

@FeignClient(name = "order-service")
public interface UserFeignClient {@GetMapping("order/get")String  get(@RequestParam String orderNo);}

@Feginclient 注解

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package org.springframework.cloud.openfeign;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignClient {@AliasFor("name")String value() default "";/** @deprecated */@DeprecatedString serviceId() default "";@AliasFor("value")String name() default "";String qualifier() default "";String url() default "";boolean decode404() default false;Class<?>[] configuration() default {};Class<?> fallback() default void.class;Class<?> fallbackFactory() default void.class;String path() default "";boolean primary() default true;
}

参数详细说明

url:目标服务的基础url

value:同name属性,指定Feign客户端的名称。当两者都存在时,value优先级高于name

path:客户端接口中所有方法的基础路径前缀,如果不设置,默认为空字符串。

configuration:指定一个或多个配置类,这些配置类可以用来定制Feign的行为,比如设置日志级别、错误解码器等。

decode404:布尔值,默认为false。如果设为true,Feign会在接收到404响应时尝试解码响应体,而不是抛出异常。

fallback 和 fallbackFactory:分别用于指定回退类和回退工厂类,当远程服务调用失败时,提供降级逻辑。

在订单服务定义一个接口

@GetMapping("order/get")public String get(@RequestParam String orderNo) {try {System.out.println("开始休眠");Thread.sleep(6000);System.out.println("休眠结束");} catch (Exception e) {}System.out.println(orderNo);return "ok";}

在用户服务发起请求

    @Resourceprivate UserFeginClient userFeginClient;@GetMapping("test")public String get() {userFeginClient.get("sdfdsf");return "test";}

在实际项目中,定义client分为两种情况

1.内部服务的调用。这种情况feginclient会将代码写字自己对应的服务种,提供api模供项目内部的服务去依赖。

2.调用外部的接口

调用外部的接口,可以将外部接口理解为普通的http请求即可,在自己的服务内部定义feginclient,按照springmvc的接口定义即可

使用feignclient注意事项

1.feignclient对于get请求,不支持使用对象的传参

使用对象传参会默认解析为post请求,会抛异常405状态码,不支持的请求

4.feignclient的超时时间配置

1.超时时间概念

1.连接超时

客户端和服务端之间建立tcp连接的时间,一般很短

2.读取超时时间

服务端接收到请求,执行自己的业务,加入在指定时间内服务端没有返回,将超时

2.支持全局的和局部client的超时时间配置

示例:

   # application.yml 示例feign:client:config:default:          # 默认配置,适用于所有Feign客户端connectTimeout: 5000  # 连接超时时间,单位为毫秒readTimeout: 5000    # 读取超时时间,单位为毫秒

在application.properties中:

   # application.properties 示例feign.client.config.default.connectTimeout=5000feign.client.config.default.readTimeout=5000

真的特定的client超时间配置

   feign:client:config:myCustomClient:    # 替换为你的Feign客户端接口名connectTimeout: 8000readTimeout: 6000

5.openfeign 的重试机制

openfeign默认是不走重试机制的

配置重试:

@Configuration
public class FeignConfig {@Beanpublic Retryer myRetryer() {//默认不开启重试 NEVER_RETRY//最大请求次数// 100 失败多少毫秒之后执行  1最大间隔   1秒 一秒一次   //最大重复次数3次(1+2) 第一次请求+重试两次return new Retryer.Default(100, 1, 3);}
}

代码验证

controller

 @Resourceprivate OrderClient orderClient;@RequestMapping("getUser")public String  getUser() {var user = new UserVo();user.setName("test");user.setPassword("123456");var l1 = System.currentTimeMillis();System.out.println("调用开始---------------");try {orderClient.getOrder();}catch (Exception e){}var l = System.currentTimeMillis();System.out.println("调用结束----------------"+(l-l1)/1000+"s");return "feign调用 订单服务success";}

配置文件

server:port: 8080spring:application:name: user-service1cloud:openfeign:client:config:default:#连接超时时间connectTimeout: 2000#读取超时时间readTimeout: 4000

 日志

调用开始---------------
2024-07-06T15:52:13.392+08:00  INFO 22140 --- [nio-8080-exec-1] com.alibaba.nacos.client.naming          : [SUBSCRIBE-SERVICE] service:order-service, group:DEFAULT_GROUP, clusters: 
2024-07-06T15:52:13.400+08:00  INFO 22140 --- [nio-8080-exec-1] com.alibaba.nacos.client.naming          : init new ips(1) service: DEFAULT_GROUP@@order-service -> [{"instanceId":"192.168.137.1#8081#DEFAULT#DEFAULT_GROUP@@order-service","ip":"192.168.137.1","port":8081,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@order-service","metadata":{"preserved.register.source":"SPRING_CLOUD","IPv6":"[2408:8220:364:ddc1:82a:8136:409c:ca0a]"},"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000}]
2024-07-06T15:52:13.414+08:00  INFO 22140 --- [nio-8080-exec-1] com.alibaba.nacos.client.naming          : current ips:(1) service: DEFAULT_GROUP@@order-service -> [{"instanceId":"192.168.137.1#8081#DEFAULT#DEFAULT_GROUP@@order-service","ip":"192.168.137.1","port":8081,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@order-service","metadata":{"preserved.register.source":"SPRING_CLOUD","IPv6":"[2408:8220:364:ddc1:82a:8136:409c:ca0a]"},"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000}]
2024-07-06T15:52:13.966+08:00  INFO 22140 --- [or-127.0.0.1-13] com.alibaba.nacos.common.remote.client   : [b2df3a7f-c8da-49d8-8f39-0f980088e6d5] Receive server push request, request = NotifySubscriberRequest, requestId = 9
2024-07-06T15:52:13.967+08:00  INFO 22140 --- [or-127.0.0.1-13] com.alibaba.nacos.common.remote.client   : [b2df3a7f-c8da-49d8-8f39-0f980088e6d5] Ack server push request, request = NotifySubscriberRequest, requestId = 9
调用结束----------------12s

如果想要每次重试都打印,需要开启feign的日志功能

6.openfeign集成httpclient5

openfeign默认使用的是HttpUrlConnection 做的连接,该方式性能和httpclient5有很大的差距

生产使用这个会舒服很多

集成

引入依赖

    <!-- 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>

开启开关

7.请求回应压缩

官网截图

对请求和响应进行gzip压缩。以减少通信过程中的性能损耗

通过两个参数就能开启

细粒度压缩

8.openfeign 的日志打印功能

默认不显示任何日志

NONE,默认的不显示

BASIC, 仅记录请求方法,url,响应状态码和响应头的信息

HEADERS,多了请求和响应头信息

FULL 多了请求和响应的正文及元数据

代码配置

   @Beanpublic Logger.Level feginLoggerLevel() {//开启之后重试次数每次重试请求都可以打印return Logger.Level.FULL;}

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

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

相关文章

【MySQL】事务四大特性以及实现原理

事务四大特性 原子性&#xff08;Atomicity&#xff09; 事务中的所有操作要么全部完成&#xff0c;要么全部不执行。如果事务中的任何一步失败&#xff0c;整个事务都会被回滚&#xff0c;以保持数据的完整性。 一致性&#xff08;Consistency&#xff09; 事务应确保数据库…

机器学习——决策树及其可视化

1、决策树概念 顾名思义&#xff0c;决策树是利用数据结构中树结构来进行判断&#xff0c;每一个结点相当于一个判断条件&#xff0c;叶子结点即是最终的类别。以鸢尾花为例&#xff0c;可以得到如下的决策树&#xff1a; 2、决策树分类的依据是什么&#xff1f; 根据前面分…

跨越语言的界限:Vue I18n 国际化指南

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 国际化简介 vue-i18n 安装和配置 创建语言包 基本使用 切换语言 动态翻…

CTFShow的RE题(二)

逆向5 附件无后缀&#xff0c;查一下是zip&#xff0c;解压得到一个exe一个dll文件。 往下继续看 但也根进去看看 发现是在加载的dll文件 还有一个返回时调用的函数 发现是打印函数 根据以往的经验应该是要跳转到这里&#xff0c;动调一下。 发现exe链接了dll&#xff0c;…

Lock4j简单的支持不同方案的高性能分布式锁实现及源码解析

文章目录 1.Lock4j是什么?1.1简介1.2项目地址1.3 我之前手写的分布式锁和限流的实现 2.特性3.如何使用3.1引入相关依赖3.2 配置redis或zookeeper3.3 使用方式3.3.1 注解式自动式3.3.2 手动式 4.源码解析4.1项目目录4.2实现思路 5.总结 1.Lock4j是什么? 1.1简介 lock4j是苞米…

昇思第6天

函数式自动微分 神经网络的训练主要使用反向传播算法&#xff0c;模型预测值&#xff08;logits&#xff09;与正确标签&#xff08;label&#xff09;送入损失函数&#xff08;loss function&#xff09;获得loss&#xff0c;然后进行反向传播计算&#xff0c;求得梯度&#…

【算法专题】双指针算法

1. 移动零 题目分析 对于这类数组分块的问题&#xff0c;我们应该首先想到用双指针的思路来进行处理&#xff0c;因为数组可以通过下标进行访问&#xff0c;所以说我们不用真的定义指针&#xff0c;用下标即可。比如本题就要求将数组划分为零区域和非零区域&#xff0c;我们不…

时序分析基本概念介绍——SI/crosstalk/delta delay/noise/timing Window

文章目录 前言一、Crosstalk1. Crosstalk Delay Effects2. Crosstalk Noise Effects 二、Crosstalk Analysis1. Crosstalk Delay Analysis2. Crosstalk Noise Analysis 三、如何 fix delta delay 和 noise violations1. 检查delta delay 和 noisedelta delay checknoise check …

【C语言小知识】缓冲区

缓冲区 当我们使用printf()将数据显示在屏幕上&#xff0c;或者使用scanf()函数将数据输入到电脑里&#xff0c;我们是否会产生些许疑问&#xff1f;为何输入的字符会直接显示到屏幕上等等。这里需要介绍一个C语言中的一个关键概念——缓冲区。 当我们使用老式系统进行运行代码…

suricata7 rule加载(一)加载 action

suricata7.0.5 一、前提条件 1.1 关键字注册 main | --> SuricataMain|--> PostConfLoadedSetup|--> SigTableSetupsigmatch_table是一个全局数组&#xff0c;每个元素就是一个关键字节点&#xff0c;是对关键字如何处理等相关回调函数。非常重要的一个结构&#x…

PyCharm如何安装requirements.txt中的依赖包

问题&#xff1a;下载别人的源码&#xff0c;如何安装代码中requirement.txt中的依赖包。 解决方案&#xff1a; &#xff08;1&#xff09;打开PyCharm下面的Terminal&#xff0c;先为代码创建单独的虚拟环境并进入到虚拟环境中&#xff08;每个项目单独的环境&#xff0c;这…

GlusterFS分布式存储系统

GlusterFS分布式存储系统 一&#xff0c;分布式文件系统理论基础 1.1 分布式文件系统出现 计算机通过文件系统管理&#xff0c;存储数据&#xff0c;而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长&#xff0c;单纯通过增加硬盘个数来扩展计算机文件系统的存储…

Docker搭建MySQL双主复制详细教程

在此之前需要提前安装好Docker和 Docker Compose 。 一、创建目录 首先创建一个本地数据挂载目录。 mkdir -p master1-data master2-data二、编写docker-compose.yml version: 3.7services:mysql-master1:image: mysql:5.7.36container_name: mysql-master1environment:MYSQL_…

VBA初学:零件成本统计之四(汇总计算)

第四步&#xff0c;最后进行汇总计算 汇总统计的计算 Sub count() Dim rng As Range Dim i As Long, j As Long Dim arr_s, arr, brr, crr, drr Dim rowscount As Long Dim X As Variant Dim rg As Single, xb As Single, zj As SingleMsgBox "汇总计算时间较久&#xff…

【HTML入门】第二课 - head标签下的常见标签们

目录 1 本节概要 2 head下的常见标签 2.1 网页编码设置 2.2 网页的标题 2.3 样式标签 3 head标签的内容不会显示到网页上 4 查看网页源代码 1 本节概要 上一节&#xff0c;我们说了HTML网页最基本的框架标签&#xff0c;说到标签分为head头部和body身体部分。这一小节呢…

Windows Server 2016 搭建 网络负载平衡 服务

网络负载平衡功能的安装 添加角色 默认不动————功能 勾选上 < 网络负载平衡 > 在工具中————打开 < 网络负载平衡管理器 > 网络负载平衡群集创建 注意 : 提前 将两台 web 站点服务器 都安装好 < 网络负载平衡功能 > 右键 选择 ————新建群集 ——…

【学习笔记】爱立信SPO 1400 CRAFT软件基础知识6——配置的备份与恢复的详细方法

一、前期准备 提示&#xff1a;下面所有学习内容都是基于以下条件完成的 条件1.已经正确安装并正常运行SPO 1400 CRAFT软件&#xff08;以下简称LCT&#xff09; 条件2.确认已正确使用爱立信SPO 1400 CRAFT软件通过网络登录设备&#xff08;以下简称NE&#xff09; 具体登录…

【图解大数据技术】Flume、Kafka、Sqoop

【图解大数据技术】Flume、Kafka、Sqoop FlumeFlume简介Flume的应用场景 KafkaKafka简介Kafka架构Flume与Kafka集成 SqoopSqoop简介Sqoop原理sqoop搭配任务调度器实现定时数据同步 Flume Flume简介 Flume是一个数据采集工具&#xff0c;多用于大数据技术架构下的日志采集。 …

SQL-DCL(三)

一.DCL介绍 DCL英文全称是Data Control Language(数据库控制语言),用来管理数据库 用户,控制数据库的访问权限。 二.两个方面 1.数据库可以由那些用户访问 2.可以访问那些内容 三.DCL-管理用户 1.查询用户 USE mysql SELECT * FROM user 2.创建用户 CREATE USER…

基于Qwen2/Lllama3等大模型,部署团队私有化RAG知识库系统的详细教程(Docker+AnythingLLM)

自 ChatGPT 发布以来&#xff0c;大型语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff0c;大模型&#xff09;得到了飞速发展&#xff0c;它在处理复杂任务、增强自然语言理解和生成类人文本等方面的能力让人惊叹&#xff0c;几乎各行各业均可从中获益。 然…