云計算
作者 | 曹勝利??Apache Dubbo PMC
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供樂安網(wǎng)站建設(shè)、樂安做網(wǎng)站、樂安網(wǎng)站設(shè)計、樂安網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、樂安企業(yè)網(wǎng)站模板建站服務(wù),十多年樂安做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。K8s 介紹導(dǎo)讀:Dubbo 作為高性能 Java RPC 框架的刻板印象早已深入人心,在 Cloud Native 的架構(gòu)選型上,Spring Cloud 或許才是業(yè)界的優(yōu)先選擇。實際上,Dubbo 已經(jīng)悄然地衍進為 Cloud Native 基礎(chǔ)設(shè)施,不僅承襲過去 RPC 時代的榮耀,而且也完善了現(xiàn)有基礎(chǔ)設(shè)施的缺失。自從容器和 K8s 登上舞臺之后,給原有的 RPC 領(lǐng)域帶來了很大的挑戰(zhàn),本文主要講述 RPC 領(lǐng)域遇到的問題,以及 RPC 怎么去擁抱 K8s 的一些思考。
Kubernetes 是一個開源的,用于管理云平臺中多個主機上的容器化的應(yīng)用, Kubernetes 的目標(biāo)是讓部署容器化的應(yīng)用簡單并且高效, Kubernetes 提供了應(yīng)用部署、規(guī)劃、更新、維護的一種機制。Kubernetes 簡稱 K8s。
在 Kubernetes 中,最小的管理元素不是一個個獨立的容器,而是 Pod 。Pod 的生命周期需要注意以下幾點:
容器和應(yīng)用可能隨時被殺死; Pod Ip 和主機名可能變化 (除非使用 StatefulSet 進行定制); 寫到本地的磁盤的文件可能消失,如果想不失效,需要用存儲卷。 應(yīng)用 & 容器 &?Pod 的關(guān)系 應(yīng)用部署在容器中,一般情況下一個應(yīng)用只部署在一個容器中; 一個 Pod 下可以包含一個或多個容器,一般情況下一個 Pod 只建議部署一個容器。下列場景除外: side car; 一個容器的運行以來與本地另外一個容器。如一個容器下應(yīng)用負(fù)責(zé)下載數(shù)據(jù),另外一個容器下應(yīng)用向外提供服務(wù)。 Service如果一些 Pods 提供了一些功能供其它的 Pod 使用,在 Kubernete 集群中是如何實現(xiàn)讓這些前臺能夠持續(xù)的追蹤到這些后臺的?答案是:Service 。
Kubernete Service 是一個定義了一組 Pod 的策略抽象,這些被服務(wù)標(biāo)記的 Pod 一般都是通過 label Selector 決定的。Service 抽象了對 Pod 的訪問。
默認(rèn)的 Service ,通過一個集群 IP 獲取 A Record 。但是有時需要返回所有滿足條件的 Pod IP 列表,這時候可以直接使用 Headless Services 。
參考:https://kubernetes.io/
推薦書籍:[kubernetes in action]
RPC 介紹和分析隨著微服務(wù)的普及,應(yīng)用之間的通信有了足夠多的成熟方案。
Dubbo 在 2011 年開源之后,被大量的中小型公司采用; 在 Spring Boot 推出之后,Spring 逐漸煥發(fā)出第二春,隨即 Spring Cloud 面世,逐漸占領(lǐng)市場,在中國市場中,和 Dubbo 分庭抗?fàn)帲?gRPC 是 Google 推出的基于 Http2 的端到端的通信工具,逐漸在 K8s 市場上占據(jù)統(tǒng)治地位,如 etcd,Istio 等都采用 gRPC 作為通信工具; Service Mesh 從開始概念上就火熱,現(xiàn)在逐漸走向成熟; Istio + Envoy (其他 sidecar )逐漸開始走上舞臺。 應(yīng)用開發(fā)者視角從功能層面來說,對開發(fā)者有感知的功能有:
服務(wù)實現(xiàn) 服務(wù)暴露(注解或配置) 服務(wù)調(diào)用(注解或配置) 服務(wù)治理等從選型角度會關(guān)注以下幾點:
易用性(開發(fā)易用性和開箱即用) 性能 功能 擴展性等 框架開發(fā)者視角關(guān)鍵流程:
服務(wù)暴露 服務(wù)注冊 服務(wù)發(fā)現(xiàn) 服務(wù)調(diào)用 服務(wù)治理關(guān)鍵知識點:
序列化 網(wǎng)絡(luò)通信 服務(wù)路由 負(fù)載均衡 服務(wù)限流 熔斷 降級等服務(wù)治理 主流技術(shù)實現(xiàn) Dubbo / HSFDubbo 提供了面向接口的遠(yuǎn)程方法調(diào)用。應(yīng)用開發(fā)者定義接口,編寫服務(wù)并暴露; Client 端通過接口進行調(diào)用; Dubbo 注冊服務(wù)的維度是接口維度,每個接口會在注冊中心寫入一條數(shù)據(jù); Dubbo 支持條件路由,腳本路由,Tag 路由等。這些路由規(guī)則都是強依賴于 IP 地址。備注:Dubbo 和 HSF 的大部分機制都是相似的,所以下面都以 Dubbo 作為方案進行討論。
SpringCloudSpring Cloud 通過 Rest 形式進行網(wǎng)絡(luò)調(diào)用。應(yīng)用開發(fā)者可以自己編寫暴露 Rest 服務(wù),如 springmvc 。
Spring Cloud 里的服務(wù)注冊是應(yīng)用維度( Eureka ),Client 端和 Server 端通過約定的方式進行通信。
Spring Cloud 提供了一套標(biāo)準(zhǔn) API ,而其中 Netflix 是其中的佼佼者,對這套 API 進行了實現(xiàn),對大部分開發(fā)者來說,可以回直接依賴和使用 Netflix ,所以可以說是 Netflix 提供成了 Spring Cloud 的核心。但是作為商業(yè)公司對開源投入往往會多變,如 Eureka 已經(jīng)體制維護。
gRPCgRPC 是一個基于 HTTP/2 協(xié)議設(shè)計的 RPC 框架,它采用了 Protobuf 作為 IDL。gRPC 作為端到端的通信方案,可以解決現(xiàn)在的多語言問題。
gRPC 本身不提供服務(wù)注冊,服務(wù)治理的功能。但現(xiàn)在可以看到 gRpc 有趨勢往這方面擴展的野心。
K8sK8s 體系里暫時沒有公允的通信框架,一般推薦 gRPC 作為 RPC 框架。
K8s 體系的默認(rèn)情況下, Pod 的 IP 是變化的,所以 Pod 和 Pod 之間需要通信的話,有幾種方式:
Service+dns:新建一個 Service ,可以通過標(biāo)簽選擇到一組 Pod 列表,這個 Service 對應(yīng)一個不變的集群 IP ;Client 端通過 DNS 方式或者直接訪問集群 IP。這個集群 IP ,約等于實現(xiàn)了負(fù)載均衡 ( iptable 方式); headless service:headless service 和上面的 service 的區(qū)別是,它不提供集群 IP ,通過主機名的形式獲取一組 IP 列表,Client 端自己決定訪問哪個 Pod。 Istio + EnvoyIstio 的控制層會向 K8s 的 Api server 請求并監(jiān)聽 pod 信息,service 信息等信息。這樣 Istio 中就有了完整的 K8s 集群中的 pod,service 等的完整信息。如果 K8s 集群中有信息變更,Istio 中也可以得到通知并更新對應(yīng)的信息。
Envoy 作為 Proxy 一個最常見的實現(xiàn),以 Envoy 作為例子簡單介紹。Envoy 通過查詢文件或管理服務(wù)器來動態(tài)發(fā)現(xiàn)資源。對應(yīng)的發(fā)現(xiàn)服務(wù)及其相應(yīng)的 Api 被稱作 xDS 。協(xié)議內(nèi)容包括 LDS、RDS、CDS 等等。
參考資料:
Service Mesh 介紹:https://www.infoq.cn/article/pattern-service-mesh[Istio]
路由規(guī)則:https://istio.io/docs/tasks/traffic-management/request-routing/
備注:上述知識是通過查閱資料( Istio 官網(wǎng)),以及和集團 Service Mesh 同學(xué)溝通獲得。如有問題,歡迎指正。
小結(jié)遇到的問題和挑戰(zhàn) Spring Cloud 和 Dubbo 的共生Dubbo 默認(rèn)是基于 TCP 通信,Spring Cloud 大部分基于 Rest 請求。在阿里云實施商業(yè)化過程中,發(fā)現(xiàn)大量公司需要 Spring Cloud 應(yīng)用和 Dubbo 進行通信,社區(qū)主要依靠 Dubbo 上增加一層網(wǎng)關(guān)來解決。
是否有方案進行統(tǒng)一服務(wù)注冊發(fā)現(xiàn),以及服務(wù)調(diào)用呢?
基礎(chǔ)理論可以參考:
https://yq.aliyun.com/articles/585461
Dubbo 在 K8s 場景下的挑戰(zhàn)K8s 下 Pod 的 IP 是變化的 (默認(rèn)),Dubbo 的服務(wù)治理高度依賴 IP 。
K8s 的服務(wù)注冊通過 Pod 定義完成,服務(wù)發(fā)現(xiàn)其實是尋找 Pod 的過程。Pod 和應(yīng)用有一定的對應(yīng)關(guān)系,和 Dubbo 里的接口維度的服務(wù)注冊發(fā)現(xiàn)模型不是很匹配。
Dubbo?在?Service Mesh 場景下的生存空間Dubbo 需要進行支持裁剪,Dubbo 的大部分功能都可以交由 sidecar ( proxy )來完成。
如果公司已經(jīng)在部署 RPC 框架,這時候如果需要實施?Service Mesh ,有什么好的過渡方案嗎?
問題梳理 服務(wù)定義服務(wù)怎么定義呢?需要從應(yīng)用開發(fā)者角度看待怎么定義服務(wù)。
服務(wù)在功能維度對應(yīng)某一功能,如查詢已買訂單詳情。在 Dubbo 中,對應(yīng)某個接口下的方法;在 Spring Cloud 和 gRPC 對應(yīng)一個 http 請求。
如果從面向函數(shù)編程角度,一個服務(wù)就是一個 function 。在 Java 語言中,class 是一切編程的基礎(chǔ),所以將某些服務(wù)按照一定的維度進行聚合,放到某個接口中,就成了一個接口包含了很多的服務(wù)。
從 Dubbo 角度來解釋下:Dubbo 是面向接口編程的遠(yuǎn)程通信,所以 Dubbo 是面向服務(wù)集的編程,你如果想調(diào)用某個服務(wù),必須通過接口的方式引入,然后調(diào)用接口中的某個服務(wù)。Dubbo Ops 中提供的服務(wù)查詢功能,其實不是查詢單個服務(wù),而是通過查詢接口(服務(wù)集)之后獲得具體的方法(服務(wù))。
而在 Spring Cloud 的世界里,服務(wù)提供方會將自己的應(yīng)用信息( Ip+port )注冊成應(yīng)用下的一個實例,服務(wù)消費方和服務(wù)提供方按照約定的形式進行 Rest 請求。每個請求對應(yīng)的也是一個服務(wù)。
和 K8s 里的 Service 的區(qū)別K8s 里的 Service 其實是對應(yīng)到一組 pod+port 列表,和 DNS 聯(lián)系緊密;用通俗易懂的方式表達:維護了 pod 集合的關(guān)系映射。和上面講的服務(wù)是屬于不同場景下的兩個概念。
按照這個方式定義服務(wù),服務(wù)治理的粒度其實也是按照服務(wù)粒度,可以針對每個服務(wù)設(shè)置超時時間,設(shè)置路由規(guī)則等等。但是服務(wù)注冊的粒度和服務(wù)有什么關(guān)系呢?
服務(wù)注冊粒度一個應(yīng)用下包含了很多接口,一個接口下包含了很多服務(wù)( Dubbo );或者一個應(yīng)用包含了很多的服務(wù)( Spring Cloud )。分析下應(yīng)用維度注冊和接口維度注冊的優(yōu)缺點。會有一篇獨立的文章來闡述應(yīng)用維度注冊的方案。
接口維度注冊優(yōu)點:
服務(wù)查詢按照接口維度查詢非常方便,實現(xiàn)難度低; 應(yīng)用拆分或者合并的時候, Client 端(消費者)無需關(guān)心,做到了讓用戶無感。缺點:
和 K8s 等主流平臺的模型對應(yīng)關(guān)系不匹配; 注冊的數(shù)據(jù)量非常大,有一定的性能風(fēng)險。 應(yīng)用維度優(yōu)點:
和 K8s,Spring Cloud 等模型對應(yīng)關(guān)系一致; 性能上可以得到很大緩解。缺點:
應(yīng)用拆分或者合并的時候,Client 端需要感知 (如果想做到不感知,需要框架開發(fā)者維護一份接口和應(yīng)用映射關(guān)系的存儲); 如果想對用戶保持 Dubbo 原有的接口維度的查詢,需要較多的工作量來保證; 對用戶透明度有所減少,需要在 OPS 上提供其他一些工具。如供應(yīng)用開發(fā)者可以查看具體某個 IP 是否提供了某個服務(wù)等等。 Dubbo 和 Spring Cloud目標(biāo):
Dubbo 和 Spring Cloud 的服務(wù)發(fā)現(xiàn)進行統(tǒng)一; Dubbo 和 Spring Cloud 可以互相調(diào)用。 服務(wù)發(fā)現(xiàn)統(tǒng)一Dubbo 改造成應(yīng)用維度的服務(wù)注冊。(具體不展開,后面文章說明)
打通調(diào)用Dubbo 實現(xiàn)中,支持將以 Rest 協(xié)議進行暴露,并且讓 Spring Cloud 識別。
Dubbo + K8s在 K8s 已經(jīng)闡述過,下面的內(nèi)容也是假設(shè)一個應(yīng)用部署在一個容器里,一個容器部署在一個 pod 里。
接下來方案的討論,互相之間其實是有關(guān)聯(lián)的,如服務(wù)治理可能會影響到服務(wù)注冊發(fā)現(xiàn),服務(wù)查詢也不能依賴于服務(wù)注冊的內(nèi)容。整個設(shè)計的過程是不斷優(yōu)化的過程。下面所說的內(nèi)容,以 Dubbo 來舉例說明。
服務(wù)治理Dubbo 原有體系里的服務(wù)治理是強依賴于 IP ,當(dāng)配置了一套服務(wù)治理規(guī)則的時候,最后都是基于一個或多個 IP 地址。
到 K8s 體系下之后,要考慮的是 Pod 的 IP 不是固定的。所以當(dāng)前的路由規(guī)則不能滿足條件,而且會產(chǎn)生很多規(guī)則垃圾數(shù)據(jù)。K8s 體系下,通過 service 查找 Pod ,是基于 label selector ;通過 deployment 管理 Pod ,其實也是基于 Pod label selector 。所以 pod label selector 是在 K8s 習(xí)題中比較通用的解決方案。
以路由規(guī)則為例,需要支持一種新的路由規(guī)則:label 路由。通過一定條件匹配之后,將結(jié)果定位到以 label selector 查詢到的 Pod 列表里,而非原來的 ip 列表。
要支持 label 路由,client 端需要獲取到 client 端自己的 Pod label 信息,還需要獲取到 server pod 列表中每個 Pod 的 label 信息。
應(yīng)用獲取當(dāng)前 Pod 的信息方式Pod 定義環(huán)境變量,應(yīng)用獲??;Dubbo 提供對環(huán)境變量讀取的支持,Pod 中需要按照 Dubbo 定義的環(huán)境變量設(shè)置具體的 pod 信息。
通過 Downward API 傳遞 Pod 信息;Dubbo 需要提供對 Downward 的目錄讀取,Pod 中需要定制 downward 的對應(yīng)配置。
通過 API Server 獲取數(shù)據(jù);最強大的方式,但是應(yīng)用需要強依賴于 API Server 。 應(yīng)用獲取其他 Pod 的信息方式通過調(diào)用其他 Pod 的服務(wù)獲取;依賴于應(yīng)用能獲取自身的 Pod 信息,同時將自身的 Pod 信息暴露成服務(wù)( rest 或 dubbo 協(xié)議)。client 端通過調(diào)用對用的 Pod 獲取到對應(yīng) Pod 的完整信息。
通過 Api server 獲取數(shù)據(jù);很強大,但增加了對 Api server 的依賴。 服務(wù)注冊和發(fā)現(xiàn)K8s 體系下,RPC 服務(wù)發(fā)現(xiàn)有以下幾種方式:
注冊機制:將 IP 寫入注冊中心,用心跳保持連接;當(dāng)心跳停止,從注冊中心刪除;
利用 Service+DNS :新建一個 Service ,可以通過標(biāo)簽選擇到一組 Pod 列表,這個 Service 對應(yīng)一個不變的集群 IP ;Client 端通過 DNS 方式或者直接訪問集群 IP 。這個集群 IP ,約等于實現(xiàn)了負(fù)載均衡 ( iptable 方式);
利用 headless service(DNS) :headless service 和上面的 service 的區(qū)別是,它不提供集群 IP ,通過主機名的形式獲取一組 IP 列表,Client 端自己決定訪問哪個 Pod ;
api server :Client 端直接請求 api server ,獲取到 pod 的列表, Client 自己決定訪問 pod 的邏輯。同時獲取的時候增加 watch ,api server 會將 pod 的變化信息同步 Client 。通過拿到 Server 端的 IP 或者 host ,Client 端就可以發(fā)起? http 或者其他協(xié)議的請求。
下面介紹符合 Dubbo 的可行方案:
1. Dubbo + Zookeeper pod cluster (HSF+CS cluster)這是最簡單的方式,Dubbo 本身不需要做任何改造。帶來的問題是增加了 Zookeeper 的維護,同時這個方案很不云原生,和 K8s 的體系沒有任何關(guān)系。
腦暴上面方案是將 ZooKeeper 作為注冊中心,那么是否可以將 K8s 里 service 作為注冊中心呢?Dubbo 里每個接口去建立一個 service ,每個應(yīng)用實例啟動過程中去更新 Endpoint 信息,建立 Service-> Endpoint-> IP 列表的關(guān)系。
這種方案中 K8s service 的定義被改造了,而且定義了過多的 service ,service 的維護管理是個難題。
基于 K8s 的場景在傳統(tǒng)的 RPC 領(lǐng)域,服務(wù)分成服務(wù)注冊和服務(wù)發(fā)現(xiàn)。在 K8s 領(lǐng)域 pod 和應(yīng)用是一對一的關(guān)系,K8s 本身就提供了 pod 查找的能力,所以一定程度上服務(wù)注冊其實可以不存在,而只需要服務(wù)發(fā)現(xiàn)。但是這個其實需要一個前提:
2. Dubbo + K8s DNSDubbo 需要將服務(wù)注冊發(fā)現(xiàn)的粒度改造成應(yīng)用維度。> 在運維層面,將 app=xxx (應(yīng)用名)寫入到 pod 的 label 中。
如果 K8s service 提供了cluster ip ,那么 Dubbo 只負(fù)責(zé)調(diào)用該集群 Ip ,路由和負(fù)載均衡的邏輯則交給了 K8s 的 proxy 來完成。此方案削減了 Dubbo 的核心能力。接下來討論 headless service 提供的能力。
通過請求 <service>.<ns>.svc.<zone>. ?IN A ?的方式發(fā)起請求獲取 IP 列表,但是需要輪詢方式不斷獲取更新的 IP 列表。
服務(wù)治理相關(guān)的功能,需要在上述服務(wù)治理部分中獨立支持。
參考:https://github.com/kubernetes/dns/blob/master/docs/specification.md#24---records-for-a-headless-service
3. Dubbo + Api ServerPod 的容器中部署的 Dubbo 應(yīng)用,服務(wù)注冊流程可以直接刪除,服務(wù)發(fā)現(xiàn)功能通過和 Api Server 進行交互,獲取 Pod 和 service 信息,同時 watch pod 和service 的變更。通過這種方式之后,服務(wù)治理相關(guān)的信息也可以通過 Api Server 直接獲取。
4. Dubbo + Istio + EnvoyDubbo 可以直接使用指定 ip+端口 的方式調(diào)用同一個 pod 下 Envoy ?(也可能是同一個node的Envoy)。Dubbo 將路由規(guī)則,負(fù)載均衡,熔斷等功能交給 Istio 和 Envoy。Envoy 需要支持 Dubbo 協(xié)議的轉(zhuǎn)發(fā)。
所以 Dubbo 需要完成兩個事情:本地 IP 直連(現(xiàn)有功能), 多余功能裁剪(暫未實現(xiàn))。
5. Dubbo + IstioDubbo 應(yīng)用不再依賴 Envoy 作為 sidecar ,而是直接和 Istio 進行交互,把 Istio 作為注冊中心,作為服務(wù)治理的配置中心; Dubbo 需要提供類似的 xDS 協(xié)議,在pilot將service的instance轉(zhuǎn)換成dubbo的協(xié)議格式; Dubbo 還需要去適配 istio 的一些功能,如健康檢查,安全相關(guān)的邏輯。具體實現(xiàn)可以參考 Envoy 的實現(xiàn)。 6. Dubbo 和 Istio 在 K8s 體系下共存這個可選擇的方案較多,我提供兩種思路,供大家思考:所有的服務(wù)注冊通過k8s的機制完成,所有的服務(wù)發(fā)現(xiàn)通過 Headless service 完成。sidecar 在創(chuàng)建過程中,需要對原有的 K8s service 進行 update;
Nacos 作為 Dubbo 的注冊中心,并且需要將 K8s 中的數(shù)據(jù)進行部分中轉(zhuǎn)。Dubbo 應(yīng)用,將服務(wù)注冊以應(yīng)用維度注冊到 Nacos ,Istio Pilot 需要識別 Nacos 數(shù)據(jù);Istio 的運行機制基本不變,需要將 K8s service instance 的數(shù)據(jù)寫入到 nacos ,供 Dubbo 調(diào)用。 7. 云上和云下環(huán)境共存 & 云上多集群環(huán)境Istio 提供了跨集群和云上云下的解決方案, kubeFed 作為 K8s 的跨集群解決方案也能起到一定作用。
這個課題的復(fù)雜度更加高,心中有了一些答案,期望大家通過上文也有一定的思考。
服務(wù)查詢拋出三種方式,供大家思考。
Dubbo 原有方式Dubbo 原有的服務(wù)查詢是針對接口的查詢,每個接口會有版本號和組別。接口名+版本號+組別確定唯一的服務(wù)集合,這個服務(wù)集下有對應(yīng)的服務(wù)提供者和服務(wù)消費者(接口級依賴),服務(wù)提供者是一組 ip+port 列表,服務(wù)消費者也是一組 ip+port 列表。
當(dāng)做了改造成應(yīng)用級別的服務(wù)注冊或者直接使用 K8s 自帶的 Pod 發(fā)現(xiàn)機制的話,需要做一些改造,這部分改造,和前面提到的一樣,放到其他文章里單獨說明。
只支持應(yīng)用查詢和 Spring Cloud 類似,支持應(yīng)用維度的查詢。查詢到具體應(yīng)用之后,應(yīng)用詳情下包含了 ip+port 列表,每個 ip+port 其實就是一個應(yīng)用的實例。點擊開每個應(yīng)用實例,可以查看每個應(yīng)用的詳細(xì)信息,詳細(xì)信息包含了該實例提供了哪些服務(wù)。
接口+應(yīng)用查詢均衡在原來只支持應(yīng)用查詢的基礎(chǔ)上,增加一步:支持查詢某個接口對應(yīng)的應(yīng)用列表,而大部分接口只屬于一個應(yīng)用。
再點擊應(yīng)用列表下具體的應(yīng)用之后,會跳到應(yīng)用詳情。
總結(jié)上述討論的是開源的方案,所以相對歷史包袱比較少。對一些大公司想從原有的 RPC 方案切換到云原生的支持,需要考慮更多兼容性和性能,需要付出更大的代價。
云原生的趨勢已經(jīng)勢不可擋,在 RPC 領(lǐng)域究竟哪種方案最終能夠勝出,現(xiàn)在還言之過早。我相信 Service Mesh 和傳統(tǒng)的 RPC ?(Dubbo/ gRPC)? 都會有自己的一席之地,一切讓時間給我們答案吧。
“ 阿里巴巴云原生微信公眾號(ID:Alicloudnative)關(guān)注微服務(wù)、Serverless、容器、Service Mesh等技術(shù)領(lǐng)域、聚焦云原生流行技術(shù)趨勢、云原生大規(guī)模的落地實踐,做最懂云原生開發(fā)者的技術(shù)公眾號。”
網(wǎng)頁標(biāo)題:Dubbo在K8s下的思考
文章起源:http://www.rwnh.cn/article8/cppjip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、品牌網(wǎng)站設(shè)計、網(wǎng)站設(shè)計公司、電子商務(wù)、虛擬主機、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)