當前位置:首頁 » 存儲配置 » 新建服務怎麼配置zuul

新建服務怎麼配置zuul

發布時間: 2022-11-18 01:48:39

『壹』 springcloud執行流程

1.Servlet

zuul.servletPath默認配置為/zuul,故請求為/zuul開頭的會跳過dispatcherServlet直接進入ZuulServlet,該配置可以自定義配置,例如用於大文件上傳

2.ZuulServlet中service方法

public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
try {
this.init((HttpServletRequest)servletRequest, (HttpServletResponse)servletResponse);
RequestContext context = RequestContext.getCurrentContext();
context.setZuulEngineRan();

try {
//運行pre過濾器
this.preRoute();
} catch (ZuulException var12) {
//有異常,執行errorFilter
this.error(var12);
//再執行postFilter
this.postRoute();
return;
}

try {
//運行rote過濾器
this.route();
} catch (ZuulException var13) {
//有異常,執行errorFilter
this.error(var13);
//再執行postFilter
this.postRoute();
return;
}

try {
//運行post過濾器
this.postRoute();
} catch (ZuulException var11) {
//有異常,執行errorFilter
this.error(var11);
}
} catch (Throwable var14) {
this.error(new ZuulException(var14, 500, "UNHANDLED_EXCEPTION_" + var14.getClass().getName()));
} finally {
RequestContext.getCurrentContext().unset();
}
}

3.FilterProcessor

其運行交由FilterProcessor中的方法runFilters,根據service中的順序,取不同的filter類型,執行其中的run方法

public Object runFilters(String sType) throws Throwable {
if (RequestContext.getCurrentContext().debugRouting()) {
Debug.addRoutingDebug("Invoking {" + sType + "} type filters");
}

boolean bResult = false;
List<ZuulFilter> list = FilterLoader.getInstance().getFiltersByType(sType);
if (list != null) {
for(int i = 0; i < list.size(); ++i) {
ZuulFilter zuulFilter = (ZuulFilter)list.get(i);
Object result = this.processZuulFilter(zuulFilter);//見下面zuulFilter的runFilter()
if (result != null && result instanceof Boolean) {
bResult |= ((Boolean)result).booleanValue();
}
}
}

return bResult;
}

zuulFilter的runFilter方法,當filter的shouldFilter()返回true時才執行run()方法

public ZuulFilterResult runFilter() {
ZuulFilterResult zr = new ZuulFilterResult();
if (!this.isFilterDisabled()) {
if (this.shouldFilter()) {
Tracer t = TracerFactory.instance().startMicroTracer("ZUUL::" + this.getClass().getSimpleName());

try {
Object res = this.run();
zr = new ZuulFilterResult(res, ExecutionStatus.SUCCESS);
} catch (Throwable var7) {
t.setName("ZUUL::" + this.getClass().getSimpleName() + " failed");
zr = new ZuulFilterResult(ExecutionStatus.FAILED);
zr.setException(var7);
} finally {
t.stopAndLog();
}
} else {
zr = new ZuulFilterResult(ExecutionStatus.SKIPPED);
}
}

return zr;
}

4.獲取過濾器FilterRegistry

其中的屬性private final ConcurrentHashMap<String, ZuulFilter> filters = new ConcurrentHashMap();
保存所有的過濾器
例子中有12個(其中有兩個為自定義的):

[org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter@3dc68586,
org.springframework.cloud.netflix.zuul.filters.pre.Servlet30WrapperFilter@4001d8c1,
org.springframework.cl

『貳』 微服務核心組件 Zuul 網關原理剖析

Zuul 網關是具體核心業務服務的看門神,相比具體實現業務的系統服務來說它是一個邊緣服務,主要提供動態路由,監控,彈性,安全性等功能。在分布式的微服務系統中,系統被拆為了多套系統,通過zuul網關來對用戶的請求進行路由,轉發到具體的後台服務系統中。

本 Chat 主要內容如下:

網關是具體核心業務服務的看門神,相比具體實現業務的系統服務來說它是一個邊緣服務,主要提供動態路由,監控,彈性,安全性等功能,下面我們從單體應用到多體應用的演化過程來講解網關的演化歷程。

一般業務系統發展歷程都是基本相似的,從單體應用到多應用,從本地調用到遠程調用。對應單體應用架構模式(如下圖1),由於只需一個應用,所有業務模塊的功能都打包為了一個 War 包進行部署,這樣可以減少機器資源和部署的繁瑣。

圖1 單體應用

在單體應用中,網關模塊是和應用部署到同一個jvm進程裡面的,當外部移動設備或者web站點訪問單體應用的功能時候,請求是先被應用的網關模塊攔截的,網關模塊對請求進行鑒權、限流等動作後在把具體的請求轉發到當前應用對應的模塊進行處理。

隨著業務的發展,網站的流量會越來越大,在單體應用中簡單的通過加機器的方式可以帶來的承受流量沖擊的能力也越來越低,這時候就會考慮根據業務將單體應用拆成若干個功能獨立的應用,單體應用拆為多個應用後,由於不同的應用開發對應的功能,所以多應用開發之間可以獨立開發而不用去理解對方的業務,另外不同的應用模塊只承受對應業務流量的壓力,不會對其他應用模塊造成影響,這時候多體的分布式系統就出現了,如下圖2。

圖2 多體應用

如上圖在多體應用中業務模塊A和B單獨起了個應用,每個應用裡面有自己的網關模塊,如果業務模塊多了,那麼每個應用都有自己的網關模塊,這樣復用性不好,所以可以考慮把網關模塊提起出來,單獨作為一個應用來做服務路由,如下圖3:

如上圖當移動設備發起請求時候是具體發送到網關應用的,經過鑒權後請求會被轉發到具體的後端服務應用上,對應前端移動設備來說他們不在乎也不知道後端伺服器應用是一個還是多個,他們只能感知到網關應用的存在。

Zuul是Netflix開源的一個網關組件,在Netflix內部系統中Zuul被用來作為內部系統的門面,如下圖是Zuul在Netflix內部使用的一個架構圖:

如上圖最上層的移動設備或者網站首先通過aws負載均衡器把請求路由到zuul網關上,zuul網關則負責把請求路由到具體的後端service上。

Zuul開源地址 https://github.com/Netflix/zuul

Zuul網關的核心是一系列的過濾器,這些過濾器可以對請求或者響應結果做一系列過濾,Zuul 提供了一個框架可以支持動態載入,編譯,運行這些過濾器,這些過濾器是使用責任鏈方式順序對請求或者響應結果進行處理的,這些過濾器直接不會直接進行通信,但是通過責任鏈傳遞的RequestContext參數可以共享一些東西。

雖然Zuul 支持任何可以在jvm上跑的語言,但是目前zuul的過濾器只能使用Groovy腳本來編寫。編寫好的過濾器腳本一般放在zuul伺服器的固定目錄,zuul伺服器會開啟一個線程定時去輪詢被修改或者新增的過濾器,然後動態進行編譯,載入到內存,然後等後續有請求進來,新增或者修改後的過濾器就會生效了。

在zuul中過濾器分為四種:

如下圖為zuul1.0的工作原理:

如上圖,當zuul接受到請求後,首先會由前置過濾器進行處理,然後在由路由過濾器具體把請求轉發到後端應用,然後在執行後置過濾器把執行結果寫會到請求方,當上面任何一個類型過濾器執行出錯時候執行該過濾器。

本節作者使用zuul的版本:

...

....

總結:zuul1.0時候當zuul接受到一個請求後會同步執行前置過濾器、路由過濾器、後置過濾器,等執行完畢後在同步把結果返回為調用方,調用方在整個過程中是阻塞的。其實SpringBoot集成的zuul就是自己實現了個前置過濾器做選擇路由,然後自己實現了個路由過濾器根據前置過濾器選擇的路由具體做路由轉發。

Netty作為高性能非同步網路通訊框架,在bbo,rocketmq,sofa等知名開源框架中都有使用,如下圖zuul2.0使用netty server作為網關監聽伺服器監聽客戶端發來的請求,然後把請求轉發到前置過濾器(inbound filters)進行處理,處理完畢後在把請求使用netty client代理到具體的後端伺服器進行處理,處理完畢後在把結果交給後者過濾器(outbound filters)進行處理,然後把處理結果通過nettyServer寫回客戶端。

...
總: 在zuul1.0時候客戶端發起的請求後需要同步等待zuul網關返回,zuul網關這邊對每個請求會分派一個線程來進行處理,這會導致並發請求數量有限。而zuul2.0使用netty作為非同步通訊,可以大大加大並發請求量。

『叄』 Zuul 路由中怎麼配置多個地址

第一步:設置路由器無線參數:1、確定SSID並固定信道登錄主路由器的管理界面,進入無線設置>>基本設置,在該頁面確認SSID(無線名稱),並固定信道,並點擊保存。

至此無線WDS橋接設置完成,副路由器下的無線終端連接到zhangsan,可以正常訪問網路。終端移動過程中,可以實現主、副路由器間的自動漫遊。

『肆』 zuul網關的作用配置Druid監控

1.統一入口:未全部為服務提供一個唯一的入口,網關起到外部和內部隔離的作用,保障了後台服務的安全性。

2.鑒權校驗:識別每個請求的許可權,拒絕不符合要求的請求。

3.動態路由:動態的將請求路由到不同的後端集群中。

4.減少客戶端與服務端的耦合:服務可以獨立發展,通過網關層來做映射

『伍』 微服務框架之Spring Cloud簡介

在了解 Spring Cloud 之前先了解一下微服務架構需要考量的核心關鍵點,如下圖:

對於以上等核心關鍵點的處理,不需要我們重復造車輪, Spring Cloud 已經幫我們集成了,它使用 Spring Boot 風格將一些比較成熟的微服務框架組合起來,屏蔽掉了復雜的配置和實現原理,為快速構建微服務架構的應用提供了一套基礎設施工具和開發支持。

Spring Cloud 所提供的核心功能包含:

Spring Cloud架構圖

Spring Cloud子項目

Spring Cloud 旗下的子項目大致可以分為兩類:

如下:

1. Spring Cloud 與 Spring Boot

Spring Boot 可以說是微服務架構的核心技術之一。通過在 Spring Boot 應用中添加 Spring MVC 依賴,就可以快速實現基於 REST 架構的服務介面,並且可以提供對 HTTP 標准動作的支持。而且 Spring Boot 默認提供 JackJson 序列化支持,可以讓服務介面輸入、輸出支持 JSON 等。因此,當使用 Spring Cloud 進行微服務架構開發時,使用 Spring Boot 是一條必經之路。

2. Spring Cloud 與服務治理( Eureka )

服務治理是 Spring Cloud 的核心,在實現上其提供了兩個選擇,即 Consul 和 Netflix 的 Eureka 。

Eureka 提供了服務注冊中心、服務發現客戶端,以及注冊服務的 UI 界面應用。

在 Eureka 的實現中,節點之間相互平等,有部分注冊中心「掛掉」也不會對整個應用造成影響,即使集群只剩一個節點存活,也可以正常地治理服務。即使所有服務注冊節點都宕機, Eureka 客戶端中所緩存的服務實例列表信息,也可讓服務消費者能夠正常工作,從而保障微服務之間互相調用的健壯性和應用的彈性。

3. Spring Cloud 與客戶端負載均衡( Ribbon )

Ribbon 默認與 Eureak 進行無縫整合,當客戶端啟動的時候,從 Eureka 伺服器中獲取一份服務注冊列表並維護在本地,當服務消費者需要調用服務時, Ribbon 就會根據負載均衡策略選擇一個合適的服務提供者實例並進行訪問。

Spring Cloud 通過集成 Netflix 的 Feign 項目,為開發者提供了聲明式服務調用,從而簡化了微服務之間的調用處理方式。並且默認 Feign 項目集成了 Ribbon ,使得聲明式調用也支持客戶端負載均衡功能。

4. Spring Cloud 與微服務容錯、降級( Hystrix )

為了給微服務架構提供更大的彈性,在 Spring Cloud 中,通過集成 Netflix 下子項目 Hystrix ,通過所提供的 @HystrixCommand 註解可以輕松為我們所開發的微服務提供容錯、回退、降級等功能。此外, Hystrix 也默認集成到 Feign 子項目中。

Hystrix 是根據「斷路器」模式而創建。當 Hystrix 監控到某服務單元發生故障之後,就會進入服務熔斷處理,並向調用方返回一個符合預期的服務降級處理( fallback ),而不是長時間的等待或者拋出調用異常,從而保障服務調用方的線程不會被長時間、不必要地佔用,避免故障在應用中的蔓延造成的雪崩效應。

而 Hystrix 的儀表盤項目( Dashboard )可以監控各個服務調用所消耗的時間、請求數、成功率等,通過這種近乎實時的監控和告警,可以及時發現系統中潛在問題並進行處理。

5. Spring Cloud 與服務網關( Zuul )

Spring Cloud 通過集成 Netflix 中的 Zuul 實現 API 服務網關功能,提供對請求的路由和過濾兩個功能

路由功能負責將外部請求轉發到具體的微服務實例上,是實現外部訪問統一入口的基礎。

過濾器功能則負責對請求的處理過程進行干預,是實現請求校驗、服務聚合等功能的基礎。

通過 Zuul ,可以將細粒度的服務組合起來提供一個粗粒度的服務,所有請求都導入一個統一的入口,對外整個服務只需要暴露一個 API 介面,屏蔽了服務端的實現細節。通過 Zuul 的反向代理功能,可以實現路由定址,將請求轉發到後端的粗粒度服務上,並做一些通用的邏輯處理。此外, Zuul 默認會與 Eureka 伺服器進行整合,自動從 Eureka 伺服器中獲取所有注冊的服務並進行路由映射,實現 API 服務網關自動配置。

6. Spring Cloud 與消息中間件( Stream )

Spring Cloud 為簡化基於消息的開發,提供了 Stream 子項目,通過建立消息應用抽象層,構建了消息收發、分組消費和消息分片等功能處理,將業務應用中的消息收發與具體消息中間件進行解耦,使微服務應用開發中可以非常方便地與 Kafka 和 RabbitMQ 等消息中間件進行集成。

Spring Cloud Bus 基於 Stream 進行擴展,可以作為微服務之間的事件、消息匯流排,用於服務集群中狀態變化的傳播。

比如 Spring Cloud Config 藉助 Bus ,可以實現配置的動態刷新處理。

7. Spring Cloud 與分布式配置中心( Config )

針對微服務架構下的配置文件管理需求, Spring Cloud 提供了一個 Config 子項目。 Spring Cloud Config 具有中心化、版本控制、支持動態更新和語言獨立等特性。

在 Config 子項目中將微服務應用分為兩種角色:配置伺服器( Config Server )和配置客戶端( Config Client )。使用配置伺服器集中地管理所有配置屬性文件,配置服務中心可以將配置屬性文件存儲到 Git 、 SVN 等具有版本管理倉庫中,也可以存放在文件系統中。默認採用 Git 的方式進行存儲,因此可以很容易地對配置文件進行修改,並實現版本控制。

8. Spring Cloud 與微服務鏈路追蹤( Sleuth )

Spring Cloud 中的 Sleuth 子項目為開發者提供了微服務之間調用的鏈路追蹤。

Sleuth 核心思想就是通過一個全局的 ID 將分布在各微服務服務節點上的請求處理串聯起來,還原了調用關系,並藉助數據埋點,實現對微服務調用鏈路上的性能數據的採集。

因此,通過 Sleuth 可以很清楚地了解到一個用戶請求經過了哪些服務、每個服務處理花費了多長時間,從而可以對用戶的請求進行分析。此外,通過將採集的數據發送給 Zipkin 進行存儲、統計和分析,從而可以實現可視化的分析和展示,幫助開發者對微服務實施優化處理。

9. Spring Cloud 與微服務安全( Security )

Spring Cloud Security 為我們提供了一個認證和鑒權的安全框架,實現了資源授權、令牌管理等功能,同時結合 Zuul 可以將認證信息在微服務調用過程中直接傳遞,簡化了我們進行安全管控的開發。

Spring Cloud Security 默認支持 OAuth 2.0 認證協議,因此單點登錄也可以非常容易實現,並且 OAuth2.0 所生成的令牌可以使用 JWT 的方式,進一步簡化了微服務中的安全管理。

10. Spring Cloud 的其他子項目

『陸』 SpringCloud服務網關Zuul分析①分發

在SpringCloud中充當服務網關的角色,它包含了鑒權、流量轉發、請求統計等等功能

Filter是Zuul的核心,用來實現對外服務的控制。Filter的生命周期有4個,分別是 「PRE」、「ROUTING」、「POST」、「ERROR」 ,整個生命周期可以用下圖來表示。

PRE:  這種過濾器在請求被路由之前調用。我們可利用這種過濾器實現身份驗證、在集群中選擇請求的微服務、記錄調試信息等。

ROUTING: 這種過濾器將請求路由到微服務。這種過濾器用於構建發送給微服務的請求,並使用Apache HttpClient或Netfilx Ribbon請求微服務。

POST: 這種過濾器在路由到微服務以後執行。這種過濾器可用來為響應添加標準的HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等。

ERROR: 在其他階段發生錯誤時執行該過濾器。 除了默認的過濾器類型,Zuul還允許我們創建自定義的過濾器類型。例如,我們可以定製一種STATIC類型的過濾器,直接在Zuul中生成響應,而不將請求轉發到後端的微服務。

根據場景需要,我們也可以自定義一些filter,穿插在整個過程的某個階段,只需要繼承ZuulFilter,並且覆蓋裡面的4個方法就可以了.

application.properties中配置:

# 禁用一些Filter的配置:

zuul.FormBodyWrapperFilter.pre.disable= true

# 路由的配置:

     # 配置需要被跳轉的地址,/user/**的網址將被分發

zuul.routes.user.path=/user/**

# 重定向的地址:

zuul.routes.user.url=http://127.0.0.1:8081/

『柒』 spring cloud 中的zuul怎麼保證自身高可用

zuul多個節點啟動,自身也可以作為服務,注冊到eureka上。
或者也可以一組節點配置為upstream,通過nginx的負載均衡分布。
後面一種方式需要自己開發監控插件,在節點出錯的時候,自動修改nginx的配置並reload,通過這個方式把節點去掉。在節點恢復之後,通過同樣的方式重新掛載上去。

『捌』 Zuul配置項中sensitiveHeaders和ignoredHeaders的不同

路由是微服務架構的不可或缺的一部分。例如:」/」 可能映射到你應用主頁,/api/users映射到用戶服務,/api/shop映射到購物服務。Zuul。Zuul是Netflix出品的一個基於JVM路由和服務端的負載均衡器。
Netflix uses Zuul for the following: * Authentication * Insights * Stress Testing * Canary Testing * Dynamic Routing * Service Migration * Load Shedding * Security * Static Response handling * Active/Active traffic management
Zuul的規則和過濾器允許使用各種基於JVM的語言,支持基於Java和Groovy。
注意:zuul.max.host.connections已經被兩個新的屬性替代:zuul.host.maxTotalConnections 和 zuul.host.maxPerRouteConnections,默認分別為200和20.
注意:默認所有routes的Hystrix隔離模式(ExecutionIsolationStrategy)是SEMAPHORE zuul.ribbonIsolationStrategy可以改為THREAD,如果這個隔離模式更好。
org.springframework.cloud and artifact id spring-cloud-starter-zuul。See the Spring Cloud Project page for details。
當一個UI應用想要代理調用一個或者多個後台服務的時候,Sping cloud創建了一個嵌入的Zuul proxy很方便的開發一個簡單的案例。這個功能對於代理前端需要訪問的後端服務非常有用,避免了所有後端服務需要關心管理CORS和認證的問題.
在Spring Boot主函數上通過註解 @EnableZuulProxy 來開啟, 這樣可以讓本地的請求轉發到適當的服務. 按照約定, 一個ID為」users」的服務會收到 /users 請求路徑的代理請求(前綴會被剝離). Zuul使用Ribbon定位服務注冊中的實例, 並且所有的請求都在hystrix的command中執行, 所以失敗信息將會展現在Hystrix metrics中, 並且一旦斷路器打開, 代理請求將不會嘗試去鏈接服務.
注意:Zuul starter沒有包含服務發現的客戶端, 所以對於路由你需要在classpath中提供一個根據service IDs做服務發現的服務.(例如, eureka是一個不錯的選擇)

『玖』 服務網關Zuul

在前面的學習中,我們使用Spring Cloud實現微服務的架構基本成型,大致是這樣的:

我們使用Spring Cloud Netflix中的Eureka實現了服務注冊中心以及服務注冊與發現;而服務間通過Ribbon或Feign實現服務的消費以及負載均衡;為了使得服務集群更為健壯,使用Hystrix的熔斷機制 來避免在微服務架構中個別服務出現異常時引起的故障蔓延。

在該架構中,我們的服務集群包括:內部服務Service A和Service B,他們都會注冊與訂閱服務至Eureka Server,而Open Servc時一個對外的服務,通過負載均衡公開至服務調用方。我們把焦點聚集在對外服務這塊,這種實現方式是否合理,有沒有更好的實現方式呢?

這種架構不足之處:

對於上面的問題,最好的解決方法是——服務網關。

為了解決上面的問題,我們需要將許可權控制這樣的東西從我們的服務單元中抽離出去,而最適合這些邏輯的地方就是處於對外訪問最前端的地方,我們需要一個更加強大的負載均衡器——服務網關。

服務網關是微服務架構中不可或缺的的部分。通過服務網關統一向外系統提供REST API的過程中,除了具備服務路由、負載均衡之外,它還具備了許可權控制等功能。Spring Cloud NetFlix中的Zuul就具備這樣的功能。

Zuul是NetFlix開源的微服務網關,它可以和Eureka、Ribbon、Hystrix等組件配合使用。Zuul的核心是一些列的過濾器,這些過濾器可以完成以下功能。

Spring Cloud對Zuul進行了整合與增強。目前,Zuul使用的默認HTTP客戶端是Apache HTTP Client,也可以使用使用其他的。

使用Zuul之後的架構如圖所示:

從圖中可以看出,客戶端請求微服務時,先經過Zuul之後再請求,這樣就可以將一些類似於校驗的業務邏輯放到zuul中去完成,而微服務本身只需要關注自己的業務邏輯即可。

首先新建一個gateway模塊,並且導入相關的依賴

然後再編寫啟動類增加@EnableZuulProxy註解。

接著編寫application.yml文件,並添加路由規則

然後啟動測試,發現可以通過zuul訪問到商品微服務地址

在上面的配置中,我們通過路由規則的配置,訪問到了商品微服務。但是如果商品微服務的地址發生變化,我們要修改配置問題。所以,我們應該通過走Eureka注冊中心來獲取地址。首先,我們需要添加Eureka依賴。

然後修改application.yml配置文件,將自己注冊到注冊中心。

隨後,通過測試發現可以通過zuul訪問商品微服務,一切正常。

過濾器是Zuul的重要組件。在我們的一般的單體應用中,也會使用過濾器過濾請求,或者完成相關的許可權配置等,例如shiro框架就是用過濾器管理許可權的。Zuul中的過濾器名為ZuulFilter:

ZuulFilter是一個抽象類,其實現類需要實現4個方法:

過濾器的執行流程如圖所示:

需求:通過編寫過濾器實現用戶是否登錄的檢查
實現:通過判斷請求中是否有token,如果有認為就是已經登錄的,如果沒有就認為時非法請求,響應401.

接下來,我們需要編寫一個UserLoginZuulFilter,邏輯如下:

隨後,我們打開瀏覽器進行測試,可以看到過濾器已經生效:

『拾』 zuul+websocket+sockjs

需要實現前端頁面->zuul網關->消息服務,建立websocket連接
使用 spring-cloud-netflix-zuul-websocket 實現zuul網關層對websocket的轉發;
注意事項:
1.前端使用sockjs,注意地址前綴

2.後端注意開啟跨域和指定sockjs協議:

3.zuul層配置:

注意:

參考:

熱點內容
資料庫賬戶管理 發布:2025-07-20 20:04:22 瀏覽:147
資料庫的分頁 發布:2025-07-20 20:02:50 瀏覽:418
離公司ip伺服器近有輻射嗎 發布:2025-07-20 19:53:50 瀏覽:918
phpmatch 發布:2025-07-20 19:47:38 瀏覽:250
plsql查看編譯錯誤 發布:2025-07-20 19:38:17 瀏覽:954
手機壓縮包有什麼用 發布:2025-07-20 19:30:54 瀏覽:673
兩個硬碟怎樣設置一個ftp 發布:2025-07-20 19:28:29 瀏覽:72
python打包成exe編譯好了 發布:2025-07-20 19:13:23 瀏覽:700
麻將杠演算法 發布:2025-07-20 19:11:01 瀏覽:807
雲伺服器初始化 發布:2025-07-20 19:03:59 瀏覽:880