您好,登錄后才能下訂單哦!
JHipster微服務(wù)架構(gòu)是怎樣的,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
使用 JHipster 生成應(yīng)用時(shí),第一個(gè)問題就是讓你選擇你要的生成的應(yīng)用(目前有4個(gè)選項(xiàng)),但實(shí)際上你是在兩種架構(gòu)風(fēng)格里面做選擇:
一體化架構(gòu),用來創(chuàng)建單獨(dú)的一個(gè)應(yīng)用,包含前端 AngularJS 代碼和后端 spring boot 相關(guān)代碼,項(xiàng)目中所有代碼都在一個(gè)應(yīng)用中。
微服務(wù)架構(gòu),進(jìn)行了前后端分離,優(yōu)點(diǎn)是它可以讓你很容易的控制單個(gè)應(yīng)用的規(guī)模,并處理好這些應(yīng)用中一些簡(jiǎn)單細(xì)小的問題。
相對(duì)來說,一體化架構(gòu)是比較容易上手,官網(wǎng)默認(rèn)推薦這個(gè),如果是剛接觸 JHipstert,建議從這個(gè)入手,熟悉后,如果項(xiàng)目有要求,則再選擇微服務(wù)架構(gòu)應(yīng)用。
下面部分則主要講解下使用JHipster進(jìn)行微服務(wù)架構(gòu)。
JHipster 微服務(wù)架構(gòu)的工作方式如下:
JHipster gateway ,是一個(gè)可以通過生成器直接生成的(在第一個(gè)問題里面選擇 microservice gateway)完整應(yīng)用,包含來服務(wù)端和前端,用來處理web請(qǐng)求。一個(gè)微服務(wù)架構(gòu)里面可以同時(shí)有幾個(gè)網(wǎng)關(guān),如果你遵循 Backends for Frontends pattern這種模式,當(dāng)然這不是強(qiáng)制性的。
JHipster Registry JHipster的注冊(cè)中心,可以在github上 獲取,所有的微服務(wù)應(yīng)用和網(wǎng)關(guān)都是從注冊(cè)中心獲取配置,所以它必須要先運(yùn)行起來。
JHipster的微服務(wù)應(yīng)用實(shí)例,可以通過生成器直接生成(在第一個(gè)問題里面選擇microservice application),它們是提供服務(wù)的具體實(shí)現(xiàn)。它們是無狀態(tài)的。可以同時(shí)并行運(yùn)行好幾個(gè)相同的實(shí)例,來處理海量的請(qǐng)求。
JHipster Console,JHipster的控制臺(tái),提供了服務(wù)監(jiān)控和警報(bào)的功能,基于ELK 技術(shù)棧。
在下圖中,綠色的組件代表你的特定應(yīng)用,藍(lán)色組件代表的底層基礎(chǔ)架構(gòu):
JHipster 可以生成API gateway。 這是一個(gè)普通的JHipster 應(yīng)用,在使用yo jhipster時(shí)第一個(gè)問題可以選擇生成,你可以像開發(fā)一個(gè)普通應(yīng)用來開發(fā)它。它在微服務(wù)架構(gòu)中扮演一個(gè)入口的角色,提供了http 路由,負(fù)載均衡,api 文檔、保障服務(wù)質(zhì)量和安全的功能。
JHipster 的網(wǎng)關(guān)和服務(wù)應(yīng)用啟動(dòng)之前,需要先啟動(dòng) JHipster register 項(xiàng)目作為注冊(cè)中心。應(yīng)用在配置注冊(cè)中心地址時(shí)候,只需要修改 eureka.client.serviceUrl.defaultZone
key 對(duì)應(yīng)的值 (在 src/main/resources/config/application.yml
文件中)。
網(wǎng)關(guān)將自動(dòng)代理所有請(qǐng)求的服務(wù),并沿用應(yīng)用程序的名稱,例如:當(dāng)微服務(wù)應(yīng)用APP1
在注冊(cè)中心注冊(cè)后,可以通過/APP1
網(wǎng)址來訪問。
再舉個(gè)例子,如果你的網(wǎng)關(guān)運(yùn)行在localhost:8080
,你可以通過 http://localhost:8080/app1/rest/foos 獲得通過微服務(wù)APP1服務(wù)提供的的foos
資源。
另外,JHipster中REST接口資源都是受保護(hù)的,在通過瀏覽器訪問這些接口時(shí),你需要帶上正確JWT(在請(qǐng)求頭的header上,下面安全章節(jié)的時(shí)候還會(huì)在提到),或在MicroserviceSecurityConfiguration
類中注釋掉相關(guān)代碼。
如果有多個(gè)相同的服務(wù)實(shí)例在同時(shí)運(yùn)行,網(wǎng)關(guān)可以從JHipster的注冊(cè)中心獲取這些實(shí)例,并且:
使用 Netflix Ribbon 進(jìn)行負(fù)載均衡。
采用 Netflix Hystrix 提供的熔斷機(jī)制,這樣可以將掛的運(yùn)行實(shí)例快速安全地移除。
每個(gè)網(wǎng)關(guān)應(yīng)用都提供了http 路由和服務(wù)實(shí)例監(jiān)控的功能,在后臺(tái)"管理員>網(wǎng)關(guān)"菜單中可以看到。
JWT(JSON網(wǎng)絡(luò)令牌)是現(xiàn)在的一個(gè)業(yè)界標(biāo)準(zhǔn),簡(jiǎn)單易用,可以為微服務(wù)應(yīng)用提供安全保障。
JHispter使用 JJWT library 庫,由Stormpath提供,用來實(shí)現(xiàn)具體的jwt。
所有的toekn都由網(wǎng)關(guān)生成,并傳送給底層微服務(wù)應(yīng)用。因?yàn)樗鼈児蚕硪粋€(gè)公共的密鑰,所以微服務(wù)應(yīng)用能夠驗(yàn)證該令牌,并且使用該令牌認(rèn)證用戶。
這些令牌是自給自足的:它們具有認(rèn)證和授權(quán)的信息,所以微服務(wù)應(yīng)用不需要查詢數(shù)據(jù)庫或外部系統(tǒng)。這是點(diǎn)保證了微服務(wù)的可擴(kuò)展性,所以很重要。
為了保證服務(wù)的安全運(yùn)行,一個(gè)token必須在所有應(yīng)用程序之間共享:
對(duì)于每個(gè)應(yīng)用,其默認(rèn)的token是獨(dú)一無二的,并通過JHipster產(chǎn)生,被存儲(chǔ)在 .yo - rc.json
文件
令牌的值可以通過修改在 src /mian/resources/config/application.yml
文件中的 jhipster.security.authentication.jwt.secret
的值來進(jìn)行配置
一個(gè)好的實(shí)踐是在生產(chǎn)環(huán)境和開發(fā)環(huán)境采用不同的token
此功能目前處于 BETA 階段,因此它的文檔還沒有完成。
JHipster提供生成一個(gè)基于Srping security 的"UAA(用戶賬號(hào)和認(rèn)證信息)"的服務(wù) 。這項(xiàng)服務(wù)采用Oauth3 token機(jī)制,來保證服務(wù)網(wǎng)關(guān)的安全。
在這基礎(chǔ)上,服務(wù)網(wǎng)關(guān)利用Spring Security對(duì)jwt的支持來傳遞token給其它底層的微服務(wù)應(yīng)用。
JHipster 的網(wǎng)關(guān)整合了swagger API,所以我們可以很方便的使用 Swagger UI
和 swagger-codegen
。在管理后臺(tái)的"admin> API"的菜單中,可以看到網(wǎng)關(guān)的API,以及所有注冊(cè)了微服務(wù)的API。
通過下拉列表,可以查看有Swagger 生成的API文檔,這些API都可以在線測(cè)試。測(cè)試的時(shí)候token會(huì)自動(dòng)添加到Swagger UI 的接口中去,所以所有的請(qǐng)求都是在沙盒外進(jìn)行。
這是一個(gè)高級(jí)功能,需要建立一個(gè)Cassandra 集群(通過Docker Compose configuration 可以比較容易的搭建起來)。
網(wǎng)關(guān)提供限速的功能,所以REST請(qǐng)求的次數(shù)可以被限制:
通過IP地址(匿名用戶)
用戶登錄(登錄用戶)
JHipster將使用Cassandra 集群存儲(chǔ)的請(qǐng)求數(shù)據(jù),并且對(duì)超出限制請(qǐng)求將發(fā)送HTTP 429 (太多請(qǐng)求)錯(cuò)誤。每個(gè)用戶的默認(rèn)限速為每小時(shí)10萬API調(diào)用。
這是一個(gè)重要的功能,可以保護(hù)微服務(wù)不被一些特殊的的用戶請(qǐng)求拖垮服務(wù)器。
JHipster register 作為一個(gè)管理 REST 接口資源的關(guān)卡,它對(duì)用戶的安全信息擁有絕對(duì)控制權(quán),因此它可以很容易擴(kuò)展,以提供根據(jù)用戶角色來進(jìn)行特定速率限制。
為開啟速率限制,需要在 application-dev.yml
或 application-prod.yml
中進(jìn)行配置
jhipster: gateway: rate-limiting: enabled: true
當(dāng)然 Cassandra 集群也需要搭建并配置好. 如果采用 JHipster’s Docker Compose 的配置(在 src/main/docker
中),則可以正常運(yùn)行。想自己手動(dòng)設(shè)置群集,這里有些步驟要注意下:
首先要有一個(gè)可用的Cassandra集群。
需要配置好JHipster特定的限速表,相關(guān)的 create_keyspace.cql
和 create_tables.cql
腳本,在 src/main/resources/config/cql
目錄下。
該群集必須在 application-*.yml
文件中進(jìn)行配置,其對(duì)應(yīng)的鍵為spring.data.cassandra
(已生成了默認(rèn)配置)
如果你想添加更多的規(guī)則,或修改現(xiàn)有規(guī)則,你需要修改RateLimitingFilter類。比如說,如果你要進(jìn)行以下情況的限制:
降低HTTP調(diào)用的限制
添加每分鐘或每日限制
刪除了"管理員"用戶的所有限制
默認(rèn)情況下所有已注冊(cè)的微服務(wù)都可以通過網(wǎng)關(guān)訪問。如果你想從通過網(wǎng)關(guān)排除特定的API ,你可以使用網(wǎng)關(guān)的訪問控制過濾器來對(duì)具體的訪問進(jìn)行控制。在 application-*.yml
文件中對(duì) jhipster.gateway.authorized-microservices-endpoints
進(jìn)行配置,默認(rèn)配置為:
jhipster: gateway: authorized-microservices-endpoints: # Access Control Policy, if left empty for a route, all endpoints will be accessible app1: /api,/v2/api-docs # recommended dev configuration
如果你只想微服務(wù)bar的 /api/foo
接口可以被訪問,那么你只需要進(jìn)行如下配置:
jhipster: gateway: authorized-microservices-endpoints: bar: /api/foo
JHipster Registry 是一個(gè)可運(yùn)行的應(yīng)用,由JHipster 的團(tuán)隊(duì)開發(fā)。和JHipster generator一樣,也是開源的,遵循Apache 2-licensed,也放在github上,點(diǎn)此查看。
可以在github上clone或者下載Registry的源碼,如果使用了JHipster generator,則建議使用使用和它相同tag的Registry,它的運(yùn)行方式和其它的應(yīng)用一樣:
開發(fā)環(huán)境下,直接運(yùn)行 ./mvnw
,它默認(rèn)采用開發(fā)環(huán)境下的配置文件,Eureka Registry 將可以通過 http://127.0.0.1:8761/ 進(jìn)行訪問。
生產(chǎn)環(huán)境下,使用./mvnw -Pprod打包生成可執(zhí)行WAR文件。
如果想通過docker鏡像來運(yùn)行JHipster Registry,Docker Hub 中也有提供,在JHipster Registry,當(dāng)然這個(gè)鏡像是預(yù)先配置好。
運(yùn)行 docker-compose -f src/main/docker/jhipster-registry.yml up
來啟動(dòng)JHipster Registry. 然后 Eureka Registry 就會(huì)監(jiān)聽你8761 端口 , 由此便可以通過 http://127.0.0.1:8761/ 來訪問
更多關(guān)于docker和JHipster Registry的問題,可以參見[docker Compose documentation ]({{ site.url }}/docker-compose/)
JHipster Registry 默認(rèn)是受保護(hù)的,需要使用賬戶和密碼來登陸,默認(rèn)賬號(hào)密碼為"admin/admin"。
微服務(wù)應(yīng)用當(dāng)然也是以admin的角色在Registry上進(jìn)行注冊(cè),但是是通過HTTP Basic 認(rèn)證。所以如果你的微服務(wù)應(yīng)用不能連接到注冊(cè)中心,你會(huì)收到"401 authentication error"的錯(cuò)誤信息,因?yàn)槟闩渲缅e(cuò)了某些東西。
為了保障JHipster Registry 的安全:
你必須修改admin的密碼。此密碼可以在Spring boot 的 application-*.yml
文件中通過修改 security.user.password
對(duì)應(yīng)的值來實(shí)現(xiàn),或者你也可以新建一個(gè) SECURITY_USER_PASSWORD
環(huán)境變量。在[Docker Compose sub-generator]({{ site.url }}/docker-compose/)中,用到了這個(gè)變量。
因?yàn)槟愕膽?yīng)用程序是通過HTTP連接到Registry,所以保障連接通道的安全性很重要,其中一個(gè)比較簡(jiǎn)單的方式是采用HTTPS。
JHipster Registry 是采用了 Netflix Eureka server 和 Spring Config Server。 當(dāng)微服務(wù)應(yīng)用和或者微服務(wù)網(wǎng)關(guān)啟動(dòng)的時(shí)候,它們會(huì)首先連接到JHipster Registry去獲取配置信息。
這些配置是指spring boot 的配置,也就是 application-*.yml
文件。但它們存儲(chǔ)在中央服務(wù)器上,易于管理。
當(dāng)整個(gè)服務(wù)啟動(dòng)時(shí),微服務(wù)應(yīng)用或者網(wǎng)關(guān)會(huì)從Registry上獲取服務(wù)的配置信息并且覆蓋它們?cè)瓉泶鎯?chǔ)在本地的配置文件。
以下兩種配置信息是可以用的:
開發(fā)環(huán)境下的本地配置文件(使用 dev profile),使用本地的文件系統(tǒng)。
git 配置信息,用在生產(chǎn)環(huán)境下(使用 JHipster prod profile),存儲(chǔ)在git 服務(wù)中。使用git可以建立tag、分支,或者回滾配置信息,這是生產(chǎn)環(huán)境下非常實(shí)用。
為了集中管理微服務(wù)的配置,你需要按照 application-*.yml
的格式創(chuàng)建配置文件,并放在Registry 的config 文件下。要求 appname 和 profile 你的微服務(wù)應(yīng)用同名和profile對(duì)應(yīng)。
舉個(gè)例子,添加了一個(gè) gateway-prod.yml
文件將對(duì)所有的名為gateway的應(yīng)用采用生產(chǎn)環(huán)境下的配置文件。此外,定義在 application[-dev|prod].yml
配置將對(duì)所有的應(yīng)用產(chǎn)生效果。
上面提到網(wǎng)關(guān)路由是通過Spring boot 來配置,它們其實(shí)也可以通過Spring Config Server 來管理。舉個(gè)例子,你可以在 v1
分支上,將應(yīng)用 app1-v1
路由到 /appl
的url上,而在 v2
分支,將 app1-v2
路由到 /app1
的url上。這是一種無縫升級(jí)微服務(wù)的好方式,以達(dá)到不需要停止服務(wù)就可以升級(jí)的效果。
微服務(wù)應(yīng)用實(shí)例是可以通過 JHipster 生成的,沒有前端(生成的微服務(wù)網(wǎng)關(guān)會(huì)有前端,用到了angularJS ),它要配合著 JHipster Registry 才能正常運(yùn)行。
在用 [entity sub-generator]({{ site.url }}/creating-an-entity/)為微服務(wù)應(yīng)用中生成entity時(shí),和在一體化架構(gòu)應(yīng)用中生成entity的方式有點(diǎn)不一樣,因?yàn)槲⒎?wù)實(shí)現(xiàn)了前后端分離,微服務(wù)應(yīng)用后臺(tái)只需要提供接口,不需要前端代碼,因此它也就不需要生成前端代碼。
首先,在微服務(wù)的應(yīng)用中生成實(shí)體,可以采用在一體化應(yīng)用中生成實(shí)體對(duì)象的方法,也可以使用 [JHipster UML]({{ site.url }}/jhipster-uml/) 或者 [JDL Studio]({{ site.url }}/jdl-studio/) 來生成更加復(fù)雜的實(shí)體以及關(guān)系。當(dāng)然這不會(huì)生成AngularJS代碼。
然后,在微服務(wù)網(wǎng)關(guān)應(yīng)用中,再次運(yùn)行[entity sub-generator]({{ site.url }}/creating-an-entity/),會(huì)在開始時(shí)多出一個(gè)問題,這是專門針對(duì)網(wǎng)關(guān)應(yīng)用的:
有兩個(gè)選項(xiàng):要么像在一體化架構(gòu)應(yīng)用中生成實(shí)體方式那樣,正常生成一個(gè)新的實(shí)體(微服務(wù)網(wǎng)關(guān)應(yīng)用本身是一個(gè)完整的 JHipster 應(yīng)用,這點(diǎn)上它有點(diǎn)像是個(gè)一體化應(yīng)用),要么是利用已有的 JHipster 配置信息來生成。
如果選擇后者,你需要輸入微服務(wù)應(yīng)用的路徑,然后 JHipster 會(huì)產(chǎn)生網(wǎng)關(guān)上的前端代碼(相當(dāng)于是在網(wǎng)關(guān)應(yīng)用中通過頁面來管理微服務(wù)應(yīng)用實(shí)體)。
如果你的應(yīng)用采用了 SQL 的數(shù)據(jù)庫,JHipster 針對(duì)微服務(wù) 給出了不同的,支持二級(jí)緩存的解決方案:
JHipster 的默認(rèn)微服務(wù)緩存解決方案是采用 Hazelcast
你也可以采用 Ehcache(一體化應(yīng)用默認(rèn)支持的方案) ,或者干脆不適用緩存。
默認(rèn)的 Hazelcast 解決方案是支持微服務(wù)的,它可以很好的支持你拓展服務(wù):
使用本地緩存,你是單個(gè)服務(wù)沒有一個(gè)可以同步的緩存,可能導(dǎo)致數(shù)據(jù)不一致。
不使用任何緩存,隨著服務(wù)的拓展增加,系統(tǒng)的負(fù)擔(dān)都放到來數(shù)據(jù)庫,這也不是個(gè)很好的方案。
采用 Hazelcast做緩存,需要做些特別的配置:
在啟動(dòng)時(shí),應(yīng)用程序會(huì)連接到 JHipster 注冊(cè)服務(wù)中,找到和他相同的服務(wù)實(shí)例。
如果使用了 dev
profile,JHipster 將在本地主機(jī)上 127.0.0.1
上創(chuàng)建這些實(shí)例的群集 ,使用每個(gè)實(shí)例不同的端口。默認(rèn)情況下, Hazelcast端口是 你的應(yīng)用程序的端口+ 5701
(所以如果你的應(yīng)用程序的端口是 8081
,Hazelcast將使用端口 13782
)
如果使用了 prod
profile,JHipster 用它找到的所有其他節(jié)點(diǎn)來構(gòu)建一個(gè)群集,使用Hazelcast默認(rèn)的端口 (5701
)
只有微服務(wù)應(yīng)用可以創(chuàng)建無數(shù)據(jù)庫的程序。這是因?yàn)槲⒎?wù)應(yīng)用可以很小,可以沒有用戶管理的代碼。
一個(gè)沒有數(shù)據(jù)庫的微服務(wù)應(yīng)用很小,可用于連接到一個(gè)遺留的后端系統(tǒng)。
開發(fā)微服務(wù)系統(tǒng),意味著你可能需要在幾個(gè)不同的 services 和 databases 上同時(shí)工作,而 Docker Compose 則是一個(gè)針對(duì)此情況,管理開發(fā),測(cè)試和生產(chǎn)環(huán)境的絕佳工具。
為此我們有一篇專門的文檔來介紹 [Docker Compose documentation]({{ site.url }}/docker-compose#microservices) ,我們強(qiáng)烈建議在開發(fā)微服務(wù)架構(gòu)的系統(tǒng)前閱讀這篇文章,熟悉這方面的知識(shí)。
當(dāng)你使用 docker-Compose sub-generator 的時(shí)候,會(huì)詢問你是否需要為你的應(yīng)用添加監(jiān)控。如果選擇是,它將會(huì)在你的 docker-compose.yml
文件下添加 JHipster-Console。當(dāng)你啟動(dòng)系統(tǒng)后,就可以有通過訪問 http://localhost:5601 來獲取系統(tǒng)應(yīng)的日志和各種指標(biāo)。更多關(guān)于監(jiān)控的東西,可以參見 monitoring documentation
對(duì)比一體化應(yīng)用,網(wǎng)關(guān)和微服務(wù)監(jiān)視器提供了一些額外的功能,可以幫助你有效地監(jiān)控微服務(wù)集群。例如查看日志,它可以具體到日志對(duì)于的應(yīng)用程序的名稱,主機(jī),端口和Eureka ServiceId ,這樣可以讓你追蹤到具體的service。此外,JHipster Console帶有默認(rèn)的儀表板,讓你在同一時(shí)間查看所有的服務(wù)。
Docker Swarm (Docker 集群管理工具) 底層使用的API 和Docker Machine (Docker管理工具) 是一樣的,所以使用Docker Swarm 發(fā)布微服務(wù)應(yīng)用和在你本機(jī)上發(fā)布是一樣的。更多關(guān)于Docker和Docker Swarm的文檔請(qǐng)參考 [Docker Compose documentation ]({{ site.url }}/docker-compose/)。
使用 [CloudFoundry sub-generator]({{ site.url }}/cloudfoundry/) 搭建為微服務(wù)的應(yīng)用原理和之前是一樣的,只是你需要部署更多的應(yīng)用:
使 sub-generator 發(fā)布你的 JHipster Registry
拿到JHipster Registry 的url,你需要在你的其它應(yīng)用里面配置這個(gè)地址:
在 bootstrap-prod.yml
文件中,設(shè)置 spring.cloud.config.uri
值為 http://<your_jhipster_registry_url>/config/
在 application-prod.yml
文件中,設(shè)置 eureka.client.serviceUrl.defaultZone
值為 http://<your_jhipster_registry_url>/eureka/
發(fā)布你的網(wǎng)關(guān)應(yīng)用和微服務(wù)應(yīng)用
拓展你的應(yīng)用
一個(gè)重要的點(diǎn)是 JHipster Registry 默認(rèn)是不受保護(hù)的,而微服務(wù)應(yīng)用也不應(yīng)該直接通過外網(wǎng)訪被訪問到,用戶只有通過網(wǎng)關(guān)才能訪問到你的服務(wù)。針對(duì)此問題有兩種解決方案:
通過使用特定的路由來保護(hù)你的的 Cloud Foundry。
全部應(yīng)用都使用 Https,并通過使用 Spring Security 的 basic authentication 來保護(hù)你的 JHipster Registry。
使用 [Heroku sub-generator]({{ site.url }}/cloudfoundry/) 的原理和之前也是是一樣的,只是你需要部署更多的應(yīng)用:
通過下面的按鈕可以在 Heroku 上一鍵部署 JHipster Registry:
為了保障注冊(cè)中心的安全,請(qǐng)參考 [Heroku sub-generator documentation]({{ site.url }}/heroku/)
在獲取注冊(cè)中心的地址后,你的全部應(yīng)用都要在 application-prod.yml 中配置這個(gè)地址:
eureka: instance: hostname: <your_jhipster_registry_url>.herokuapp.com non-secure-port: 80 prefer-ip-address: false
配置好后你就可以部署你的網(wǎng)關(guān)應(yīng)用和微服務(wù)應(yīng)用。使用 Heroku sub-generator 會(huì)詢問你 JHipster Registry 的地址,這個(gè)可以讓你的應(yīng)用程序直接到 Spring Cloud Config server 上獲取它們的配置。
注意 以上的配置是通過http協(xié)議,但是在生產(chǎn)環(huán)境上,建議使用HTTPS來連接到你的JHipster Registry。因?yàn)楣芾韱T的密碼是通過HTTP來進(jìn)行傳輸?shù)模詷O力建議通過HTTPS來加密通信通道。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。