javascript
SpringCloud教程- 服务链路追踪(Spring Cloud Sleuth)(SpringCloud版本Greenwich.SR4)
文章目錄
- 一、Sleuth簡介
- 二、為何使用Sleuth
- 三、構建工程
- server-zipkin
- zipkin-serivce-hi
- zipkin-server-hello
- 四、 啟動工程演示
代碼地址: github-spring-cloud地址
一、Sleuth簡介
微服務跟蹤(sleuth)其實是一個工具,它在整個分布式系統中能跟蹤一個用戶請求的過程(包括數據采集,數據傳輸,數據存儲,數據分析,數據可視化),捕獲這些跟蹤數據,就能構建微服務的整個調用鏈的視圖,這是調試和監控微服務的關鍵工具。并且兼容支持了 zipkin,你只需要在pom文件中引入相應的依賴即可。
二、為何使用Sleuth
1、微服務的現狀,隨著業務的發展,單體架構變為微服務架構,并且系統規模也變得越來越大,各微服務間的調用關系也變得越來越復雜。
2、多服務協同工作,在微服務的應用中,一個由客戶端發起的請求在后端系統中會經過多個不同的微服務調用來協同產生最后的請求結果。
3、復雜的調用鏈條容易出錯,在復雜的微服務架構系統中,幾乎每一個前端請求都會形成一個復雜的分布式服務調用鏈路,在每條鏈路中任何一個依賴服務出現延遲超時或者錯誤都有可能引起整個請求最后的失敗
例如:
??在微服務系統中,一個來自用戶的請求,請求先達到前端A(如前端界面)然后通過遠程調用,到達系統中間件B,C(負載均衡,網關等),最后達到后端服務D,E,后端經過一系列的業務邏輯計算最后將數據返回給用戶,對于這樣一個請求,經歷了這么多個服務,怎么樣將它的請求過程的數據記錄下來呢?這就需要用到服務鏈路追蹤
?
官網服務追蹤圖和基本術語
- Span:基本工作單元,例如,在一個新建的span中發送一個RPC等同于發送一個回應請求給RPC,span通過一個64位ID唯一標識,trace以另一個64位ID表示,span還有其他數據信息,比如摘要、時間戳事件、關鍵值注釋(tags)、span的ID、以及進度ID(通常是IP地址)
span在不斷的啟動和停止,同時記錄了時間信息,當你創建了一個span,你必須在未來的某個時刻停止它。 - Trace:一系列spans組成的一個樹狀結構,例如,如果你正在跑一個分布式大數據工程,你可能需要創建一個trace。
- Annotation:用來及時記錄一個事件的存在,一些核心annotations用來定義一個請求的開始和結束
- cs - Client Sent -客戶端發起一個請求,這個annotion描述了這個span的開始
- sr - Server Received -服務端獲得請求并準備開始處理它,如果將其sr減去cs時間戳便可得到網絡延遲
- ss - Server Sent -注解表明請求處理的完成(當請求返回客戶端),如果ss減去sr時間戳便可得到服務端需要的處理請求時間
- cr - Client Received -表明span的結束,客戶端成功接收到服務端的回復,如果cr減去cs時間戳便可得到客戶端從服務端獲取回復的所有所需時間
將Span和Trace在一個系統中使用Zipkin注解的過程圖形化:
三、構建工程
前面講解了sleuth是什么以及為什么用使用sleuth,下面我們做一個實驗,本文的案例主要有三個工程組成:一個server-zipkin,它的主要作用使用ZipkinServer 的功能,收集調用數據,并展示;一個zipkin-service-hi,對外暴露hi接口;一個zipkin-service-sleuth,對外暴露sleuth接口;這兩個service可以相互調用;并且只有調用了,server-zipkin才會收集數據的,這就是為什么叫服務追蹤了。
server-zipkin
server-zipkin只需要下載jar就可以,下載地址為:https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/
下載完之后運行
java -jar zipkin-server-2.12.1-exec.jar
zipkin-serivce-hi
引入pom文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>spring-cloud-learn</artifactId><groupId>com.sl.learn.cloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.sl.learn.cloud</groupId><artifactId>zipkin-servce-hi</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>配置文件application.properties
配置zipkin-server地址spring.zipkin.base-url=http://localhost:9411
啟動類ZipkinServiceHiApplication
@SpringBootApplication @EnableDiscoveryClient public class ZipkinServiceHiApplication {public static void main(String[] args) {SpringApplication.run(ZipkinServiceHiApplication.class,args);} }調用另一個服務zipkin-server-hello的Controller
@RestController public class ZipkinServiceController {private static final Logger logger = LoggerFactory.getLogger(ZipkinServiceController.class);@Autowiredprivate RestTemplate restTemplate;@RequestMapping("/hello")public String hello() {logger.info( "calling trace zipkin-service-hi ");return restTemplate.getForObject("http://localhost:8980/hello", String.class);}@RequestMapping("/zipkinHi")public String hello1() {return "zipkin-hi";} }調用服務的config
@Configuration public class RestTemplateConfig {@Beanpublic RestTemplate getRestTemplate() {return new RestTemplate();}@Beanpublic Sampler defaultSampler() {return Sampler.ALWAYS_SAMPLE;} }zipkin-server-hello
zipkin-server-hello這個服務和上一個差不多只是把controller改下
@RestController public class ZipkinServiceController {private static final Logger logger = LoggerFactory.getLogger(ZipkinServiceController.class);@Autowiredprivate RestTemplate restTemplate;@RequestMapping("/hello")public String hello() {logger.info( "calling trace zipkin-service-hi ");return restTemplate.getForObject("http://localhost:8980/zipkinHello", String.class);}@RequestMapping("/zipkinHello")public String hello1() {return "zipkin-hello";} }zipkin-server-hello工程結構
四、 啟動工程演示
啟動訪問:http://localhost:8988/hello
返回結果為:zipkin-hello
訪問zipkin:http://localhost:9411/zipkin,調用信息已經可以看到
總結
以上是生活随笔為你收集整理的SpringCloud教程- 服务链路追踪(Spring Cloud Sleuth)(SpringCloud版本Greenwich.SR4)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git push代码出现push rej
- 下一篇: windows下安装服务注册Consul