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