日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 小林coding
[導(dǎo)讀]這篇文章記錄了給 Apache 頂級(jí)項(xiàng)目 - 分庫(kù)分表中間件 ShardingSphere 提交 Bug 的歷程。

這篇文章記錄了給 Apache 頂級(jí)項(xiàng)目 - 分庫(kù)分表中間件 ShardingSphere 提交 Bug 的歷程。

說(shuō)實(shí)話(huà),這是一次比較曲折的 Bug 跟蹤之旅。10月28日,我們?cè)?GitHub 上提交 issue,中途因?yàn)楣俜介_(kāi)發(fā)者的主觀(guān)臆斷被 Close 了兩次,直到 11 月 20 日才被認(rèn)定成 Bug 并發(fā)出修復(fù)版本,歷時(shí) 20 多天。

本文將還原該 Bug 的分析過(guò)程,將有價(jià)值的經(jīng)驗(yàn)和技術(shù)點(diǎn)進(jìn)行提煉。通過(guò)本文,你將收獲到:

1、疑難問(wèn)題的排查思路

2、數(shù)據(jù)庫(kù)中間件 Sharding Proxy 的原理

3、MySQL 預(yù)編譯的流程和交互協(xié)議

4、Wireshark 抓包分析 MySQL 的奇淫技巧

?01 問(wèn)題描述?

這個(gè) Bug 來(lái)源于我的公號(hào)讀者,他替公司預(yù)研 ShardingProxy(屬于 ShardingSphere 的子產(chǎn)品,可用作分庫(kù)分表,后文會(huì)詳細(xì)介紹)。他按照官方文檔寫(xiě)了一個(gè)很簡(jiǎn)單的 demo,但是運(yùn)行后無(wú)法查詢(xún)出數(shù)據(jù)。

下面是他遇到問(wèn)題后發(fā)給我的信息,希望我能幫忙一起定位下原因。

截圖中的 doc 詳細(xì)記錄了 ShardingProxy 的配置、調(diào)試分析日志、以及問(wèn)題的具體現(xiàn)象。

為了方便大家理解,我重新描述下這個(gè) Demo 的業(yè)務(wù)邏輯以及問(wèn)題表象。

1.?Demo 的業(yè)務(wù)邏輯說(shuō)明

這個(gè) Demo 很簡(jiǎn)單,主要為了跑通 ShardingProxy ?的分庫(kù)分表功能。程序用 SpringBoot + MyBatis 實(shí)現(xiàn)了一個(gè)單表的查詢(xún)邏輯,然后用這張表的一個(gè) long 類(lèi)型字段作為分區(qū)鍵,并通過(guò) ShardingProxy 進(jìn)行了分表。

下面是那張數(shù)據(jù)表的詳細(xì)定義,共 16 個(gè)字段,大家關(guān)注前兩個(gè)字段即可,其他字段和本文提到的 Bug 無(wú)關(guān)。

前兩個(gè)字段的作用如下:

  • BIZ_DT:業(yè)務(wù)字段,date類(lèi)型,和Bug有關(guān)
  • ECIF_CUST_NO:bigint 類(lèi)型,用做分區(qū)鍵
代碼就是 Controller 調(diào)用 Service,Service 調(diào)用 Dao,Dao 通過(guò) MyBatis 實(shí)現(xiàn),這里就不粘貼了。
由于使用了 ShardingProxy 中間件,因此它跟直連數(shù)據(jù)庫(kù)的配置會(huì)有所不同,在定義 dataSource 時(shí),url 需要配置成這樣:
?

jdbc:mysql://127.0.0.1:3307/sharding_db?useServerPrepStmts=true&cachePrepStmts=true&serverTimezone=UTC

可以看到,jdbc 連接的是 ShardingProxy 的邏輯數(shù)據(jù)源 sharding_db,端口使用的是?3307,并非真正的底層數(shù)據(jù)庫(kù)以及 MySQL Server 的真實(shí)端口 3306,具體原理下文會(huì)介紹到。其中,標(biāo)藍(lán)色的?useServerPrepStmts?和?cachePrepStmts 這兩個(gè)參數(shù),和本文說(shuō)的 Bug 有關(guān),這里先提一下,后面會(huì)具體分析。
另外,ShardingProxy 的分表策略是:用 long 類(lèi)型的 ecif_cust_no 字段對(duì) 2 進(jìn)行取模,分成了兩張表。具體配置如下:

shardingColumn: ecif_cust_no

algorithmExpression: pscst_prdt_cvr${ecif_cust_no % 2}

2.?問(wèn)題描述

再說(shuō)下遇到的問(wèn)題。首先,往數(shù)據(jù)表中預(yù)先插入一條 ECIF_CUST_NO 等于 10000 的數(shù)據(jù):

然后啟動(dòng) demo 程序,使用 curl 發(fā)起 post 請(qǐng)求,查詢(xún) ecifCustNo 等于 10000 的那條記錄,居然查詢(xún)不出數(shù)據(jù):

至此,背景基本交代清楚了,為什么數(shù)據(jù)庫(kù)中明明有數(shù)據(jù),但是程序卻查詢(xún)不出來(lái)呢?問(wèn)題到底出現(xiàn)在 ShardingProxy,還是應(yīng)用程序本身?

?02 ShardingProxy 原理簡(jiǎn)介?

在開(kāi)啟這個(gè)問(wèn)題的分析過(guò)程之前,我先快速普及下 ShardingProxy 的基本原理,以便大家能更好的理解我的分析思路。
開(kāi)源的數(shù)據(jù)庫(kù)中間件大家一定接觸過(guò),最流行的是 MyCat?和 ShardingSphere。其中 MyCat 是阿里開(kāi)源的;ShardingSphere 是由當(dāng)當(dāng)網(wǎng)開(kāi)源,并在京東逐漸發(fā)展壯大,于 2020 年成為了 Apache 頂級(jí)項(xiàng)目。

ShardingSphere 的目標(biāo)是一個(gè)生態(tài)圈,它由非常著名的 ShardingJDBC、ShardingProxy、ShardingSidecar 3 款獨(dú)立的產(chǎn)品組成。本文重點(diǎn)普及下 ShardingProxy,另外兩個(gè)就不展開(kāi)了。

1. 什么是 ShardingProxy ?

ShardingProxy 屬于和 MyCat 對(duì)標(biāo)的產(chǎn)品,定位為透明化的數(shù)據(jù)庫(kù)代理端,可以理解成:一個(gè)實(shí)現(xiàn)了 MySQL 協(xié)議的 Server(獨(dú)立進(jìn)程),可用于讀寫(xiě)分離、分庫(kù)分表、柔性事務(wù)等場(chǎng)景。

對(duì)于應(yīng)用程序或者 DBA 來(lái)說(shuō),可以把 ShardingProxy 當(dāng)做數(shù)據(jù)庫(kù)代理,能用 MySQL 客戶(hù)端工具(Navicat)或者命令行和它直接交互,而 ShardingProxy 內(nèi)部則通過(guò) MySQL 原生協(xié)議與真實(shí)的 MySQL 服務(wù)器通信。

圖1:ShardingProxy 的應(yīng)用架構(gòu)圖

從架構(gòu)圖來(lái)看,ShardingProxy 就相當(dāng)于 MySQL,它本身不存儲(chǔ)數(shù)據(jù),但是對(duì)外屏蔽了 Database 的存儲(chǔ)細(xì)節(jié),你可以用連接 MySQL 的方式去連接 ShardingProxy(除了端口不同),用你熟悉的 ORMapping 框架使用它。

2. ShardingProxy 的內(nèi)部架構(gòu)

再來(lái)看下 ShardingProxy 的內(nèi)部架構(gòu),后續(xù)源碼分析時(shí)會(huì)涉及到此部分。

圖2:ShardingProxy 的內(nèi)部架構(gòu)圖

整個(gè)架構(gòu)分為前端、核心組件和后端:

前端(Frontend)負(fù)責(zé)與客戶(hù)端進(jìn)行網(wǎng)絡(luò)通信,采用的是 NIO 框架,在通信的過(guò)程中完成對(duì)MySQL協(xié)議的編解碼。

核心組件(Core-module)得到解碼的 MySQL 命令后,開(kāi)始調(diào)用 Sharding-Core 對(duì) SQL 進(jìn)行解析、改寫(xiě)、路由、歸并等核心功能。

后端(Backend)與真實(shí)數(shù)據(jù)庫(kù)交互,采用 Hikari 連接池,同樣涉及到 MySQL 協(xié)議的編解碼。

3. ShardingProxy 的預(yù)編譯 SQL 功能

本文的 Bug 跟 ShardingProxy 的預(yù)編譯 SQL 有關(guān),這里單獨(dú)介紹下此功能以及與之相關(guān)的 MySQL 協(xié)議,這個(gè)是本文的關(guān)鍵,請(qǐng)耐心看完。

熟悉數(shù)據(jù)庫(kù)開(kāi)發(fā)的同學(xué)一定了解:預(yù)編譯 SQL(PreparedStatement),在數(shù)據(jù)庫(kù)收到一條 SQL 到執(zhí)行完畢,一般分為以下 3 步:

1、詞法和語(yǔ)義解析

2、優(yōu)化 SQL,制定執(zhí)行計(jì)劃

3、執(zhí)行并返回結(jié)果

但是很多情況下,一條 SQL 語(yǔ)句可能會(huì)反復(fù)執(zhí)行,只是執(zhí)行時(shí)的參數(shù)值不同。而預(yù)編譯功能將這些值用占位符代替,最終達(dá)到一次編譯、多次運(yùn)行的效果,省去了解析優(yōu)化等過(guò)程,能大大提高 SQL 的執(zhí)行效率。
假設(shè)我們要執(zhí)行下面這條 SQL 兩次:
SELECT?*?FROM?t_user?WHERE?user_id?=?10;
那 JDBC 和 MySQL 之間的協(xié)議消息如下:

通過(guò)上述流程可以看到:第 1 條消息是PreparedStatement,查詢(xún)語(yǔ)句中的參數(shù)值用問(wèn)號(hào)代替了,它告訴 MySQL 對(duì)這個(gè)SQL 進(jìn)行預(yù)編譯;第 2 條消息 MySQL 告訴 JDBC 準(zhǔn)備成功了;第 3 條消息 JDBC 將參數(shù)設(shè)置為 1 ;第 4 條消息 MySQL 返回查詢(xún)結(jié)果;第 5 條和第 6 條消息表示第二次執(zhí)行同樣的 SQL,已經(jīng)無(wú)需再次預(yù)編譯了。
再回到 ShardingProxy,如果需要支持預(yù)編譯功能,交互流程肯定是需要變的,因?yàn)?Proxy 在收到 JDBC 的PreparedStatement 命令時(shí),SQL 里的分片鍵是問(wèn)號(hào),它根本不知道該路由到哪個(gè)真實(shí)數(shù)據(jù)庫(kù)。
因此,流程變成了下面這樣:

可以看到,Proxy在收到 PreparedStatement 命令后,并不會(huì)把這條消息轉(zhuǎn)發(fā)給MySQL,只是緩存了這個(gè) SQL,在收到 ExecuteStatement 命令后,才根據(jù)分片鍵和傳過(guò)來(lái)的參數(shù)值確定真實(shí)的數(shù)據(jù)庫(kù),并與 MySQL 交互。

?03?問(wèn)題分析?

上一章節(jié)基本把這個(gè) Bug 相關(guān)的原理知識(shí)介紹清楚了,下面正式進(jìn)入問(wèn)題的分析過(guò)程。
最開(kāi)始拿到這個(gè)問(wèn)題,我也是比較頭禿的,尤其看到讀者下面這段信息。

當(dāng)然,我的功力是達(dá)不到盲猜水平的,說(shuō)下我的完整思路。
?第 1 步??復(fù)現(xiàn)問(wèn)題
我讓讀者給我打包發(fā)了 Demo 的源代碼、數(shù)據(jù)庫(kù)腳本以及 ShardingProxy 配置,然后本地安裝了 ShardingProxy 4.1.1 版本,再通過(guò) Navicat 連接到 ShardingProxy 執(zhí)行數(shù)據(jù)庫(kù)腳本,環(huán)境基本就準(zhǔn)備完畢了。
啟動(dòng) Demo 程序后,通過(guò) Postman 發(fā)送請(qǐng)求,問(wèn)題穩(wěn)定復(fù)現(xiàn)了,確實(shí)查不出數(shù)據(jù)。
?第 2 步?確認(rèn)應(yīng)用程序是否有BUG

因?yàn)檎麄€(gè)代碼很簡(jiǎn)單,代碼層面唯一有可能存在問(wèn)題的是 Mybatis 這一層。為了確認(rèn)這一點(diǎn),我修改了 SpringBoot 的配置,將 MyBatis 的 debug 日志也打印了出來(lái)。再次發(fā)起請(qǐng)求后,能從控制臺(tái)中看到以下詳細(xì)日志:

日志中沒(méi)發(fā)現(xiàn)異常,而且 PreparedStatement 以及 ExecuteStatement 的參數(shù)設(shè)置都是正確的,查詢(xún)結(jié)果確實(shí)是空。
為了縮小排查范圍,我把 dataSource 的 配置改回了直連真實(shí)數(shù)據(jù)庫(kù),這樣能將 ShardingProxy 這個(gè)干擾因素排除在外。改完后的 url 如下:

jdbc:mysql://127.0.0.1:3306/db1?useServerPrepStmts=true&cachePrepStmts=true&serverTimezone=UTC

其中,db1 是真實(shí)數(shù)據(jù)庫(kù),3306 也是MySQL 服務(wù)器的端口了。然后再次用 Postman 發(fā)送請(qǐng)求,可以看到:有正確數(shù)據(jù)返回了。

通過(guò)這一步,我將懷疑對(duì)象再次轉(zhuǎn)移到 ShardingProxy 上了,并將 dataSource 配置改回成原樣,繼續(xù)排查。

第 3?步 排查 ShardingProxy

首先,查看 ShardingProxy 的運(yùn)行日志,沒(méi)發(fā)現(xiàn)任何異常;其次,能看到日志中的 Actual SQL 是正確的,它已經(jīng)根據(jù)分區(qū)鍵正確路由到了??pcsct_prdt_cvr0??這張表:

[INFO?]?17:25:48.804?[ShardingSphere-Command-15]?
ShardingSphere-SQL?-?Actual?SQL:?ds_0?:::?SELECT
BIZ_DT,ECIF_CUST_NO,DEP_FLG?...
FROM?pscst_prdt_cvr0
WHERE?ECIF_CUST_NO?=???:::?[10000]
因此可以推斷:ShardingProxy 的分庫(kù)分表配置應(yīng)該是沒(méi)有問(wèn)題的。

我開(kāi)始懷疑:是否跟 ShardingProxy 所使用的數(shù)據(jù)庫(kù)驅(qū)動(dòng)有關(guān)?因?yàn)檫@個(gè) Jar 包是應(yīng)用方選擇版本,手動(dòng)放到 ShardingProxy 安裝目錄中的。因此,我將驅(qū)動(dòng)版本從 5.1.47 版本改成了 8.0.13 (和 Demo 使用了相同的版本),但是問(wèn)題仍然存在。

另外,還能想到的是:是否是 ShardingProxy 的這個(gè)最新版本引入了 Bug?然后,我又另外安裝了它的上一個(gè)版本 4.1.0,重新測(cè)試了一遍,還是有問(wèn)題。

這個(gè)時(shí)候,真感覺(jué)沒(méi)有其他可疑點(diǎn)了,所有能想到的點(diǎn)都排查了一遍。我再次回到了 Demo 程序本身,它和 ShardingProxy 唯一的結(jié)合點(diǎn)就在 DataSource 的 url 上。

jdbc:mysql://127.0.0.1:3307/sharding_db?useServerPrepStmts=true&cachePrepStmts=true&serverTimezone=UTC

庫(kù)名和端口號(hào)配置無(wú)誤,唯一可疑的是另外三個(gè)參數(shù):?useServerPrepStmts、cachePrepStmts?、serverTimezone。其中,前兩個(gè)參數(shù)和預(yù)編譯 SQL 有關(guān),是一個(gè)組合。
因此,我將這兩個(gè)參數(shù)從 url 中去掉,測(cè)試了一下。這個(gè)時(shí)候奇跡出現(xiàn)了,居然返回了正確數(shù)據(jù)。至此,基本定位到了問(wèn)題,但根本原因是什么呢?究竟是不是 ShardingProxy 的 Bug ?
第 4?步 Wireshark 抓包分析 MySQL 協(xié)議

找到這個(gè)問(wèn)題的解決方案后,我同步給了讀者。與此同時(shí),他也在 ShardingProxy ?的 GitHub 上提交了 issue,反饋了這個(gè)最新進(jìn)展。

由于工作原因,這個(gè)問(wèn)題我就暫時(shí)放一邊了,準(zhǔn)備抽空再接著排查。

大概過(guò)了一周我想起了這個(gè)問(wèn)題,然后打開(kāi) issue 想了解下調(diào)查進(jìn)度,讓我非常驚訝的是:官方開(kāi)發(fā)者居然在復(fù)現(xiàn)此問(wèn)題后,主觀(guān)臆斷地認(rèn)為是應(yīng)用程序的問(wèn)題,然后莫名奇妙的把這個(gè) issue 關(guān)閉了,他們的答復(fù)是這樣的:

意思就是:我們針對(duì)預(yù)編譯 SQL 功能做了大量的測(cè)試,這個(gè)是不可能存在問(wèn)題的,建議你們更換下應(yīng)用程序的數(shù)據(jù)庫(kù)連接池,抓包繼續(xù)分析下。(這個(gè)說(shuō)法真讓人非常無(wú)語(yǔ),完全不是程序員嚴(yán)謹(jǐn)?shù)乃季S?。?/span>
第二天,我開(kāi)始用 Wireshark 抓包分析 MySQL 的協(xié)議,想弄清楚根本原因到底是什么?同時(shí)聯(lián)系上了官方,讓他們 reopen 了這個(gè)問(wèn)題。
Wireshark 如何抓取 MySQL 協(xié)議的數(shù)據(jù)包,這里就不展開(kāi)了,大家可以網(wǎng)上查下資料。注意將 Wireshark 的過(guò)濾條件設(shè)置成:

mysql || tcp.port==3307

其中:mysql 表示 ShardingProxy 和 MySQL Server 之間的數(shù)據(jù)包,tcp.port==3307 表示 Demo 程序和 ShardingProxy 之間的數(shù)據(jù)包。
啟動(dòng) Wireshark 抓包后,再次用 Postman 發(fā)起請(qǐng)求,觸發(fā)整個(gè)過(guò)程,然后就能順利抓到下面截圖的數(shù)據(jù)包了。

大家關(guān)注底色為 深藍(lán)色 的 8 個(gè)數(shù)據(jù)包即可。在本文第 2 章節(jié)的原理部分,我已經(jīng)詳細(xì)介紹過(guò)?ShardingProxy?的預(yù)編譯功能以及該流程的 MySQL 協(xié)議消息,這里的 8 個(gè)數(shù)據(jù)包和原理介紹是完成吻合的。
那接下來(lái)如何進(jìn)一步分析呢?結(jié)合 ShardingProxy 的架構(gòu)圖來(lái)思考下:Proxy 僅僅作為一個(gè)中間代理,介于應(yīng)用程序和 MySQL Server 之間,它完全實(shí)現(xiàn)了 MySQL 協(xié)議,以便對(duì) MySQL 命令進(jìn)行解碼和編碼,然后加上自己的分庫(kù)分表邏輯。
如果 ShardingProxy 內(nèi)部存在 Bug,那一定是某個(gè)數(shù)據(jù)包出現(xiàn)了問(wèn)題。順著這個(gè)思路,很快就能發(fā)現(xiàn):執(zhí)行完 ExecuteStatement 后,MySQL Server 返回正確數(shù)據(jù)包給 Proxy 了,但是 Proxy 沒(méi)有返回正確的數(shù)據(jù)包給應(yīng)用程序
下面截圖的是倒數(shù)第 2 個(gè) Response 數(shù)據(jù)包,由 MySQL Server 返回給 Proxy 的,Payload 中能看到那條記錄的數(shù)據(jù):

下面截圖的是最后 1 個(gè) Response 數(shù)據(jù)包,由 Proxy 返回給應(yīng)用程序的,Payload 中只能看到表字段的定義,那條記錄已經(jīng)不翼而飛了。

通過(guò)這一步分析,就已經(jīng)坐實(shí)了:ShardingProxy 是有 Bug 的。然后,我將這些依據(jù)發(fā)給了官方開(kāi)發(fā)者,對(duì)方開(kāi)始重視,并正式進(jìn)入源碼分析階段。

?04?根本原因定位?

當(dāng)天晚上,官方開(kāi)發(fā)者就定位到了根本原因,發(fā)出了 Pull Request。我看了下代碼改動(dòng),僅僅修改了一行代碼。

改動(dòng)的這行代碼,就是在 ShardingProxy 再次組裝數(shù)據(jù)包返回給應(yīng)用程序時(shí)拋出來(lái)的。
由于我們的數(shù)據(jù)表中存在一個(gè) date 類(lèi)型的字段,改動(dòng)的這行代碼卻強(qiáng)制將 date 類(lèi)型轉(zhuǎn)換成了 Timestamp 類(lèi)型,因此拋出了異常。還有幾個(gè)疑點(diǎn),我結(jié)合對(duì)源代碼的理解逐一解答下。

1、為什么代碼拋異常了,但是 ShardingProxy 的控制臺(tái)沒(méi)打印呢?

上面截圖的是:拋出 ClassCastException 那個(gè)方法的整個(gè)調(diào)用鏈。由于 ShardingProxy 并沒(méi)有捕獲這個(gè) RuntimeException 以及打印日志,最終這個(gè)異常被 netty 吞掉了。

2、為什么 ShardingProxy 需要做 date 到 Timestamp 的類(lèi)型轉(zhuǎn)換呢?

可以從 ShardingProxy 的架構(gòu)來(lái)理解,因?yàn)?Proxy 只有對(duì) MySQL 協(xié)議進(jìn)行編解碼后,才能在中間插入它的分庫(kù)分表邏輯。
針對(duì) date 類(lèi)型的字段,ShardingProxy 通過(guò) JDBC 的 API 從查詢(xún)結(jié)果中拿到的仍然是 Date 類(lèi)型,之所以要轉(zhuǎn)換成 Timestamp,這個(gè)又跟 MySQL 的協(xié)議有關(guān)了,下面是 MySQL 官方文檔的說(shuō)明:

簡(jiǎn)單理解就是:ShardingProxy 在代碼實(shí)現(xiàn)時(shí),用了一個(gè)范圍最大的 timestamp 存了三種可能的值 date, datetime 和 timestamp,然后再按照上面這個(gè)協(xié)議規(guī)范進(jìn)行二進(jìn)制的寫(xiě)入。

3、這個(gè) Bug 是只有在使用 SQL 預(yù)編譯功能時(shí)才會(huì)被觸發(fā)嗎?

是的,只有在處理 ExecuteStatement 命令時(shí),這個(gè)方法才會(huì)被調(diào)用到。那普通的 SQL 查詢(xún)場(chǎng)景為什么用不到呢?
這個(gè)又跟 MySQL 協(xié)議有關(guān)了,普通的 SQL 查詢(xún)場(chǎng)景,payload 不是二進(jìn)制協(xié)議的,而是普通的文本協(xié)議。這種情況下,無(wú)需調(diào)用這個(gè)類(lèi)進(jìn)行轉(zhuǎn)換。
至此,整個(gè)分析過(guò)程就結(jié)束了。

?05?寫(xiě)在最后?

本文詳細(xì)復(fù)盤(pán)了這個(gè) Bug 的分析過(guò)程,并對(duì)其中的原理知識(shí)和排查經(jīng)驗(yàn)進(jìn)行了總結(jié)。

對(duì)于 ShardingSphere 這種頂級(jí)開(kāi)源項(xiàng)目來(lái)說(shuō),我個(gè)人覺(jué)得同樣值得做一次深度復(fù)盤(pán)。我不認(rèn)同他們對(duì)于 issue 的處理方式,另外在核心功能的自動(dòng)化測(cè)試上,也一定是存在 case 不完善的,不然不可能連續(xù)多個(gè)版本都沒(méi)發(fā)現(xiàn)這個(gè)嚴(yán)重 Bug。


哈嘍,我是小林,就愛(ài)圖解計(jì)算機(jī)基礎(chǔ),如果覺(jué)得文章對(duì)你有幫助,歡迎分享給你的朋友,也給小林點(diǎn)個(gè)「在看」,這對(duì)小林非常重要,謝謝你們,給各位小姐姐小哥哥們抱拳了,我們下次見(jiàn)!


推薦閱讀

小小的 float,藏著大大的學(xué)問(wèn)

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀(guān)點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀(guān)點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉