色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

配置中心的核心功能和實現

jf_ro2CN3Fa ? 來源:三友的java日記 ? 2023-09-22 11:12 ? 次閱讀

來源:三友的java日記

最近突然心血來潮(就是閑的)就想著擼一個簡單的配置中心,順便也照葫蘆畫瓢給整合到SpringCloud。

本文大綱

362ca4a4-58e8-11ee-939d-92fbcf53809c.png

配置中心的概述

隨著歷史的車輪不斷的前進,技術不斷的進步,單體架構的系統都逐漸轉向微服務架構。雖然微服務架構有諸多優點,但是隨著越來越多的服務實例的數量,配置的不斷增多,傳統的配置文件方式不能再繼續適用業務的發展,所以急需一種可以統一管理配置文件應用,在此之下配置中心就誕生了。

所以配置中心就是用來統一管理各種服務配置的一個組件,本質上就是一個web應用。

配置中心的核心功能

一個配置中心的核心功能其實主要包括兩個:

配置的存取

配置變更的通知

配置的存取是配置中心不可缺失的功能,配置中心需要能夠將配置進行保存,存在磁盤文件也好,又或是數據庫也罷,總之需要持久化,同時配置中心也得提供配置查詢的功能。

配置變化的通知也是一個很重要的功能,一旦配置中心的配置有變動的話,那么使用到這個配置的客戶端就需要知道這個配置有變動,從而可以做到相應的變動的操作。

手擼一個簡易的配置中心

上文分析了一個配置中心的核心功能,接下來就實現這兩個核心的功能。

一、文件工程整體分析

36442250-58e8-11ee-939d-92fbcf53809c.png

文件工程整體分為客戶端與服務端

服務端:單獨部署的一個web應用,端口是8888,提供了對于配置增刪改查的http接口

客戶端(SDK):業務系統需要引用對應的依賴,封裝了跟服務端交互的代碼

二、服務端實現詳解

1、配置文件的數據存儲模型ConfigFile

在配置中心存儲配置的時候,需要指明以下信息

publicclassConfigFile{

privateStringfileId;

privateStringname;

privateStringextension;

privateStringcontent;

privateLonglastUpdateTimestamp;

}

fileId: 文件的唯一id,由配置中心服務端在新增配置文件存儲的時候自動生成,全局唯一

name: 就是文件的名字,沒有什么要求,見名知意就行

extension: 文件后綴名,指的是該配置是什么類型的文件,比如是properties、yml等

content: 就是配置文件的內容,不同的后綴名有不同的格式要求

lastUpdateTimestamp: 上一次文件更新的時間戳。當文件存儲或者更新的時候,需要更新時間戳,這個字段是用來判斷文件是否有改動

2、文件存儲層ConfigFileStorage

對于文件存儲層,我提供了一個ConfigFileStorage接口,

publicinterfaceConfigFileStorage{

voidsave(ConfigFileconfigFile);

voidupdate(ConfigFileconfigFile);

voiddelete(StringfileId);

ConfigFileselectByFileId(StringfileId);

ListselectAll();

}

這個接口提供了對于配置存儲的crud操作,目前我已經實現了基于內存和磁盤文件的存儲的代碼

3663bdb8-58e8-11ee-939d-92fbcf53809c.png

可以在項目啟動的時候,在配置文件指定是基于磁盤文件存儲還是基于內存存儲,默認是基于磁盤文件存儲。

368c86b2-58e8-11ee-939d-92fbcf53809c.png

當然,如果想把配置信息存儲到數據庫,只要新增一個存儲到數據的實現就行。

3、ConfigController

ConfigController提供了對于配置文件的crud的http接口

36a69d7c-58e8-11ee-939d-92fbcf53809c.png

ConfigController是通過調用ConfigManager來完成配置文件的crud

4、ConfigManager

36d485d4-58e8-11ee-939d-92fbcf53809c.png

其實就是一個service層,就是簡單的參數封裝,最終是調用ConfigFileStorage存儲層的實現來完成配置的存儲功能。

這樣配置中心的配的存取的功能就實現了。

所以,服務端還是比較簡單的。其實就是跟平時寫的業務系統的crud沒什么區別,就是將數據庫存儲替換成了磁盤文件的存儲。

至于前面說的配置文件變更通知的功能,我是基于客戶端來實現的。

三、客戶端的實現

客戶端工程代碼如下

36e64dfa-58e8-11ee-939d-92fbcf53809c.png

1、ConfigFileChangedListener

36fc99fc-58e8-11ee-939d-92fbcf53809c.pngConfigFileChangedListener

配置變動的監聽器,當客戶端對某個配置監聽的時候,如果這個配置的內容有變化的話,客戶端就會回調這個監聽器,傳入最新的配置

2、ConfigService

3726ed6a-58e8-11ee-939d-92fbcf53809c.png

封裝了客戶端的核心功能,可以添加對某個文件的監聽器和獲取某個文件的配置內容。

使用示例:

//創建一個ConfigService,傳入配置中心服務端的地址
ConfigServiceconfigService=newConfigService("localhost:8888");

//從服務端獲取配置文件的內容,文件的id是新增配置文件時候自動生成
ConfigFileconfig=configService.getConfig("69af6110-31e4-4cb4-8c03-8687cf012b77");

//對某個配置文件進行監聽
configService.addListener("69af6110-31e4-4cb4-8c03-8687cf012b77",newConfigFileChangedListener(){
@Override
publicvoidonFileChanged(ConfigFileconfigFile){
System.out.printf("fileId=%s配置文件有變動,最新內容為:%s%n",configFile.getFileId(),configFile.getContent());
}
});

這里說一下配置變更通知的實現原理。

首先對于客戶端來說,要想知道哪個配置文件進行了改動,有兩種方式

第一種是通過push的方式來實現。當配置文件發生變動的時候,服務端主動將變動的配置文件push給客戶端。這種方式實現起來比較麻煩,一方面是服務端還得存儲客戶端的服務的信息,因為服務端得知道push到哪臺服務器上;另一方面,客戶端需要提供一個接口來接收服務端push的請求,所以這種方式整體實現起來比較麻煩。但是這種push方式時實性比較好,一旦配置文件有變動,第一時間客戶端就能夠知道配置有變動。

第二種方式就是基于pull模式來實現。客戶端定時主動去服務端拉取配置文件,判斷文件內容是否有變動,一旦有變動就進行監聽器的回調。這種實現相比push來說簡單不少,因為服務端不需要關心客戶端的信息,所有的操作都由客戶端來完成。但是這個定時的時間間隔不好控制,太長可能會導致時實性差,太短會導致可能無效請求過多,因為配置壓根可能沒有變化。

但是這里我選擇了第二種方式,因為實現起來簡單。。

374440ea-58e8-11ee-939d-92fbcf53809c.png變動通知代碼實現

到這,一個簡單的配置中心的服務端的和客戶端就完成了,這里畫張圖來總結一下配置中心的核心原理。

376649d8-58e8-11ee-939d-92fbcf53809c.png

接下來就把這個簡易的配置中心整合到SpringCloud中。

SpringCloud配置中心的原理

1、項目啟動是如何從配置中心加載數據的?

在SpringCloud環境下,當項目啟動的時候,在SpringBoot應用容器創建之前,會先創建一個容器,這個容器非常重要,這個容器是用來跟配置中心交互,拉取配置的。

這個容器在啟動的時候會干兩件事:

加載bootstrap配置文件,這就是為什么配置中心的配置信息需要寫在bootstrap配置文件的重要原因

加載所有spring.factories文件中的鍵為org.springframework.cloud.bootstrap.BootstrapConfiguration對應的配置類,將這些配置類注入到這個容器中,注意這里是不會加載@EnbaleAutoConfiguration自動裝配的類

當這兩件事都做好之后,會從這個容器中獲取到所有的PropertySourceLocator這個接口的實現類對象,依次調用locate方法。

37847930-58e8-11ee-939d-92fbcf53809c.pngPropertySourceLocator

這個類很重要,先來看看注釋

Strategy for locating (possibly remote) property sources for the Environment. Implementations should not fail unless they intend to prevent the application from starting.

扔到有道翻譯如下:

為環境定位(可能是遠程)屬性源的策略。實現不應該失敗,除非它們打算阻止應用程序啟動。

說的簡單點就是用來定位到(也就是獲取的意思)項目啟動所需要的屬性信息。同時要注意到括號內的 可能是遠程 告訴我們一個很重要的信息,那就是獲取的配置信息不僅僅可以存在本地,而且還可以存在遠程。

遠程?作者這里就差直接告訴你可以從配置中心獲取了。。

所以從這個注釋就可以發現,原來PropertySourceLocator就是起到在SpringCloud環境下從配置中心獲取配置的作用。

PropertySourceLocator是一個接口,所以只要不同的配置中心實現這個接口,那么不同的配置中心就可以整合到了SpringCloud,從而實現從配置中心加載配置屬性到Spring環境中了。

2、如何實現注入到Bean中的屬性動態刷新?

上面講了在項目啟動的時候SpringCloud是如何從配置中心加載數據的,主要是通過新建一個容器,加載bootstrap配置文件和一些配置類,最后會調用PropertySourceLocator來從配置中心獲取到配置信息。

那么在SpringCloud環境下,是如何實現注入到Bean中的屬性動態刷新的呢?

舉個例子

37ac721e-58e8-11ee-939d-92fbcf53809c.pngUserService

當在類上加一個@RefreshScope注解之后,那么當配置中心sanyou.username的屬性有變化的時候,那么此時注入的username也會跟著變化。

這種變化是如何實現的呢?

SpringCloud中規定,當配置中心客戶端一旦感知到服務端的某個配置有變化的時候,需要發布一個RefreshEvent事件來告訴SpringCloud配置有變動。

37ca3c2c-58e8-11ee-939d-92fbcf53809c.png

在SpringCloud中RefreshEventListener類會去監聽這個事件,一旦監聽到這個事件,就會進行兩步操作來刷新注入到對象的屬性。

37e33b32-58e8-11ee-939d-92fbcf53809c.pngRefreshEventListener

從配置中心再次拉取屬性值,而這個拉取的代碼邏輯跟項目啟動時拉取的屬性值核心邏輯幾乎是一樣的,也是創建一個新的spring容器,加載配置文件和配置類,最后通過PropertySourceLocator獲取屬性,這一部分核心的代碼邏輯是復用的。

有了最新的屬性之后,就開始刷新對象的屬性。

刷新的邏輯實現的非常的巧妙,可不是你以為的簡單地將新的屬性重新注入對象中,而是通過動態代理的方式來實現的。

對于在類上加了@RefreshScope注解的Bean,Spring在生成這個Bean的時候,會進行動態代理。

這里我們就上面舉個UserService例子來分析,在生成UserService有兩步操作

生成一個UserService對象,將從配置中心拉到的配置sanyou.username注入給UserService對象

由于加了@RefreshScope,會給上一步驟生成的UserService對象進行代理,生成一個代理對象

最后真正暴露出去供我們使用的其實是就是這個代理對象,如圖所示

37fbe376-58e8-11ee-939d-92fbcf53809c.png

由于暴露出去的是一個代理對象,所以當調用getUsername方法的時候,其實是調用UserService的代理對象的getUsername方法,從而就會找到UserService,調用UserService的getUsername獲取到username的屬性值。

當配置中心的配置有變動刷新屬性的時候,Spring會把UserService這個對象(非代理對象)給銷毀,重新創建一個UserService對象,注入最新的屬性值。

當再次通過UserService代理對象獲取username屬性的時候,就會找最新創建的那個UserService對象,此時就能獲取到最新的屬性值。

38147922-58e8-11ee-939d-92fbcf53809c.png

配置每刷新一次,UserService對象就會先銷毀再重新創建,但是暴露出去的UserService代理對象一直不會變。

這樣,對于使用者來說,好像是UserService對象的屬性自動刷新了,其實本質上是UserService代理對象最終找的UserService對象發生了變化。

到這應該就知道為什么加了@RefreshScope的對象能夠實現配置的自動刷新了,其實依靠的是動態代理完成的。

3、源碼執行流程圖

由于上面并沒有涉及整體執行流程的源碼分析,所以我特地結合源碼畫了兩張源碼的執行流程圖,有興趣的小伙伴可以對照著圖翻一翻具體的源碼。

3.1啟動時加載配置流程

38366726-58e8-11ee-939d-92fbcf53809c.png

最終從配置中心獲取到的屬性會放在項目啟動時創建的 Environment 對象里面。

3.2配置刷新源碼流程

3856f6e4-58e8-11ee-939d-92fbcf53809c.png

這個圖新增了對于加了@ConfigurationProperties數據綁定的對象原理的分析。

整合SpringCloud和測試

一、整合SpringCloud

1、ConfigCenterProperties

38774d54-58e8-11ee-939d-92fbcf53809c.png

配置中心的配置信息,這里需要配置配置中心服務端的地址和使用的配置文件的id。當然這部分信息需要寫在bootstrap配置文件中,前面也說過具體的原因。

2、ConfigCenterPropertySourceLocator

上面分析知道,項目啟動和刷新的時候,SpringCloud是通過PropertySourceLocator的實現從配置中心加載配置信息,所以這里就得實現一下

388f67ae-58e8-11ee-939d-92fbcf53809c.png

核心的邏輯就是根據所配置的文件的id,從配置中心拉取配置信息,然后解析配置。

3、ConfigContextRefresher

這個是用來注冊文件變動的監聽器,來刷新文件的信息的。

因為上面提到,當配置發生變化的時候,需要發布一個RefreshEvent事件來觸發刷新配置的功能。

38aa54ba-58e8-11ee-939d-92fbcf53809c.png

核心的邏輯就是當項目啟動的時候,對所使用的配置文件進行注冊一個監聽器,監聽器的實現就是當發生配置改動的時候,就發布一個RefreshEvent事件。

4、兩個配置類

4.1 ConfigCenterBootstrapConfiguration

38d0eb7a-58e8-11ee-939d-92fbcf53809c.png

配置了ConfigCenterPropertySourceLocator、ConfigCenterProperties、ConfigService

4.2 ConfigCenterAutoConfiguration

38fdb52e-58e8-11ee-939d-92fbcf53809c.png

配置了ConfigContextRefresher、ConfigCenterProperties、ConfigService

最后需要將兩個配置類在spring.factories配置一下。

這里有個需要注意,前面說過,SpringCloud會創建新的容器來加載配置,而這個容器只會加載spring.factories文件中鍵為@BootstrapConfiguration注解的配置類,所以需要將ConfigCenterBootstrapConfiguration跟BootstrapConfiguration配對,因為ConfigCenterBootstrapConfiguration配置了ConfigCenterPropertySourceLocator。

3920f066-58e8-11ee-939d-92fbcf53809c.png

好了,到這里真的就完成了對SpringCloud整合了。

二、測試

1、新增一個配置文件

啟動配置中心的server端,然后打開ApiPost,新增一個配置文件

393e046c-58e8-11ee-939d-92fbcf53809c.png

新增文件類型為properties一個配置,內容為sanyou.username=sanyou鍵值對,當然可以寫很多鍵值對,我這里就寫了一個,新增成功之后,返回了文件的id:79765c73-c1ef-4ea2-ba77-5d27a64c4685

2、測試客戶端

這里我為了方便,就把測試代碼跟客戶端寫在同一個服務了,正常情況肯定是把跟SpringCloud代碼打成一個依賴引到項目中。

在bootstrap.yml文件中配置配置中心的相關信息

39635e38-58e8-11ee-939d-92fbcf53809c.png

配置中心服務端的地址是:localhost:8888

使用的配置文件的id是剛才創建的:79765c73-c1ef-4ea2-ba77-5d27a64c4685

測試Controller

39853db4-58e8-11ee-939d-92fbcf53809c.png

提供一個接口,注入上面提到的UserService

啟動項目,調用接口

3998e9b8-58e8-11ee-939d-92fbcf53809c.png

從斷這里可以看出,實際注入的是一個UserService代理對象,并且最終找的是com.sanyou.configcenter.test.UserService@3a1e4fd3這個UserService對象

此時這次調用的返回值就是:sanyou

39af0888-58e8-11ee-939d-92fbcf53809c.png

接下來測試一下自動刷新屬性的功能

現在修改一下配置中心的sanyou.username為sanyou666

39ce42f2-58e8-11ee-939d-92fbcf53809c.png

靜靜等待5秒鐘。。

此時控制臺打印出 Refresh keys changed: [sanyou.username] ,也就是sanyou.username屬性變了

39f8afce-58e8-11ee-939d-92fbcf53809c.png

此時再次獲取username

3a1517fe-58e8-11ee-939d-92fbcf53809c.png

可以看出,UserService代理對象沒變,但是UserService對象已經變成了com.sanyou.configcenter.test.UserService@4237b3cd

此時獲取到的username就已經變成了sanyou666

3a30cdb4-58e8-11ee-939d-92fbcf53809c.png

所以,到這里就成功將我們自己寫的那個簡易版的配置中心整合到了SpringCloud中了。

不足和改進

雖然我們這里的配置中心有了配置中心基本的功能,但是其實還有很多的不足和可以改進的地方。

1、配置變更推送問題

問題前面也說過,在判斷配置是否變更的時候,這里是每隔5s從服務端獲取一次,這里就會可能5s之后才能感知到配置有變化,達不到真正時實的效果,并且由于這里是由客戶端根據來判斷,會導致無效的請求過多,因為可能配置壓根沒有變化,但是還是每隔5s獲取一次配置信息,白白浪費資源

解決這個問題可以換成上面提到的push方式來做,或者將輪詢方式改成長輪詢的方式實現也是可以的。

2、高可用問題

這里服務端的實例只有一個,不支持集群的方式,就會有單點故障的問題,不支持高可用。在實際項目中,肯定要支持集群的方式,保證即使有服務實例掛了,整個集群仍然可以繼續對外提供服務,比如nacos就支持集群的方式,并且可以自由選擇是使用AP模式還是CP模式。

3、通信協議和序列化協議

對于通信協議,這里為了方便,我選擇了客戶端和服務端的通信方式是基于http協議的,當然也可以自定義協議,或者使用其它的協議,比如gRPC協議。其實在nacos2.x的版本中,nacos開始全面擁抱gRPC協議了。

至于序列化協議,這里選擇了json協議,因為很簡單、常見、使用范圍廣、跨語言,當然也可以選擇其它的,比如hessian序列化協議等等。

4、多租戶隔離

一個合格的配置中心需要能支持不同應用的隔離,還有同一個應用不同環境的隔離,這里就圖省事,直接就是有一個文件id來表示,雖然也可以做到隔離(不同系統用不同的文件id),但是這種方式比較low。像nacos會自動根據配置的名稱和后綴名之類的,生成文件id(dataId),同時還有分組的概念,其實就是為了做到隔離的效果。

5、鑒權

鑒權是一個系統比較常見的東西,這里就不做過多贅述

6、控制頁面

上面所有對于配置的crud都是基于ApiPost來的,但是實際怎么也得通過一個頁面來操作吧,至于這里我為啥不自己寫個頁面,給你個眼神自己體會~~

最后,本文代碼地址:

https://github.com/sanyou3/sanyou-config-center


審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Web
    Web
    +關注

    關注

    2

    文章

    1269

    瀏覽量

    69623
  • 數據庫
    +關注

    關注

    7

    文章

    3845

    瀏覽量

    64591
  • 客戶端
    +關注

    關注

    1

    文章

    290

    瀏覽量

    16736
  • springcloud
    +關注

    關注

    0

    文章

    17

    瀏覽量

    1542

原文標題:擼了一個簡易的配置中心,順帶還給整合到了SpringCloud

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    阿里云數據庫POLARDB核心功能物理復制技術解讀

    深入解讀阿里云數據庫POLARDB核心功能物理復制技術
    發表于 06-02 10:16

    智能數字鐘的核心功能定位

    目錄前言… 2第一章 需求定義… 10產品功能定義… 10智能數字鐘的核心功能定位… 14芯片選型… 15基于成本約束的設計思路… 15CPU的選型… 15音樂芯片的選型… 16天氣預報語音播報芯片
    發表于 07-30 07:19

    F103的功能分類核心功能是什么

    文章目錄F103的功能分類核心功能:缺一不可,缺少任何一個都不能工作。重要功能:根據每一款單片機的不同,具有不同的偏重點。多為幫助內核做一些內核不能做的事情。通信功能:單片機行業成熟,
    發表于 12-10 07:33

    Bifrost GPU可編程核心的頂級布局、優勢和著色器核心功能

    本指南介紹了典型的馬里Bifrost GPU可編程核心(第三代馬里GPU)的頂級布局、優勢和著色器核心功能。Bifrost家族包括Mali-G30、Mali-G50和Mali-G70系列產品。 在
    發表于 08-02 17:52

    電機驅動系統在實現節能方面具有核心功能

    節能方面具有核心功能。這些關鍵的能源基礎設施和工業驅動系統都需要更高能效、更可靠的智能電源方案以實現節能,同時要降低成本以實現經濟效益最大化。
    的頭像 發表于 01-27 12:25 ?1641次閱讀

    核心功能具體的執行過程-2

    這篇我們主要講解一下 axios 中的 配置、攔截器和執行鏈等一些核心功能到底是怎么運行的。
    的頭像 發表于 03-01 09:59 ?601次閱讀
    <b class='flag-5'>核心功能</b>具體的執行過程-2

    機器視覺的四大核心功能

    機器視覺的四大核心功能? 機器視覺是一種通過電子系統和計算機軟件實現人類視覺功能的技術。它運用計算機視覺、模式識別、圖像處理和機器學習等技術,以攝像機和圖像處理技術為基礎,將圖像轉化為數字信號,并
    的頭像 發表于 12-25 11:15 ?1075次閱讀

    智慧灌區平臺功能全面解析(智慧灌區場景和核心功能

    ? ? 智慧灌區是當今精準農業的重要組成部分,其核心就是建設一個涵蓋了灌區運營管理全流程、實現多源信息融合、涵蓋多維度水資源全要素的智慧灌區平臺。那么智慧灌區平臺的功能和設備構成包括哪些呢?本文為您
    的頭像 發表于 02-22 10:27 ?671次閱讀
    智慧灌區平臺<b class='flag-5'>功能</b>全面解析(智慧灌區場景和<b class='flag-5'>核心功能</b>)

    [天拓四方]工業邊緣網關的核心功能、應用場景和實施策略

    重要支持。本文將重點介紹工業邊緣網關的核心功能、應用場景和實施策略,以展示其在工業自動化領域的專業性和實用性。 一、工業邊緣網關的核心功能 工業邊緣網關的核心功能包括: 數據采集與集成:邊緣網關能夠實時采集來自各種工業設
    的頭像 發表于 05-23 16:29 ?406次閱讀

    深度解析:藍牙網關核心功能以及應用場景

    為可通過互聯網傳輸的數據格式,從而使得遠程監控、數據分析和設備控制成為可能。 二、藍牙網關的核心功能 藍牙網關的核心功能主要圍繞以下幾個方面展開: 掃描與連接 :自動搜索并連接周圍的藍牙設備,無論是藍牙低功耗(BLE)設備還
    的頭像 發表于 07-10 10:16 ?973次閱讀
    深度解析:藍牙網關<b class='flag-5'>核心功能</b>以及應用場景

    萬界星空科技低代碼云mes核心功能詳解!建議收藏!

    云MES系統作為數字化轉型的關鍵組成部分,具有一系列核心功能和優勢,可以極大地改善制造流程管理和生產執行效率。
    的頭像 發表于 08-06 09:34 ?278次閱讀
    萬界星空科技低代碼云mes<b class='flag-5'>核心功能</b>詳解!建議收藏!

    光伏電站智能運維管理系統三大核心功能

    光伏電站智能運維管理系統三大核心功能 以往,光伏電站的運維工作需要人工巡檢和維護,不僅費時費力,而且效率低下。而隨著智能技術的發展,陜西公眾智能監測自主研發了光伏電站智能運維管理系統,為光伏電站運維
    的頭像 發表于 08-23 15:55 ?469次閱讀
    光伏電站智能運維管理系統三大<b class='flag-5'>核心功能</b>

    PCS儲能變流器工作原理與核心功能

    PCS儲能變流器是一種雙向電流可控轉換裝置,它能夠連接儲能電池系統與電網或負荷。這種裝置的核心功能是控制儲能電池的充電和放電過程,實現交直流電能的變換。在無電網情況下,PCS儲能變流器甚至可以直接為
    的頭像 發表于 09-17 17:03 ?1279次閱讀

    工業物聯網盒子核心功能與技術特點

    將這些數據上傳至云端或本地服務器進行分析處理。工業物聯網盒子不僅是數據采集的前端,也是實現設備遠程監控、預測性維護、能效優化等高級應用的基礎。 一、核心功能與技術特點 工業物聯網盒子的核心功能與技術特點,使其能
    的頭像 發表于 11-22 17:21 ?300次閱讀

    Monitor Wafer的核心功能、特點、生產流程和應用

    ? 文本簡單介紹了非生產晶圓Monitor Wafer的核心功能、特點、生產流程和應用。 Monitor Wafer,即非生產晶圓(Non-Product Wafer,簡稱NPW),在現代半導體
    的頭像 發表于 12-06 10:59 ?411次閱讀
    主站蜘蛛池模板: 伊人亚洲综合网色 | ewp系列虐杀在线视频 | 好男人WWW免费高清视频在线 | 亚洲精品久久一区二区三区四区 | 欧美一区二区影院 | HEYZO精品无码一区二区三区 | 老色哥网站 | 国产全部视频列表支持手机 | 免费毛片a在线观看67194 | 三级网站午夜三级 | 午夜福利合集1000在线 | 一区三区在线专区在线 | 蜜芽在线播放免费人成日韩视频 | 国产精品 日韩精品 欧美 | 俄罗斯aaaa一级毛片 | 歪歪爽蜜臀AV久久精品人人槡 | 黄色三级在线观看 | 一道本无吗d d在线播放 | 欧美一区二区日韩一区二区 | 国产人妻精品午夜福利免费不卡 | 国产黄A片在线观看永久免费麻豆 | 欲奴第一季在线观看全集 | 伊人久久青草青青综合 | 亚洲精品久久YY5099 | 999久久久国产精品蜜臀AV | 又黄又湿免费高清视频 | 成人精品视频在线 | 国产中文字幕一区 | 偷窥自拍性综合图区 | 成人女人A级毛片免费软件 成人免费在线视频 | 国产麻豆91网在线看 | 国产亚洲精品A久久777777 | 含羞草完整视频在线播放免费 | 大胸女晃奶动态图 | 宅男午夜大片又黄又爽大片 | 浪潮色诱AV久久久久久久 | 亚洲性无码AV久久成人 | 亚洲 欧美 国产 伦 综合 | 特级毛片内射WWW无码 | 天天影视网网色色欲 | 精品视频久久久久 |