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

Spring Cloud構(gòu)建微服務(wù)架構(gòu):分布式服務(wù)跟蹤(入門)

開發(fā) 開發(fā)工具 分布式
針對(duì)上面所述的分布式服務(wù)跟蹤問題,Spring Cloud Sleuth提供了一套完整的解決方案。在本章中,我們將詳細(xì)介紹如何使用Spring Cloud Sleuth來(lái)為我們的微服務(wù)架構(gòu)增加分布式服務(wù)跟蹤的能力。

通過之前的N篇博文介紹,實(shí)際上我們已經(jīng)能夠通過使用它們搭建起一個(gè)基礎(chǔ)的微服務(wù)架構(gòu)系統(tǒng)來(lái)實(shí)現(xiàn)我們的業(yè)務(wù)需求了。但是,隨著業(yè)務(wù)的發(fā)展,我們的系統(tǒng)規(guī)模也會(huì)變得越來(lái)越大,各微服務(wù)間的調(diào)用關(guān)系也變得越來(lái)越錯(cuò)綜復(fù)雜。

通常一個(gè)由客戶端發(fā)起的請(qǐng)求在后端系統(tǒng)中會(huì)經(jīng)過多個(gè)不同的微服務(wù)調(diào)用來(lái)協(xié)同產(chǎn)生***的請(qǐng)求結(jié)果,在復(fù)雜的微服務(wù)架構(gòu)系統(tǒng)中,幾乎每一個(gè)前端請(qǐng)求都會(huì)形成一條復(fù)雜的分布式服務(wù)調(diào)用鏈路,在每條鏈路中任何一個(gè)依賴服務(wù)出現(xiàn)延遲過高或錯(cuò)誤的時(shí)候都有可能引起請(qǐng)求***的失敗。這時(shí)候?qū)τ诿總€(gè)請(qǐng)求全鏈路調(diào)用的跟蹤就變得越來(lái)越重要,通過實(shí)現(xiàn)對(duì)請(qǐng)求調(diào)用的跟蹤可以幫助我們快速的發(fā)現(xiàn)錯(cuò)誤根源以及監(jiān)控分析每條請(qǐng)求鏈路上的性能瓶頸等好處。

[[221306]]

針對(duì)上面所述的分布式服務(wù)跟蹤問題,Spring Cloud Sleuth提供了一套完整的解決方案。在本章中,我們將詳細(xì)介紹如何使用Spring Cloud Sleuth來(lái)為我們的微服務(wù)架構(gòu)增加分布式服務(wù)跟蹤的能力。

快速入門

在介紹各種概念與原理之前,我們先通過實(shí)現(xiàn)一個(gè)簡(jiǎn)單的示例,對(duì)存在服務(wù)調(diào)用的應(yīng)用增加一些sleuth的配置實(shí)現(xiàn)基本的服務(wù)跟蹤功能,以此來(lái)對(duì)Spring Cloud Sleuth有一個(gè)初步的了解,隨后再逐步展開介紹實(shí)現(xiàn)過程中的各個(gè)細(xì)節(jié)部分。

準(zhǔn)備工作

在引入Sleuth之前,我們先按照之前章節(jié)學(xué)習(xí)的內(nèi)容來(lái)做一些準(zhǔn)備工作,構(gòu)建一些基礎(chǔ)的設(shè)施和應(yīng)用:

  • 服務(wù)注冊(cè)中心:eureka-server,這里不做贅述,直接使用之前構(gòu)建的工程?;蛘咧苯邮褂梦业墓鎒ureka注冊(cè)中心,下面的例子使用該注冊(cè)中心。
  • 微服務(wù)應(yīng)用:trace-1,實(shí)現(xiàn)一個(gè)REST接口/trace-1,調(diào)用該接口后將觸發(fā)對(duì)trace-2應(yīng)用的調(diào)用。具體實(shí)現(xiàn)如下:
  • 創(chuàng)建一個(gè)基礎(chǔ)的Spring Boot應(yīng)用,在pom.xml中增加下面依賴:
  1. <parent> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-parent</artifactId> 
  4.     <version>1.5.10.RELEASE</version> 
  5.     <relativePath/>  
  6. </parent> 
  7. <dependency> 
  8.     <groupId>org.springframework.boot</groupId> 
  9.     <artifactId>spring-boot-starter-web</artifactId> 
  10. </dependency> 
  11. <dependency> 
  12.     <groupId>org.springframework.cloud</groupId> 
  13.     <artifactId>spring-cloud-starter-eureka</artifactId> 
  14. </dependency> 
  15. <dependency> 
  16.     <groupId>org.springframework.cloud</groupId> 
  17.     <artifactId>spring-cloud-starter-ribbon</artifactId> 
  18. </dependency> 
  19. <dependencyManagement> 
  20.     <dependencies> 
  21.         <dependency> 
  22.             <groupId>org.springframework.cloud</groupId> 
  23.             <artifactId>spring-cloud-dependencies</artifactId> 
  24.             <version>Dalston.SR5</version> 
  25.             <type>pom</type> 
  26.             <scope>import</scope> 
  27.         </dependency> 
  28.     </dependencies> 
  29. </dependencyManagement> 
  • 創(chuàng)建應(yīng)用主類,并實(shí)現(xiàn)/trace-1接口,并使用RestTemplate調(diào)用trace-2應(yīng)用的接口。具體如下:
  1. @RestController 
  2. @EnableDiscoveryClient 
  3. @SpringBootApplication 
  4. public class TraceApplication { 
  5.  
  6.     private final Logger logger = Logger.getLogger(getClass()); 
  7.  
  8.     @Bean 
  9.     @LoadBalanced 
  10.     RestTemplate restTemplate() { 
  11.         return new RestTemplate(); 
  12.     } 
  13.  
  14.     @RequestMapping(value = "/trace-1", method = RequestMethod.GET) 
  15.     public String trace() { 
  16.         logger.info("===call trace-1==="); 
  17.         return restTemplate().getForEntity("http://trace-2/trace-2", String.class).getBody(); 
  18.     } 
  19.  
  20.     public static void main(String[] args) { 
  21.         SpringApplication.run(TraceApplication.class, args); 
  22.     } 
  23.  
  • application.properties中將eureka.client.serviceUrl.defaultZone參數(shù)指向eureka-server的地址,具體如下:
  1. spring.application.name=trace-1 
  2. server.port=9101 
  3.  
  4. eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/ 
  • 微服務(wù)應(yīng)用:trace-2,實(shí)現(xiàn)一個(gè)REST接口/trace-2,供trace-1調(diào)用。具體實(shí)現(xiàn)如下:
  • 創(chuàng)建一個(gè)基礎(chǔ)的Spring Boot應(yīng)用,pom.xml中的依賴與trace-1相同
  • 創(chuàng)建應(yīng)用主類,并實(shí)現(xiàn)/trace-2接口,具體實(shí)現(xiàn)如下:
  1. @RestController 
  2. @EnableDiscoveryClient 
  3. @SpringBootApplication 
  4. public class TraceApplication { 
  5.  
  6.     private final Logger logger = Logger.getLogger(getClass()); 
  7.  
  8.     @RequestMapping(value = "/trace-2", method = RequestMethod.GET) 
  9.     public String trace() { 
  10.         logger.info("===<call trace-2>==="); 
  11.         return "Trace"
  12.     } 
  13.  
  14.     public static void main(String[] args) { 
  15.         SpringApplication.run(TraceApplication.class, args); 
  16.     } 
  17.  
  • application.properties中將eureka.client.serviceUrl.defaultZone參數(shù)指向eureka-server的地址,另外還需要設(shè)置不同的應(yīng)用名和端口號(hào),具體如下:
  1. spring.application.name=trace-2 
  2. server.port=9102 
  3. eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/ 

在實(shí)現(xiàn)了上面內(nèi)容之后,我們可以將eureka-server、trace-1、trace-2三個(gè)應(yīng)用都啟動(dòng)起來(lái),并通過postman或curl等工具來(lái)對(duì)trace-1的接口發(fā)送請(qǐng)求http://localhost:9101/trace-1,我們可以得到返回值Trace,同時(shí)還能在它們的控制臺(tái)中分別獲得下面的輸出:

  1. -- trace-1 
  2. INFO 25272 --- [nio-9101-exec-2] ication$$EnhancerBySpringCGLIB$$36e12c68 : ===<call trace-1>=== 
  3.  
  4. -- trace-2 
  5. INFO 7136 --- [nio-9102-exec-1] ication$$EnhancerBySpringCGLIB$$52a02f0b : ===<call trace-2>=== 

實(shí)現(xiàn)跟蹤

在完成了準(zhǔn)備工作之后,接下來(lái)我們開始進(jìn)行本章的主題內(nèi)容,為上面的trace-1和trace-2來(lái)添加服務(wù)跟蹤功能。通過Spring Cloud Sleuth的封裝,我們?yōu)閼?yīng)用增加服務(wù)跟蹤能力的操作非常簡(jiǎn)單,只需要在trace-1和trace-2的pom.xml依賴管理中增加spring-cloud-starter-sleuth依賴即可,具體如下:

  1. <dependency> 
  2.     <groupId>org.springframework.cloud</groupId> 
  3.     <artifactId>spring-cloud-starter-sleuth</artifactId> 
  4. </dependency> 

到這里,實(shí)際上我們已經(jīng)為trace-1和trace-2實(shí)現(xiàn)服務(wù)跟蹤做好了基礎(chǔ)的準(zhǔn)備,重啟trace-1和trace-2后,再對(duì)trace-1的接口發(fā)送請(qǐng)求http://localhost:9101/trace-1。此時(shí),我們可以從它們的控制臺(tái)輸出中,窺探到sleuth的一些端倪。

  1. -- trace-1 
  2. INFO [trace-1,f410ab57afd5c145,a9f2118fa2019684,false] 25028 --- [nio-9101-exec-1] ication$$EnhancerBySpringCGLIB$$d8228493 : ===<call trace-1>=== 
  3.  
  4. -- trace-2 
  5. INFO [trace-2,f410ab57afd5c145,e9a377dc2268bc29,false] 23112 --- [nio-9102-exec-1] ication$$EnhancerBySpringCGLIB$$e6cb4078 : ===<call trace-2>=== 

從上面的控制臺(tái)輸出內(nèi)容中,我們可以看到多了一些形如[trace-1,f410ab57afd5c145,a9f2118fa2019684,false]的日志信息,而這些元素正是實(shí)現(xiàn)分布式服務(wù)跟蹤的重要組成部分,它們每個(gè)值的含義如下:

  • ***個(gè)值:trace-1,它記錄了應(yīng)用的名稱,也就是application.properties中spring.application.name參數(shù)配置的屬性。
  • 第二個(gè)值:f410ab57afd5c145,Spring Cloud Sleuth生成的一個(gè)ID,稱為Trace ID,它用來(lái)標(biāo)識(shí)一條請(qǐng)求鏈路。一條請(qǐng)求鏈路中包含一個(gè)Trace ID,多個(gè)Span ID。
  • 第三個(gè)值:a9f2118fa2019684,Spring Cloud Sleuth生成的另外一個(gè)ID,稱為Span ID,它表示一個(gè)基本的工作單元,比如:發(fā)送一個(gè)HTTP請(qǐng)求。
  • 第四個(gè)值:false,表示是否要將該信息輸出到Zipkin等服務(wù)中來(lái)收集和展示。

上面四個(gè)值中的Trace ID和Span ID是Spring Cloud Sleuth實(shí)現(xiàn)分布式服務(wù)跟蹤的核心。在一次服務(wù)請(qǐng)求鏈路的調(diào)用過程中,會(huì)保持并傳遞同一個(gè)Trace ID,從而將整個(gè)分布于不同微服務(wù)進(jìn)程中的請(qǐng)求跟蹤信息串聯(lián)起來(lái),以上面輸出內(nèi)容為例,trace-1和trace-2同屬于一個(gè)前端服務(wù)請(qǐng)求來(lái)源,所以他們的Trace ID是相同的,處于同一條請(qǐng)求鏈路中。

本文完整示例:

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

Github

Gitee

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

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

 

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

2018-03-13 16:42:26

分布式服務(wù)跟蹤

2018-04-09 13:56:13

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

2018-04-02 15:01:31

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

2018-04-16 14:56:56

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

2018-04-18 16:07:49

Spring Clou微服務(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-12-20 15:37:39

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

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)

2023-09-12 22:58:51

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

2023-08-25 16:26:49

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

2017-06-25 13:33:25

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

2017-07-04 17:35:46

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

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