大家都知道分布式系統(tǒng)是非常龐大的,隨著功能的增加微服務(wù)之間的調(diào)用變得越來(lái)越多,形成非常復(fù)雜的分布式調(diào)用鏈路。一旦某個(gè)部分出現(xiàn)問(wèn)題,我們應(yīng)該如何快速定位呢?這時(shí)就可以使用Spring Cloud Sleuth+Zipkin進(jìn)行調(diào)用鏈跟蹤 。 業(yè)界內(nèi)對(duì)于調(diào)用鏈跟蹤的產(chǎn)品有很多,Google 2010年發(fā)表了"Dapper - a Large-Scale Distributed Systems Tracing Infrastructure"論文介紹他們的分布式系統(tǒng)跟蹤技術(shù),國(guó)內(nèi)具有代表性的的分布式跟蹤系統(tǒng)有: 淘寶-鷹眼-Eagleeye、京東-Hydra、大眾點(diǎn)評(píng)-cat、新浪-watchman、唯品會(huì)-microscope ... ... 但是從全世界范圍來(lái)看用的較多的還是Twitter-Zipkin。 Sleuth官網(wǎng)鏈接: https:///projects/spring-cloud Spring Cloud Sleuth 為 Spring Cloud 實(shí)現(xiàn)了一個(gè)分布式跟蹤解決方案,大量借鑒了Dapper、Zipkin 和 HTrace。對(duì)于大多數(shù)用戶來(lái)說(shuō),Sleuth 是不可見的。 三大核心概念服務(wù)跟蹤理論中存在有跟蹤單元的概念,而跟蹤單元中涉及三個(gè)重要概念:trace、span和annotation。 trace:跟蹤單元是從客戶端所發(fā)起的請(qǐng)求抵達(dá)被跟蹤系統(tǒng)的邊界開始,到被跟蹤系統(tǒng)向客戶返回響應(yīng)為止的過(guò)程,這個(gè)過(guò)程稱為一個(gè)trace。 span:每個(gè)trace中會(huì)調(diào)用若干個(gè)服務(wù),為了記錄調(diào)用了哪些服務(wù),以及每次調(diào)用所消 耗的時(shí)間等信息,在每次調(diào)用服務(wù)時(shí),埋入一個(gè)調(diào)用記錄,這樣兩個(gè)調(diào)用記錄之間的區(qū)域稱為一個(gè)span。 一個(gè)Trace由若干個(gè)有序的Span組成。 annotation:用于及時(shí)記錄事件的實(shí)體,表示一個(gè)事件發(fā)生的時(shí)間點(diǎn)。這些實(shí)體本身僅僅是為了原理敘述的方便,對(duì)于 Spring Cloud Sleuth本身并沒有什么必要性。這樣的實(shí)體有多個(gè),常用的有四個(gè): cs:Client Send,表示客戶端發(fā)送請(qǐng)求的時(shí)間點(diǎn)。 sr,Server Receive,表示服務(wù)端接收到請(qǐng)求的時(shí)間點(diǎn)。 ss:Server Send,表示服務(wù)端發(fā)送響應(yīng)的時(shí)間點(diǎn)。 cr:Client Receive,表示客戶端接收到服務(wù)端響應(yīng)的時(shí)間點(diǎn)。 日志采樣只要在工程中添加了Spring Cloud Sleuth依賴, 那么工程在啟動(dòng)與運(yùn)行過(guò)程中就會(huì)自動(dòng)生成很多的日志。Sleuth 會(huì)為日志信息打上收集標(biāo)記,需要收集的設(shè)置為true,不需要收集的設(shè)置為false。這個(gè)標(biāo)記可以通過(guò)在代碼中添加自己的日志信息看到。 Sleuth對(duì)于這些日志支持抽樣收集,即并不是所有日志都會(huì)上傳到日志收集服務(wù)器,日志收集標(biāo)記就起這個(gè)作用。默認(rèn)的采樣比例為: 0.1.即 10%。在配置文件中可以修改該值。 (若設(shè)置為 1 則表示全部采集,即100%。Sleuth默認(rèn)采用的是水塘抽樣算法。) 使用SpringCloudSleuth生成日志復(fù)制provider-8081工程,重命名為sleuth-provider-8081. 導(dǎo)入sleuth依賴 <!--sleuth 依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>12345復(fù)制代碼類型:[java] 在petsContrller.java中添加日志注解,并在getHandler方法中打印日志。 @Slf4j @RestController @RequestMapping("/pets") public class PetsController { ... ... @GetMapping("/get/{id}") public Pets getHandler(@PathVariable("id") Integer id) { log.info("生產(chǎn)者的處理器方法被調(diào)用"); return petsService.getPetsById(id); } ... ... }123456789101112復(fù)制代碼類型:[java] 將配置文件中有關(guān)日志的配置全部注釋掉!!否則將無(wú)法查看演示效果。 復(fù)制consumer-8080工程,重命名為sleuth-consumer-8080. 同樣導(dǎo)入sleuth依賴。 <!--sleuth 依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>12345復(fù)制代碼類型:[java] 在petsContrller.java中添加日志注解,并在getHandler方法中打印日志。 @Slf4j @RestController @RequestMapping("/pets") public class PetsController { ... ... @GetMapping("/get/{id}") public Pets getByIdHandler(@PathVariable("id") int id) { log.info("消費(fèi)者的處理器方法被調(diào)用"); // 消費(fèi)者連接提供者端口號(hào) String url = SERVICE_PROVIDER + "/pets/get/" + id; return restTemplate.getForObject(url, Pets.class); } ... ... }1234567891011121314復(fù)制代碼類型:[java] 運(yùn)行程序,在postman中進(jìn)行測(cè)試訪問(wèn)。 查看控制臺(tái)打印結(jié)果。 Zipkin官網(wǎng)鏈接: https:///pages/architecture.html Zipkin是Twitter開發(fā)的一個(gè)分布式系統(tǒng) APM(Application Performance Management,應(yīng)用程序性能管理)工具,其是基于Google Dapper實(shí)現(xiàn)的,用于完成日志的聚合。其與Sleuth聯(lián)用,可以為用戶提供調(diào)用鏈路監(jiān)控可視化UI界面。 Zipkin服務(wù)器主要由4個(gè)核心組件構(gòu)成: Collector:收集組件,它主要用于處理從外部系統(tǒng)發(fā)送過(guò)來(lái)的跟蹤信息,將這些信息轉(zhuǎn)換為Zipkin內(nèi)部處理的Span格式,以支持后續(xù)的存儲(chǔ)、分析、展示等功能。 Storage:存儲(chǔ)組件,它主要用于處理收集器接收到的跟蹤信息,默認(rèn)會(huì)將這些信息存儲(chǔ)在內(nèi)存中,也可以修改存儲(chǔ)策略。例如:將跟蹤信息存儲(chǔ)到數(shù)據(jù)庫(kù)中。 API:外部訪問(wèn)接口組件,外部系統(tǒng)通過(guò)這里的API可以實(shí)現(xiàn)對(duì)系統(tǒng)的監(jiān)控。 UI:用于操作界面組件,基于API組件實(shí)現(xiàn)的上層應(yīng)用。通過(guò)UI組件用戶可以方便而有直觀地查詢和分析跟蹤信息。 日志發(fā)送方式在Spring Cloud Sleuth + Zipkin系統(tǒng)中,客戶端中一旦發(fā)生服務(wù)間的調(diào)用,就會(huì)被配置在微服務(wù)中的 Sleuth 的監(jiān)聽器監(jiān)聽,然后生成相應(yīng)的Trace和Span等日志信息,并發(fā)送給Zipkin服務(wù)端。發(fā)送的方式主要有兩種,一種是通過(guò)via HTTP報(bào)文的方式,也可以通過(guò)Kafka、RabbitMQ發(fā)送。 gitee: https:///javainfamily/spring-cloud |
|
來(lái)自: 碼農(nóng)9527 > 《Java》