当前位置: 首页 > news >正文

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

相关文章:

springcloud-alibba之FeignClient

代码地址&#xff1a;springcloud系列: springcloud 组件分析拆解 1.FeignClient的集成 springboot版本&#xff1a;3.1.5 springcloud组件版本&#xff1a;2022.0.4 nacos客户端的版本&#xff1a;2.3.2 1.引pom 这里引入了nacos和feginclient的版本 <dependency>…...

三、docker配置阿里云镜像仓库并配置docker代理

一、配置阿里云镜像仓库 1. 登录阿里云官网&#xff0c;并登录 https://www.aliyun.com/ 2. 点击产品 - 容器 - 容器与镜像服务ACR - 管理控制台 - 镜像工具 - 镜像加速器 二、配置docker代理 #1. 创建docker相关的systemd文件 mkdir -p /etc/systemd/system/docker.servic…...

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十一)-git(3)

Git是目前最流行的版本控制系统之一&#xff0c;在现代软件开发中扮演着重要的角色。它能够有效地跟踪文件变化、协作开发&#xff0c;并存储项目的历史记录。本文的目的是向读者介绍Git的基本概念和工作原理&#xff0c;帮助初学者快速上手使用Git&#xff0c;并帮助有经验的开…...

全面解析 TypeScript 泛型的二三事

2024年了相信大家都已经在日常开发的过程中使用上了 TypeScript 了。TypeScript 增强了代码可靠性和可维护性&#xff0c;确保减少运行时错误并提高开发人员的工作效率。 TypeScript 通过类型声明 使得 javascript 拥有了强类型校验。而泛型的是类型声明中最重要的一环&#x…...

单/多线程--协程--异步爬虫

免责声明:本文仅做技术交流与学习... 目录 了解进程和线程 单个线程(主线程)在执行 多线程 线程池 协程(爬虫多用) 假异步:(同步) 真异步: 爬虫代码模版 异步-爬虫 同步效果--19秒 异步效果--7秒 了解进程和线程 ​ # --------------------> # ------> # …...

android pdf框架-11,查看图片

前10篇文章,9章关于pdf的,pdf解析后,里面也是有各种图片,于是利用pdf的view来展示图片,似乎也是个不错的想法. android手机中的图片查看功能,有的可以展示,有的不能.比如华为,荣耀对大体积的png是可以显示的,小米是不显示,只有缩略图. 一张png50m大,比如清明上河图,原图是tif…...

【CSS】深入浅出弹性布局

CSS的弹性布局&#xff08;Flexbox&#xff09;是一种用于在容器中沿着一维方向&#xff08;水平或垂直&#xff09;来布局、对齐和分配容器内项目空间的有效方式。它旨在提供一个更加有效的方式来布局、对齐和分配容器中项目的空间&#xff0c;即使它们的大小未知或是动态变化…...

医院挂号系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;患者管理&#xff0c;医生管理&#xff0c;专家信息管理&#xff0c;科室管理&#xff0c;预约信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;专家信息&#xff0…...

广州外贸建站模板

Yamal外贸独立站wordpress主题 绿色的亚马尔Yamal外贸独立站wordpress模板&#xff0c;适用于外贸公司建独立站的wordpress主题。 https://www.jianzhanpress.com/?p7066 赛斯科Sesko-W外贸建站WP主题 适合机械设备生产厂家出海做外贸官网的wordpress主题&#xff0c;红橙色…...

KDP数据分析实战:从0到1完成数据实时采集处理到可视化

智领云自主研发的开源轻量级Kubernetes数据平台&#xff0c;即Kubernetes Data Platform (简称KDP)&#xff0c;能够为用户提供在Kubernetes上的一站式云原生数据集成与开发平台。在最新的v1.1.0版本中&#xff0c;用户可借助 KDP 平台上开箱即用的 Airflow、AirByte、Flink、K…...

【人工智能】-- 智能机器人

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a; 专业知识 文章目录 &#x1f349;引言 &#x1f349;机器人介绍 &#x1f348;机器人硬件 &#x1f34d;机械结构 &#x1f34d;传感器 &#x1f34d;控…...

Android广播机制

简介 某个网络的IP范围是192.168.0.XXX&#xff0c;子网 掩码是255.255.255.0&#xff0c;那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一 网络上的所有端口&#xff0c;这样在该网络中的每台主机都将会收到这条广播。为了便于进行系统级别的消息通知&…...

SQL FOREIGN KEY

SQL FOREIGN KEY 简介 SQL(Structured Query Language)是用于管理关系数据库管理系统(RDBMS)的标准编程语言。在SQL中,FOREIGN KEY是一个重要的概念,用于建立和维护数据库中不同表之间的关系。本文将详细介绍SQL FOREIGN KEY的概念、用途、以及如何在SQL中实现和使用FO…...

绘唐3最新版本哪里下载

绘唐3最新版本哪里下载 绘唐最新版本下载地址 推文视频创作设计是一种通过视频和文字的形式来进行推广的方式&#xff0c;可以通过一些专业的工具来进行制作。 以下是一些常用的小说推文视频创作设计工具&#xff1a; 视频剪辑软件&#xff1a;如Adobe Premiere Pro、Fina…...

[ES6] 箭头函数

JavaScript 是一种广泛使用的编程语言&#xff0c;随着其发展和演变&#xff0c;引入了很多新的特性来提高代码的可读性和开发效率。其中一个重要的特性就是 ES6&#xff08;ECMAScript 2015&#xff09;中引入的箭头函数&#xff08;Arrow Function&#xff09;。箭头函数不仅…...

BiLSTM模型实现

# 本段代码构建类BiLSTM, 完成初始化和网络结构的搭建 # 总共3层: 词嵌入层, 双向LSTM层, 全连接线性层 # 本段代码构建类BiLSTM, 完成初始化和网络结构的搭建 # 总共3层: 词嵌入层, 双向LSTM层, 全连接线性层 import torch import torch.nn as nn# 本函数实现将中文文本映射为…...

linux内核源码学习所需基础

1.面向对象的思想&#xff0c;尤其是oopc的实现方式。 2.设计模式。 这两点需要内核源码学习者不仅要会c和汇编&#xff0c;还要接触一门面向对象的语言&#xff0c;比如c&#xff0b;&#xff0b;/java/python等等任意一门都行&#xff0c;起码要了解面向对象的思想。 另外li…...

Java并发编程-AQS详解及案例实战(上篇)

文章目录 AQS概述AQS 的核心概念AQS 的工作原理AQS 的灵活性使用场景使用指南使用示例AQS的本质:为啥叫做异步队列同步器AQS的核心机制“异步队列”的含义“同步器”的含义总结加锁失败的时候如何借助AQS异步入队阻塞等待AQS的锁队列加锁失败时的处理流程异步入队的机制总结Ree…...

第11章 规划过程组(二)(11.8排列活动顺序)

第11章 规划过程组&#xff08;二&#xff09;11.8排列活动顺序&#xff0c;在第三版教材第391页&#xff1b; 文字图片音频方式 第一个知识点&#xff1a;主要输出 1、项目进度网络图 如图11-20 项目进度网络图示例 带有多个紧前活动的活动代表路径汇聚&#xff0c;而带有…...

DP学习——观察者模式

学而时习之&#xff0c;温故而知新。 敌人出招&#xff08;使用场景&#xff09; 多个对象依赖一个对象的状态改变&#xff0c;当业务中有这样的关系时你出什么招&#xff1f; 你出招 这个时候就要用观察者模式这招了&#xff01; 2个角色 分为啥主题和观察者角色。 我觉…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

门静脉高压——表现

一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构&#xff1a;由肠系膜上静脉和脾静脉汇合构成&#xff0c;是肝脏血液供应的主要来源。淤血后果&#xff1a;门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血&#xff0c;引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...

深度解析:etcd 在 Milvus 向量数据库中的关键作用

目录 &#x1f680; 深度解析&#xff1a;etcd 在 Milvus 向量数据库中的关键作用 &#x1f4a1; 什么是 etcd&#xff1f; &#x1f9e0; Milvus 架构简介 &#x1f4e6; etcd 在 Milvus 中的核心作用 &#x1f527; 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...