阅读MySQL必知必会,查缺补漏

news2024/12/24 2:27:52

MySQL自带数据库

information_schema:是MySQL自带的数据库,主要保持MySQL数据库服务器的系统信息,比如数据库的名称,数据库表的名称,字段名称,存储权限等。

performance_schema:是MySQL系统自带的数据库,可以用来监控MySQL的各类性能指标。

sys:是MySQL系统自带的数据库,主要作用是,以一种更容易被理解的方式展示MySQL数据库服务器的各类性能指标。

MySQL主键

MySQL中的主键主要有3个特征:

  • 必须唯一,不能重复
  • 不能是空
  • 必须可以唯一标识数据表中的记录
alter table demo.test
add column itenumber int primary key auto_increment;

MySQL数据类型

整数类型

在评估用哪种整数类型的时候,我们需要考虑存储空间和可靠性平衡的问题。使用占用字节数少的整数类型可以节省存储空间,但是如果超出取值范围那么可能会引起系统错误,影响可靠性。

浮点数类型和定点数类型

FLOAT(单精度浮点数),DOUBLE(双精度浮点数),REAL(默认是DOUBLE)

但是你可以通过这个语句把默认改变。

SET sql_mode = "REAL_AS_FLOAT";

浮点数类型有一个缺陷,就是不精确

那么为什么会出现这样的情况呢?

MySQL对浮点类型数据的存储方式

4个字节存储FLOAT类型,8个字节存储DOUBLE类型数据。但是它们都是用二进制方式来进行存储的。例如9.625用二进制表示,就是1001.101,你可以发现,如果尾数不是0或者5的话那么你无法用一个二进制数来精确的表达,就只能四舍五入了。

于是MySQL提供了定点数类型:DECIMAL

浮点数的存储方式决定了它是不可能精确的,而DECIMAL的存储方式决定了它一定是精确的。

DECIMAL把十进制转换成二进制数存储,DECIMAL则不同,它是把十进制数的整数部分和小数部分拆开,分别转换成十六进制数来进行存储。

DECIMAL(M,D)其中M表示整数加小数一共多少位,M <= 65。D表示小数部分位数,D < M。

文本类型

CHAR(M):固定长度字符串,必须预先定义字符串长度。

VARCHAR(M):可变长度字符串,必须预先知道字符串的最大长度,不过只要不超过这个最大长度,具体存储的时候,是按照字符串长度存储的。

TEXT:系统自动按照实际长度存储,不需要预先定义,因此TEXT不能做主键。

MySQL的基本操作

有哪些约束?

  • 非空约束
  • 唯一性约束
  • 自增约束

如何修改表?

把原来的表复制一下:

CREATE TABLE demo.importheadhist LIKE demo.importhead;

插入查询结果:

INSERT INTO 表名(字段名)
SELECT 字段名或值
FROM 表名
WHERE 条件

修改数据:

UPDATE 表名
SET 字段名=WHERE 条件

查询数据:

  • GROUP BY :告诉MySQL查询结果要如何分组,经常与MySQL的聚合函数一起使用。
  • HAVING:用于筛选查询结果,跟WHERE类似。

FROM:

FROM关键字表示查询的数据源。

数据源不一定是表,也可以是一个查询结果。

SELECT a.goodsname, a.price 
FROM (
    SELECT *
    FROM demo.goodsmaster
) AS a;

这个就是派生表:

    SELECT *
    FROM demo.goodsmaster

或者叫做子查询。

意思是我们把一个查询结果数据集当作一共虚拟的数据表来看待。MySQL规定,必须要用AS关键字给这个派生表起一个别名。

ORDER BY:

ASC表示升序,DESC表示降序。

如何设置主键?

  • 尽量不要用业务字段,也就是跟业务有关的字段作为主键。
  • 使用自增字段做主键(不推荐),多台服务器就寄了。
  • 采用手动赋值的方法,通过一定的逻辑性,确保字段值全系统的唯一性。

外键和连接

外键和连接:如何做关联查询?

这种把分散在多个不同的表里面的数据查询出来的操作就叫做多表查询。

在MySQL中为了把2个表关联起来,会用到2个重要功能:外键(FOREIGN KEY)和连接(JOIN)

外键需要在创建表的阶段就定义出来;连接可以通过相同意义的字段把两个表连接起来用在查询阶段。

如何创建外键?

假设我们有两张表,A和B,它们通过一个公共字段id发生关联关系,我们把这个关联关系叫做R。如果id在表A中是主键,那么表A就是这个关系R中的主表。相应的,表B就是这个关系中的从表,表B中的id,就是表B用来引用表A中数据的,叫外键。所以外键就是从表中用来引用主表数据的那个公共字段

在这里插入图片描述

如何创建外键:

CREATE TABLE 从表名
(
    -- 定义外键约束,提出外键字段和参照的主表字段
    CONSTRAINT 外键约束名
    FOREIGN KEY (字段名) REFERENCES 主表名 (字段名)
)

也可以修改表的字段:

ALTER TABLE 从表名 ADD CONSTRAINT 约束名 FOREIGN KEY 字段名 REFERENCES 主表名

连接

  • 内连接 – 表示查询结果只返回符合连接条件的记录,这种连接方式比较常用。
  • 外连接 – 表示查询结果返回某一个表中的所有记录,以及另一个表中满足连接条件的记录。

内连接

关键字JOININNER JOINCROSS JOIN的含义是一样的。

我们定义一个背景:

在这里插入图片描述

SELECT 
	a.transactionno,
	a.itemnumber,
	a.quantity,
	a.price,
	a.transdate,
	b.membername
FROM
	demo.trans AS a
		JOIN
	demo.membermaster AS b ON (a.cardno = b.cardno);

可以看到外面通过公共字段cardno把两个表关联到了一起,查询出了会员消费的数据。

关键字JOIN与关键字ON配对使用,意思是查询满足关联条件demo.trans表中cardno的值与demo.membermaster表中的cardno值相等两个表中的所有记录。

外连接

  • 左连接,一般写成LEFT JOIN,返回左边所有记录以及右表中符合连接条件的记录。
  • 右连接,一般写成RIGHT JOIN,返回右边表中的所有记录,以及左表中符合连接条件的记录。
SELECT 
	a.transactionno,
	a.itemnumber,
	a.quantity,
	a.price,
	a.transdate,
	b.membername
FROM
	demo.trans AS a -- 这个是左边的表
		LEFT JOIN
	demo.membermaster AS b ON (a.cardno = b.cardno);

我们使用右连接也可以完成一样的效果:

SELECT 
	a.transactionno,
	a.itemnumber,
	a.quantity,
	a.price,
	a.transdate,
	b.membername
FROM
	demo.membermaster AS b -- 这个是左边的表
		RIGHT JOIN
	demo.trans AS a ON (a.cardno = b.cardno);

关联查询的误区:

MySQL允许关联查询的时候没有外键的约束。因为外键的约束是要占用系统资源的,如果是高并发的网站的话,这是无法承担的。但是我们既然要关联查询,就说明有两张表,也就是我们的插入或者删除操作是无法用一条SQL语句完成的,也就是没有原子性。所以如果没有外键约束的话,需要在应用层解决原子性的问题,否则会出现业务上的错误。

where和having有什么区别?

WHERE是直接对表中的字段进行限定。HAVING则需要根据分组关键字GROUP BY一起使用,通过对分组字段或分组计算函数进行限定。

  • WHERE关键字的特点是,直接用表的字段对数据集进行筛选。如果需要通过关联查询从其他的表获取需要的信息,那么执行的时候,也是先通过WHERE条件进行筛选,用筛选后的比较小的数据集进行连接。这样一来,连接过程中占用的资源比较少,执行效率也比较高。
  • HAVING的查询过程:
    • 我们需要把所有的信息都准备好,包括从关联表中获取需要的信息,对数据集进行分组,形成一个包含所有需要的信息的数据集合。接着,再通过HAVING条件的筛选,得到需要的数据。

也就是说:

  • 如果需要通过连接从关联表中获取需要的数据,WHERE是先筛选后连接,而HAVING是先连接后筛选。这一点就已经决定了WHERE比HAVING更高效。因为WHERE可以先筛选,用一个筛选后的较小数据集和关联表进行连接,这样占用的资源比较少,执行效率也比较高。HAVING则需要先把结果集准备好,也就是用没有被筛选的数据集进行关联,然后对这个大的数据集进行筛选,占用资源多,效率低。
  • WHERE可以直接把表中的字段作为筛选条件,但是不能使用分组中的计算函数作为筛选条件。HAVING必须要和GROUP BY配合使用,可以把分组计算的函数和分组字段作为筛选条件。
  • 因此这也决定了HAVING可以完成WHERE不可能完成的任务。因为在查询语法结构中,WHERE在GROUP BY之前,所以无法对分组结果进行筛选。HAVING在GROUP BY之后,可以使用分组字段和分组中的计算函数,对分组的结果集进行筛选。

解释一下EXPLAIN之后的字段

  • type=range:使用索引查询特定范围的数据记录
  • rows=5411:表示需要读取的记录数
  • possible_keys=index_trans:表示可以选择的索引是index_trans
  • key=index_trans:表示实际选择的索引是index_trans
  • extra=Using index condition;Using where;Using MRR;这里面的信息对SQL语句的执行细节做了进一步解释,包含了3层含义:
    • 执行时使用了索引
    • 执行时通过WHERE条件进行了筛选
    • 使用了顺序磁盘读取的策略

临时表:

临时表是一种特殊的表,用来存储查询的中间结果,并且会随着当前连接的结果而自动删除。MySQL中两种连接表,分别是内部临时表和外部临时表

  • 内部临时表主要用于性能优化,由系统自动产生,我们无法看到
  • 外部临时表通过SQL语句创建,我们可以使用
CREATE TEMPORARY TABLE 表名
(
    字段名 字段类型,
    ...
);
  • 临时表创建的时候需要加上格外的TEMPORARY字段
  • 临时表创建完成之后,只有当前连接可见,其他连接是不可见的,具有连接隔离性。
  • 临时表在当前连接结束之后,会被自动删除。

内存临时表和磁盘临时表:

内存临时表:

CREATE TEMPORARY TABLE demo.mytrans
(
    itemnumber int,
    groupnumber int,
    branchnumber int
) ENGINE = MEMORY; (临时表存在内存中)

磁盘临时表:

CREATE TEMPORARY TABLE demo.mytrans
(
    itemnumber int,
    groupnumber int,
    branchnumber int
);

内存临时表如果断电的话数据就全部消失了。

高并发系统不建议使用!!!

视图

视图:如何简化查询?

创建视图:

CREATE [OR REPLACE]
VIEW 视图名称 [(字段列表)]
AS 查询语句
  • 子查询:嵌套在另一个查询中的查询。
  • 派生表:如果我们在查询中把子查询的结果作为一共表来使用,这个表就是派生表

查询的具体步骤是:

  • 通过子查询获得单品销售统计的查询结果
  • 把第一步中的查询结果作为一个派生表,跟历史库存表进行连接,查询获得包括销售日期,商品名称,销售数量和历史库存数量在内的最终结果。

使用视图的查询语句明显简单多了,可读性更好,也更容易维护

如果操作视图和视图中的数据?

修改视图:

ALTER VIEW 视图名
AS 查询语句;

查看视图:

DESCRIBE 视图名

删除视图要使用DROP关键字:

DROP VIEW 视图名

视图的优缺点

优点:

  • 因为我们可以把视图当作一张表来进行查询,所以在使用视图的时候,我们不用考虑视图本身是如何获取数据的,里面有什么逻辑,包括了多少张表,有哪些关联操作,而是可以直接使用。这样一来,实际上就把查询模块化了,查询变的简单,提高了开发和维护的效率。所以你可以把那些经常会用到的查询和复杂的子查询定义成视图,存储到数据库中,这样可以为你以后的使用提供方便。

  • 视图跟实际数据不一样,它是存储查询语句。所以在使用的时候,我们要通过定义视图的查询语句来获取结果集。而视图本身不存储数据,不占用数据存储的资源。

  • 视图具有隔离性。视图相当于在用户和实际的数据表之间加了一层虚拟表。也就是说用户不需要查询数据表,可以直接通过视图获取数据表中的信息。这样不仅提高了数据表的安全性,同时也通过视图把用户实际需要的信息汇总在了一起,查询起来很轻松。

在这里插入图片描述

  • 视图的数据结构相对独立,即便实际数据表的结构发生变换,我们也可以通过修改定义视图的查询语句,让查询结果集里面的字段保持不变。

我们举一个例子让大家理解:

假设我们有一个实际的数据表(demo.goodsmaster),包括商品编号、条码、名称、规格和售价等信息:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

缺点:

  • 数据表的更变,需要及时对视图进行维护,特别当视图是由视图生成的时候,维护会变的非常复杂。

MySQL日志

系统出现问题,应该如何及时发现?

我们应该马上看MySQL的日志

通用查询日志

通用查询日志记录了所有用户的连接开始时间以及截止时间,以及发给MySQL数据库服务器的所有SQL指令。

mysql> SHOW VARIABLES LIKE '%general%';
+------------------+---------------------+
| Variable_name    | Value               |
+------------------+---------------------+
| general_log      | OFF -- 通用查询日志处于关闭状态                 
| general_log_file | LAPTOP-7IL73D6I.log -- 通用查询日志的名称
+------------------+---------------------+
2 rows in set, 1 warning (0.00 sec)

默认是关闭,因为一旦开启通用查询日志,MySQL会记录所有的连接起止和相关的SQL操作,这样会消耗系统资源并且占用磁盘空间。

开启通用查询日志

set GLOBAL general_log = 'ON';

set @@global.general_log_file = 'D:\Lxy';

慢查询日志

慢查询日志用来记录执行时间超过指定时长的查询。它的作用是帮助我们发现那些执行时间特别长的SQL查询,并且有针对性的进行优化,从而提高系统的整体效率。当我们的数据库发生阻塞,运行变慢的时候,检查一下慢查询日志,找到那些慢查询,对解决问题很有帮助。

slow_query_log=1 -- 表示开启慢查询日志,系统将会对慢查询进行记录
slow_query_log_file="GJTECH-PC-slow.log"; -- 表示慢查询日志的名称
long_query_time=10 -- 表示慢查询的标准是查询执行时间超过10秒

min_exmined_row_limit=0 -- 表示扫描过的记录大于等于这个变量的值就算慢查询

错误日志:

错误日志中记录了MySQL服务器启动,停止运行的时间,以及系统自动启动,运行和停止过程中的诊断信息,包含错误,警告和提示等。当我们的数据库服务器发生系统故障的时候,错误日志是首选。

log-error="GJTECH-PC.err"

二进制日志

二进制日志主要数据库的更新事件。比如创建数据库表,更新表中的数据,数据更新所花费的时长等信息。通过这些信息,我们可以再先数据更新的全过程。是数据恢复和数据复制的利器。

如何操作二进制日志?

查看二进制日志主要有3种情况,分别是查看当前正在写入的二进制日志查看所有的二进制日志查看二进制日志种的所有数据更新事件

查看正在写入的二进制日志的SQL语句是:

SHOW MASTER STATUS;

查看所有的二进制文件:

SHOW BINARY LOGS

查看二进制日志中所有数据更新事件的SQL语句:

SHOW BINLOG EVENTS IN 二进制文件名

刷新二进制日志:

FLUSH BINARY LOGS

这条语句的意思是:关闭服务器正在写入的二进制日志文件,并重新打开一个新文件,文件的后缀名在现有的基础上加1.

中继日志

中继日志只是主从服务器架构存在。

回滚日志

进行事物回滚。

这些日志太过重要,我们到时候会单独进行讲解。

范式

范式:如何消除冗余和高效存储?

  • 第一范式:所有字段都是基本数据字段,不可以进一步拆分
  • 第二范式:在满足第一范式的基础上,还要满足数据表里面的每一条记录,都是可唯一标识的。而且所有字段都必须完全依赖主键,不能只依赖主键的一部分。
  • 在满足第二范式的基础上,数据表中不能存在可以被其他非主键字段派生出来的字段,或者说,不能存在依赖于非主键字段的字段。

设计表原则

表太大了,如何设计才能提高性能?

  1. 数据类型优化

    • 优化字段的数据类型。

      • 对整数类型数据进行优化

      • 既可以使用文本类型也可以使用整数类型的字段,要使用整数类型而不是文本类型。

  2. 合理增加冗余字段以提高效率

  3. 拆分表

  4. 尽量使用非空约束。

    1. 可以节省一个比特位,并且省去判断是否为空的逻辑。
    2. 开发时会如果提交给数据库的数据不符合数据库的条件,则会报错。保证开发时不会忽略掉该做的一些非空判断等
    3. 客户保证逻辑正确
    4. 安全,防止sql注入

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

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

相关文章

大数据技术架构(组件)32——Spark:Spark SQL--Execute Engine

2.2、Spark SQL2.2.1、Execute EngineSparkSql的整体提交执行流程和Hive的执行流程基本上一致。站在通用的角度&#xff0c;对于SparkSql来说&#xff0c;从Sql到Spark的RDD执行需要经历两个大的阶段&#xff1a;逻辑计划和物理计划逻辑计划层面会把用户提交的sql转换成树型结构…

2022级上岸浙理工MBA的复试经验提炼和备考建议

在等待联考成绩出来的那段时间&#xff0c;虽然内心很忐忑&#xff0c;但还是为复试在积极的做准备&#xff0c;虽然也进行了估分大概有201分&#xff0c;但成绩和分数线没下来之前&#xff0c;只能尽量多做些一些准备把。因为笔试报了达立易考的辅导班&#xff0c;对于浙江理工…

复现随记~

note(美团2022) 比较简单的越界漏洞&#xff0c;堆本身并没有什么漏洞&#xff0c;而且保护并没全开&#xff0c;所以逆向思维。必然是ROP类而非指针类&#xff0c;故我们着重注意unsigned int等无符号数前后是否不一致 int __fastcall edit(__int64 a1) {int idx; // [rsp14…

[全栈工程师]从0到封神

全栈工程师 一个可以独立完成产品开发的人 目标规划全栈工程师参与社区的问题回答gitCode来自选择专业的问答为什么选择软件工程当初对软件工程这个专业的期待和想象是什么当初希望自己是如何投入这个专业的学习的曾经做过什么准备&#xff0c;或者立下过什么FLAG吗CSDN的我的介…

【idea】idea生产类注释和方法注释

网上有很多类似的文章&#xff0c;但是我在按照他们的文章设置后&#xff0c;出现了一些问题&#xff0c;因此我这边在解决了问题后&#xff0c;总结一篇文章&#xff0c;发出来给大家借鉴一下。在此先说明一下idea的版本&#xff0c;是2020.1.3 设置动态模板&#xff0c;File…

应用场景二:西门子PLC通过无线WIFI连接上位机

应用场景描述&#xff1a; 西门子PLC通过桥接器的无线WIFI连接上位机通讯&#xff0c;可以同时支持S7TCP、ModbusTCP和MQTT协议&#xff0c;上位机可以支持西门子编程软件&#xff08;Micro/WIN、STEP7、博途&#xff09;&#xff0c;组态软件&#xff08;Wincc、组态王、OPC软…

基于卷积神经网络的立体视频编码质量增强方法_余伟杰

基于卷积神经网络的立体视频编码质量增强方法_余伟杰提出的基于TSAN的合成视点质量增强方法全局信息提取流像素重组局部信息提取流多尺度空间注意力机制提出的基于RDEN的轻量级合成视点质量增强方法特征蒸馏注意力块轻量级多尺度空间注意力机制概念扭曲失真孔洞问题失真和伪影提…

【OpenCV图像处理系列一】OpenCV开发环境的安装与搭建(Ubuntu + Window都适用)

&#x1f517; 运行环境&#xff1a;OpenCV&#xff0c;Ubuntu&#xff0c;Windows &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x…

Hadoop集群搭建详细步骤

目录 一、模板虚拟机环境准备 1.新建一台虚拟机hadoop100&#xff0c;并且配置好网络 3.安装 epel-release 4.其他工具 5. 配置普通用户具有root权限&#xff0c;方便后期加sudo执行root权限的命令 6.删除/opt/目录下的所有文件 7.在/opt/目录下创建文件夹&#xff0c;并…

RocketMQ底层源码解析——事务消息的实现

1. 简介 RocketMQ自身实现了事务消息&#xff0c;可以通过这个机制来实现一些对数据一致性有强需求的场景&#xff0c;保证上下游数据的一致性。 以电商交易场景为例&#xff0c;用户支付订单这一核心操作的同时会涉及到下游物流发货、积分变更、购物车状态清空等多个子系统…

基于javaee的电影碟片租赁管理系统的设计

技术&#xff1a;Java、JSP、框架等摘要&#xff1a;随着信息技术在管理中的广泛应用&#xff0c;管理信息系统(MIS)的实施在技术上逐渐成熟。为了适应时代的发展&#xff0c;降低管理成本&#xff0c;提高工作效率&#xff0c;企业需要加强对内部资源(人、钱、物)的有效管理&a…

Android测试包安装方式汇总

背景&#xff1a;作为一名测试&#xff0c;尤其是移动端测试&#xff0c;掌握app的安装方式是必备的基本技能&#xff0c;因此将Android测试包不同格式不同方式的安装方式进行一个总结分享​&#xff0c;仅供大家学习参考。 一、设备调试准备 1、设备打开开发者模式&#xff…

医学生考研考博太卷,一篇文章轻松助力上岸(一)

考研考博太卷了&#xff0c;卷不过&#xff0c;想没想过本科发一篇文章呢&#xff1f; 330分考研人淘汰390分考研人这个故事&#xff0c;大家应该都知道吧。 本专栏带你六个月内&#xff0c;搞定一篇文章&#xff0c;本科生发文章也很容易。 在卷考研的同时&#xff0c;再卷…

应用场景一:西门子PLC通过桥接器连接MQTT服务器

应用场景描述&#xff1a; 云平台、MES等数据采集、设备管理系统&#xff0c;需要通过MQTT的方式&#xff0c;上传和下发数据&#xff0c;MQTT服务器可以获取PLC的实时状态数据&#xff0c;也可以下发控制指令。桥接器提供4G、WIFI和有线三种连接方式。 网络拓扑&#xff1a;…

GRBL源码简单分析

结构体说明 GRBL里面的速度规划是带运动段前瞻的&#xff0c;所以有规划运动段数据和微小运动段的区分 这里的“规划运动段”对应的数据结构是plan_block_t&#xff0c;前瞻和加减速会使用到&#xff0c;也就是通过解析G代码后出来的直接直线数据或是圆弧插补出来的拟合直线数据…

【链式二叉树】数据结构链式二叉树的(万字详解)

前言&#xff1a; 在上一篇博客中&#xff0c;我们已经详解学习了堆的基本知识&#xff0c;今天带大家进入的是二叉树的另外一种存储方式----“链式二叉树”的学习&#xff0c;主要用到的就是“递归思想”&#xff01;&#xff01; 本文目录1.链式二叉树的实现1.1前置说明1.2结…

【蓝桥杯单片机】Keil5中怎么添加STC头文件;从烧录软件中添加显示添加成功后新建工程时依旧找不到

蓝桥杯单片机的芯片型号&#xff1a;IAP15F2K61S2 添加头文件&#xff1a;STC15F2K60S2.H 【1】如何通过烧录软件添加STC头文件&#xff1a; 从ATC-ISP的Keil仿真设置中添加&#xff08;同时自动下载仿真驱动&#xff09;仔细阅读添加说明 KEIL5添加STC芯片库_Initdev的博客-…

UVa The Morning after Halloween 万圣节后的早晨 双向BFS

题目链接&#xff1a;The Morning after Halloween 题目描述&#xff1a; 给定一个二维矩阵&#xff0c;图中有障碍物和字母&#xff0c;你需要把小写字母移动到对应的大写字母位置&#xff0c;不同的小写字母可以同时移动&#xff08;上下左右四个方向或者保持不动 &#xff0…

概论_第8章_假设检验的基本步骤__假设检验的类型

一. 假设检验的基本步骤如下&#xff1a;第1步 根据实际问题提出原假设 及备择假设 , 要求 与 有且仅有一个为真&#xff1b;第2步 选取适当的检验统计量&#xff0c; 并在原假设 成立的条件下确定该检验统计量的分布&#xff1b;第3步 按问题的具体要求&#xff0c; 选取适当…

【java】OpenFeign源码解析学习

本文主要针对 spring-cloud-starter-openfeign 的 2.2.3.RELEASE 版本进行源码的解析。 OpenFeign是什么&#xff1f; 作为Spring Cloud的子项目之一&#xff0c;Spring Cloud OpenFeign以将OpenFeign集成到Spring Boot应用中的方式&#xff0c;为微服务架构下服务之间的调用提…