自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spring Cloud構(gòu)建微服務(wù)架構(gòu):分布式服務(wù)跟蹤(收集原理)

開(kāi)發(fā) 開(kāi)發(fā)工具 分布式
我們介紹一下關(guān)于Zipkin收集跟蹤信息的過(guò)程細(xì)節(jié),以幫助我們更好地理解Sleuth生產(chǎn)跟蹤信息以及輸出跟蹤信息的整體過(guò)程和工作原理。

在本節(jié)內(nèi)容之前,我們已經(jīng)對(duì)如何引入Sleuth跟蹤信息和搭建Zipkin服務(wù)端分析跟蹤延遲的過(guò)程做了詳細(xì)的介紹,相信大家對(duì)于Sleuth和Zipkin已經(jīng)有了一定的感性認(rèn)識(shí)。接下來(lái),我們介紹一下關(guān)于Zipkin收集跟蹤信息的過(guò)程細(xì)節(jié),以幫助我們更好地理解Sleuth生產(chǎn)跟蹤信息以及輸出跟蹤信息的整體過(guò)程和工作原理。

[[226135]]

數(shù)據(jù)模型

我們先來(lái)看看Zipkin中關(guān)于跟蹤信息的一些基礎(chǔ)概念。由于Zipkin的實(shí)現(xiàn)借鑒了Google的Dapper,所以它們有著類似的核心術(shù)語(yǔ),主要有下面幾個(gè)內(nèi)容:

  • Span:它代表了一個(gè)基礎(chǔ)的工作單元。我們以HTTP請(qǐng)求為例,一次完整的請(qǐng)求過(guò)程在客戶端和服務(wù)端都會(huì)產(chǎn)生多個(gè)不同的事件狀態(tài)(比如下面所說(shuō)的四個(gè)核心Annotation所標(biāo)識(shí)的不同階段),對(duì)于同一個(gè)請(qǐng)求來(lái)說(shuō),它們屬于一個(gè)工作單元,所以同一HTTP請(qǐng)求過(guò)程中的四個(gè)Annotation同屬于一個(gè)Span。每一個(gè)不同的工作單元都通過(guò)一個(gè)64位的ID來(lái)唯一標(biāo)識(shí),稱為Span ID。另外,在工作單元中還存儲(chǔ)了一個(gè)用來(lái)串聯(lián)其他工作單元的ID,它也通過(guò)一個(gè)64位的ID來(lái)唯一標(biāo)識(shí),稱為Trace ID。在同一條請(qǐng)求鏈路中的不同工作單元都會(huì)有不同的Span ID,但是它們的Trace ID是相同的,所以通過(guò)Trace ID可以將一次請(qǐng)求中依賴的所有依賴請(qǐng)求串聯(lián)起來(lái)形成請(qǐng)求鏈路。除了這兩個(gè)核心的ID之外,Span中還存儲(chǔ)了一些其他信息,比如:描述信息、事件時(shí)間戳、Annotation的鍵值對(duì)屬性、上一級(jí)工作單元的Span ID等。
  • Trace:它是由一系列具有相同Trace ID的Span串聯(lián)形成的一個(gè)樹(shù)狀結(jié)構(gòu)。在復(fù)雜的分布式系統(tǒng)中,每一個(gè)外部請(qǐng)求通常都會(huì)產(chǎn)生一個(gè)復(fù)雜的樹(shù)狀結(jié)構(gòu)的Trace。
  • Annotation:它用來(lái)及時(shí)地記錄一個(gè)事件的存在。我們可以把Annotation理解為一個(gè)包含有時(shí)間戳的事件標(biāo)簽,對(duì)于一個(gè)HTTP請(qǐng)求來(lái)說(shuō),在Sleuth中定義了下面四個(gè)核心Annotation來(lái)標(biāo)識(shí)一個(gè)請(qǐng)求的開(kāi)始和結(jié)束:

cs(Client Send):該Annotation用來(lái)記錄客戶端發(fā)起了一個(gè)請(qǐng)求,同時(shí)它也標(biāo)識(shí)了這個(gè)HTTP請(qǐng)求的開(kāi)始。

sr(Server Received):該Annotation用來(lái)記錄服務(wù)端接收到了請(qǐng)求,并準(zhǔn)備開(kāi)始處理它。通過(guò)計(jì)算sr與cs兩個(gè)Annotation的時(shí)間戳之差,我們可以得到當(dāng)前HTTP請(qǐng)求的網(wǎng)絡(luò)延遲。

ss(Server Send):該Annotation用來(lái)記錄服務(wù)端處理完請(qǐng)求后準(zhǔn)備發(fā)送請(qǐng)求響應(yīng)信息。通過(guò)計(jì)算ss與sr兩個(gè)Annotation的時(shí)間戳之差,我們可以得到當(dāng)前服務(wù)端處理請(qǐng)求的時(shí)間消耗。

cr(Client Received):該Annotation用來(lái)記錄客戶端接收到服務(wù)端的回復(fù),同時(shí)它也標(biāo)識(shí)了這個(gè)HTTP請(qǐng)求的結(jié)束。通過(guò)計(jì)算cr與cs兩個(gè)Annotation的時(shí)間戳之差,我們可以得到該HTTP請(qǐng)求從客戶端發(fā)起開(kāi)始到接收服務(wù)端響應(yīng)的總時(shí)間消耗。

  • BinaryAnnotation:它用來(lái)對(duì)跟蹤信息添加一些額外的補(bǔ)充說(shuō)明,一般以鍵值對(duì)方式出現(xiàn)。比如:在記錄HTTP請(qǐng)求接收后執(zhí)行具體業(yè)務(wù)邏輯時(shí),此時(shí)并沒(méi)有默認(rèn)的Annotation來(lái)標(biāo)識(shí)該事件狀態(tài),但是有BinaryAnnotation信息對(duì)其進(jìn)行補(bǔ)充。

收集機(jī)制

在理解了Zipkin的各個(gè)基本概念之后,下面我們結(jié)合前面章節(jié)中實(shí)現(xiàn)的例子來(lái)詳細(xì)介紹和理解Spring Cloud Sleuth是如何對(duì)請(qǐng)求調(diào)用鏈路完成跟蹤信息的生產(chǎn)、輸出和后續(xù)處理的。

首先,我們來(lái)看看Sleuth在請(qǐng)求調(diào)用時(shí)是怎么樣來(lái)記錄和生成跟蹤信息的。下圖展示了我們?cè)诒菊鹿?jié)中實(shí)現(xiàn)示例的運(yùn)行全過(guò)程:客戶端發(fā)送了一個(gè)HTTP請(qǐng)求到trace-1,trace-1依賴于trace-2的服務(wù),所以trace-1再發(fā)送一個(gè)HTTP請(qǐng)求到trace-2,待trace-2返回響應(yīng)之后,trace-1再組織響應(yīng)結(jié)果返回給客戶端。

在上圖的請(qǐng)求過(guò)程中,我們?yōu)檎麄€(gè)調(diào)用過(guò)程標(biāo)記了10個(gè)標(biāo)簽,它們分別代表了該請(qǐng)求鏈路運(yùn)行過(guò)程中記錄的幾個(gè)重要事件狀態(tài),我們根據(jù)事件發(fā)生的時(shí)間順序我們?yōu)檫@些標(biāo)簽做了從小到大的編號(hào),1代表請(qǐng)求的開(kāi)始、10代表請(qǐng)求的結(jié)束。每個(gè)標(biāo)簽中記錄了一些我們上面提到過(guò)的核心元素:Trace ID、Span ID以及Annotation。由于這些標(biāo)簽都源自一個(gè)請(qǐng)求,所以他們的Trace ID相同,而標(biāo)簽1和標(biāo)簽10是起始和結(jié)束節(jié)點(diǎn),它們的Trace ID與Span ID是相同的。

根據(jù)Span ID,我們可以發(fā)現(xiàn)在這些標(biāo)簽中一共產(chǎn)生了4個(gè)不同ID的Span,這4個(gè)Span分別代表了這樣4個(gè)工作單元:

  • Span T:記錄了客戶端請(qǐng)求到達(dá)trace-1和trace-1發(fā)送請(qǐng)求響應(yīng)的兩個(gè)事件,它可以計(jì)算出了客戶端請(qǐng)求響應(yīng)過(guò)程的總延遲時(shí)間。
  • Span A:記錄了trace-1應(yīng)用在接收到客戶端請(qǐng)求之后調(diào)用處理方法的開(kāi)始和結(jié)束兩個(gè)事件,它可以計(jì)算出trace-1應(yīng)用用于處理客戶端請(qǐng)求時(shí),內(nèi)部邏輯花費(fèi)的時(shí)間延遲。
  • Span B:記錄了trace-1應(yīng)用發(fā)送請(qǐng)求給trace-2應(yīng)用、trace-2應(yīng)用接收請(qǐng)求,trace-2應(yīng)用發(fā)送響應(yīng)、trace-1應(yīng)用接收響應(yīng)四個(gè)事件,它可以計(jì)算出trace-1調(diào)用trace-2的總體依賴時(shí)間(cr - cs),也可以計(jì)算出trace-1到trace-2的網(wǎng)絡(luò)延遲(sr - cs),也可以計(jì)算出trace-2應(yīng)用用于處理客戶端請(qǐng)求的內(nèi)部邏輯花費(fèi)的時(shí)間延遲(ss - sr)。
  • Span C:記錄了trace-2應(yīng)用在接收到trace-1的請(qǐng)求之后調(diào)用處理方法的開(kāi)始和結(jié)束兩個(gè)事件,它可以計(jì)算出trace-2應(yīng)用用于處理來(lái)自trace-1的請(qǐng)求時(shí),內(nèi)部邏輯花費(fèi)的時(shí)間延遲。

在圖中展現(xiàn)的這個(gè)4個(gè)Span正好對(duì)應(yīng)了Zipkin查看跟蹤詳細(xì)頁(yè)面中的顯示內(nèi)容,它們的對(duì)應(yīng)關(guān)系如下圖所示:

仔細(xì)的讀者可能還有這樣一個(gè)疑惑:我們?cè)赯ipkin服務(wù)端查詢跟蹤信息時(shí)(如下圖所示),在查詢結(jié)果頁(yè)面中顯示的spans是5,而點(diǎn)擊進(jìn)入跟蹤明細(xì)頁(yè)面時(shí),顯示的Total Spans又是4,為什么會(huì)出現(xiàn)span數(shù)量不一致的情況呢?

實(shí)際上這兩邊的span數(shù)量?jī)?nèi)容有不同的含義,在查詢結(jié)果頁(yè)面中的5 spans代表了總共接收的Span數(shù)量,而在詳細(xì)頁(yè)面中的Total Span則是對(duì)接收Span進(jìn)行合并后的結(jié)果,也就是前文中我們介紹的4個(gè)不同ID的Span內(nèi)容。下面我們來(lái)詳細(xì)研究一下Zipkin服務(wù)端收集客戶端跟蹤信息的過(guò)程,看看它到底收到了哪些具體的Span內(nèi)容,從而來(lái)理解Zipkin中收集到的Span總數(shù)量。

為了更直觀的觀察Zipkin服務(wù)端的收集過(guò)程,我們可以對(duì)之前實(shí)現(xiàn)的消息中間件方式收集跟蹤信息的程序進(jìn)行調(diào)試。通過(guò)在Zipkin服務(wù)端的消息通道監(jiān)聽(tīng)程序中增加斷點(diǎn),我們就能清楚的知道客戶端都發(fā)送了一些什么信息到Zipkin的服務(wù)端。在spring-cloud-sleuth-zipkin-stream依賴包中的代碼并不多,我們很容易的就能找到定義消息通道監(jiān)聽(tīng)的實(shí)現(xiàn)類:org.springframework.cloud.sleuth.zipkin.stream.ZipkinMessageListener。它的具體實(shí)現(xiàn)如下所示,其中SleuthSink.INPUT定義了監(jiān)聽(tīng)的輸入通道,默認(rèn)會(huì)使用名為sleuth的主題,我們也可以通過(guò)Spring Cloud Stream的配置對(duì)其進(jìn)行修改。

  1. @MessageEndpoint 
  2. @Conditional(NotSleuthStreamClient.class) 
  3. public class ZipkinMessageListener { 
  4.    
  5.     final Collector collector; 
  6.  
  7.     @ServiceActivator(inputChannel = SleuthSink.INPUT) 
  8.     public void sink(Spans input) { 
  9.         List<zipkin.Span> converted = ConvertToZipkinSpanList.convert(input); 
  10.         this.collector.accept(converted, Callback.NOOP); 
  11.     } 
  12.      
  13.     ... 
  14.  

從通道監(jiān)聽(tīng)方法的定義中我們可以看到Sleuth與Zipkin在整合的時(shí)候是有兩個(gè)不同的Span定義的,一個(gè)是消息通道的輸入對(duì)象org.springframework.cloud.sleuth.stream.Spans,它是sleuth中定義的用于消息通道傳輸?shù)腟pan對(duì)象,每個(gè)消息中包含的Span信息定義在org.springframework.cloud.sleuth.Span對(duì)象中,但是真正在zipkin服務(wù)端使用的并非這個(gè)Span對(duì)象,而是zipkin自己的zipkin.Span對(duì)象。所以,在消息通道監(jiān)聽(tīng)處理方法中,對(duì)sleuth的Span做了處理,每次接收到sleuth的Span之后就將其轉(zhuǎn)換成Zipkin的Span。

下面我們可以嘗試在sink(Spans input)方法實(shí)現(xiàn)的***行代碼中加入斷點(diǎn),并向trace-1發(fā)送一個(gè)請(qǐng)求,觸發(fā)跟蹤信息發(fā)送到RabbitMQ上。此時(shí)我們通過(guò)DEBUG模式可以發(fā)現(xiàn)消息通道中都接收到了兩次輸入,一次來(lái)自trace-1,一次來(lái)自trace-2。下面兩張圖分別展示了來(lái)自trace-1和trace-2輸出的跟蹤消息,其中trace-1的跟蹤消息包含了3條span信息,trace-2的跟蹤消息包含了2條span信息,所以在這個(gè)請(qǐng)求調(diào)用鏈上,一共發(fā)送了5個(gè)span信息,也就是我們?cè)赯ipkin搜索結(jié)果頁(yè)面中看到的spans數(shù)量信息。

點(diǎn)開(kāi)一個(gè)具體的Span內(nèi)容,我們可以看到如下所示的結(jié)構(gòu),它記錄了Sleuth中定義的Span詳細(xì)信息,包括該Span的開(kāi)始時(shí)間、結(jié)束時(shí)間、Span的名稱、Trace ID、Span ID、Tags(對(duì)應(yīng)Zipkin中的BinaryAnnotation)、Logs(對(duì)應(yīng)Zipkin中的Annotation)等我們之前提到過(guò)的核心跟蹤信息。

介紹到這里仔細(xì)的讀者可能會(huì)有一個(gè)這樣的疑惑,在明細(xì)信息中展示的Trace ID和Span ID的值為什么與列表展示的概要信息中的Trace ID和Span ID的值不一樣呢?實(shí)際上,Trace ID和Span ID都是使用long類型存儲(chǔ)的,在DEBUG模式下查看其明細(xì)時(shí)自然是long類型,也就是它的原始值,但是在查看Span對(duì)象的時(shí)候,我們看到的是通過(guò)toString()函數(shù)處理過(guò)的值,從sleuth的Span源碼中我們可以看到如下定義,在輸出Trace ID和Span ID時(shí)都調(diào)用了idToHex函數(shù)將long類型的值轉(zhuǎn)換成了16進(jìn)制的字符串值,所以在DEBUG時(shí)我們會(huì)看到兩個(gè)不一樣的值。

  1. public String toString() { 
  2.     return "[Trace: " + idToHex(this.traceId) + ", Span: " + idToHex(this.spanId) 
  3.             + ", Parent: " + getParentIdIfPresent() + ", exportable:" + this.exportable + "]"
  4.  
  5. public static String idToHex(long id) { 
  6.     return Long.toHexString(id); 

在接收到Sleuth之后我們將程序繼續(xù)執(zhí)行下去,可以看到經(jīng)過(guò)轉(zhuǎn)換后的Zipkin的Span內(nèi)容,它們保存在一個(gè)名為converted的列表中,具體內(nèi)容如下所示:

上圖展示了轉(zhuǎn)換后的Zipkin Span對(duì)象的詳細(xì)內(nèi)容,我們可以看到很多熟悉的名稱,也就是之前我們介紹的關(guān)于zipkin中的各個(gè)基本概念,而這些基本概念的值我們也都可以在之前sleuth的原始span中找到,其中annotations和binaryAnnotations有一些特殊,在sleuth定義的span中沒(méi)有使用相同的名稱,而是使用了logs和tags來(lái)命名。從這里的詳細(xì)信息中,我們可以直觀的看到annotations和binaryAnnotations的作用,其中annotations中存儲(chǔ)了當(dāng)前Span包含的各種事件狀態(tài)以及對(duì)應(yīng)事件狀態(tài)的時(shí)間戳,而binaryAnnotations則存儲(chǔ)了對(duì)事件的補(bǔ)充信息,比如上圖中存儲(chǔ)的就是該HTTP請(qǐng)求的細(xì)節(jié)描述信息,除此之外,它也可以存儲(chǔ)對(duì)調(diào)用函數(shù)的詳細(xì)描述(如下圖所示)。

下面我們?cè)賮?lái)詳細(xì)看看通過(guò)調(diào)試消息監(jiān)聽(tīng)程序接收到的這5個(gè)Span內(nèi)容。首先,我們可以發(fā)現(xiàn)每個(gè)Span中都包含有3個(gè)ID信息,其中除了標(biāo)識(shí)Span自身的ID以及用來(lái)標(biāo)識(shí)整條鏈路的traceId之外,還有一個(gè)之前沒(méi)有提過(guò)的parentId,它是用來(lái)標(biāo)識(shí)各Span父子關(guān)系的ID(它的值來(lái)自與上一步執(zhí)行單元Span的ID) ,通過(guò)parentId的定義我們可以為每個(gè)Span找到它的前置節(jié)點(diǎn),從而定位每個(gè)Span在請(qǐng)求調(diào)用鏈中的確切位置。在每條調(diào)用鏈路中都有一個(gè)特殊的Span,它的parentId為null,這類Span我們稱它為Root Span,也就是這條請(qǐng)求調(diào)用鏈的根節(jié)點(diǎn)。為了弄清楚這些Span之間的關(guān)系,我們可以從Root Span開(kāi)始來(lái)整理出整條鏈路的Span內(nèi)容。下表展示了我們從Root Span開(kāi)始,根據(jù)各個(gè)Span的父子關(guān)系***整理出的結(jié)果:

上表中的Host代表了該Span是從哪個(gè)應(yīng)用發(fā)送過(guò)來(lái)的;Span ID是當(dāng)前Span的唯一標(biāo)識(shí);Parent Span ID代表了上一執(zhí)行單元的Span ID;Annotation代表了該Span中記錄的事件(這里主要用來(lái)記錄HTTP請(qǐng)求的四個(gè)階段,表中內(nèi)容作了省略處理,只記錄了Annotation名稱(sr代表服務(wù)端接收請(qǐng)求,ss代表服務(wù)端發(fā)送請(qǐng)求,cs代表客戶端發(fā)送請(qǐng)求,cr代表客戶端接收請(qǐng)求),省略了一些其他細(xì)節(jié)信息,比如服務(wù)名、時(shí)間戳、IP地址、端口號(hào)等信息);Binary Annotation代表了事件的補(bǔ)充信息(Sleuth的原始Span記錄更為詳細(xì),Zipkin的Span處理后會(huì)去掉一些內(nèi)容,對(duì)于有Annotation標(biāo)識(shí)的信息,不再使用Binary Annotation補(bǔ)充,在上表中我們只記錄了服務(wù)名、類名、方法名,同樣省略了一些其他信息,比如:時(shí)間戳、IP地址、端口號(hào)等信息)。

通過(guò)收集到的Zipkin Span詳細(xì)信息,我們很容易的可以將它們與本節(jié)開(kāi)始時(shí)介紹的一次調(diào)用鏈路中的10個(gè)標(biāo)簽內(nèi)容聯(lián)系起來(lái):

  • Span ID = T的標(biāo)簽有2個(gè),分別是序號(hào)1和10,它們分別表示這次請(qǐng)求的開(kāi)始和結(jié)束。它們對(duì)應(yīng)了上表中ID為e9a933ec50d180d6的Span,該Span的內(nèi)容在標(biāo)簽10執(zhí)行結(jié)束后,由trace-1將標(biāo)簽1和10合并成一個(gè)Span發(fā)送給Zipkin Server。
  • Span ID = A的標(biāo)簽有2個(gè),分別是序號(hào)2和9,它們分別表示了trace-1請(qǐng)求接收后,具體處理方法調(diào)用的開(kāi)始和結(jié)束。該Span的內(nèi)容在標(biāo)簽9執(zhí)行結(jié)束后,由trace-1將標(biāo)簽2和9合并成一個(gè)Span發(fā)送給Zipkin Server。
  • Span ID = B的標(biāo)簽有4個(gè),分別是序號(hào)3、4、7、8,該Span比較特殊,它的產(chǎn)生跨越了兩個(gè)實(shí)例,其中標(biāo)簽3和8是由trace-1生成的,而標(biāo)簽4和7則是由trace-2生成的,所以該標(biāo)簽會(huì)拆分成兩個(gè)Span內(nèi)容發(fā)送給Zipkin Server。trace-1會(huì)在標(biāo)簽8結(jié)束的時(shí)候?qū)?biāo)簽3和8合并成一個(gè)Span發(fā)送給Zipkin Server,而trace-2會(huì)在標(biāo)簽7結(jié)束的時(shí)候?qū)?biāo)簽4和7合并成一個(gè)Span發(fā)送給Zipkin Server。
  • Span ID = C的標(biāo)簽有2個(gè),分別是序號(hào)5和6,它們分別表示了trace-2請(qǐng)求接收后,具體處理方法調(diào)用的開(kāi)始和結(jié)束。該Span的內(nèi)容在標(biāo)簽6執(zhí)行結(jié)束后,由trace-2將標(biāo)簽2和9合并成一個(gè)Span發(fā)送給Zipkin Server。

所以,根據(jù)上面的分析,Zipkin總共會(huì)收到5個(gè)Span:一個(gè)Span T,一個(gè)Span A,兩個(gè)Span B,一個(gè)Span C。結(jié)合之前請(qǐng)求鏈路的標(biāo)簽圖和這里的Span記錄,我們可以總結(jié)出如下圖所示的Span收集過(guò)程,讀者可以參照此圖來(lái)理解Span收集過(guò)程的處理邏輯以及各個(gè)Span之間的關(guān)系。

雖然,Zipkin服務(wù)端接收到了5個(gè)Span,但就如前文中分析的那樣,其中有兩個(gè)Span ID=B的標(biāo)簽,由于它們來(lái)自于同一個(gè)HTTP請(qǐng)求(trace-1對(duì)trace-2的服務(wù)調(diào)用),概念上它們屬于同一個(gè)工作單元,因此Zipkin服務(wù)端在前端展現(xiàn)分析詳情時(shí)會(huì)將這兩個(gè)Span合并了來(lái)顯示,而合并后的Span數(shù)量就是在請(qǐng)求鏈路詳情頁(yè)面中Total Spans的數(shù)量。

下圖是本章示例的一個(gè)請(qǐng)求鏈路詳情頁(yè)面,在頁(yè)面中顯示了各個(gè)Span的延遲統(tǒng)計(jì),其中第三條Span信息就是trace-1對(duì)trace-2的HTTP請(qǐng)求調(diào)用,通過(guò)點(diǎn)擊它可以查看該Span的詳細(xì)信息,點(diǎn)擊后會(huì)以模態(tài)框的方式彈出Span詳細(xì)信息(如圖下半部分),在彈出框中詳細(xì)展示了Span的Annotation和BinaryAnnotation信息,在Annotation區(qū)域我們可以看到它同時(shí)包含了trace-1和trace-2發(fā)送的Span信息,而在BinaryAnnotation區(qū)域則展示了該HTTP請(qǐng)求的詳細(xì)信息。

完整示例:

讀者可以根據(jù)喜好選擇下面的兩個(gè)倉(cāng)庫(kù)中查看trace-1和trace-2兩個(gè)項(xiàng)目:

Github:https://github.com/dyc87112/SpringCloud-Learning/

Gitee:https://gitee.com/didispace/SpringCloud-Learning/

【本文為51CTO專欄作者“翟永超”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)51CTO聯(lián)系作者獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專欄
相關(guān)推薦

2018-04-18 16:07:49

Spring Clou微服務(wù)分布式

2018-03-13 16:42:26

分布式服務(wù)跟蹤

2018-03-02 16:11:29

Spring Clou分布式服務(wù)跟蹤

2018-04-09 13:56:13

微服務(wù)架構(gòu)分布式

2018-04-02 15:01:31

微服務(wù)架構(gòu)分布式服務(wù)

2017-07-28 16:41:53

Spring Clou微服務(wù)架構(gòu)

2018-05-23 15:58:27

Spring Clou微服務(wù)架構(gòu)

2018-07-19 14:58:14

Spring Clou微服務(wù)架構(gòu)

2021-06-09 09:00:00

微服務(wù)架構(gòu)技術(shù)

2017-06-26 09:06:10

Spring Clou微服務(wù)架構(gòu)

2017-09-04 16:15:44

服務(wù)網(wǎng)關(guān)架構(gòu)

2020-05-26 11:59:30

日志鏈路微服務(wù)架構(gòu)

2017-07-03 09:50:07

Spring Clou微服務(wù)架構(gòu)

2017-08-10 11:15:05

Spring Clou微服務(wù)架構(gòu)

2017-08-09 15:50:47

Spring Clou微服務(wù)架構(gòu)

2017-12-20 15:37:39

Spring Clou微服務(wù)架構(gòu)

2023-08-25 16:26:49

微服務(wù)架構(gòu)

2018-07-09 09:27:10

Spring Clou微服務(wù)架構(gòu)

2023-09-12 22:58:51

分布式架構(gòu)微服務(wù)

2017-06-25 13:33:25

Spring Clou微服務(wù)架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)