日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring Sleuth和Zipkin跟踪微服务

發(fā)布時(shí)間:2025/4/14 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Sleuth和Zipkin跟踪微服务 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文地址:http://www.cnblogs.com/skyblog/p/6213683.html

隨著微服務(wù)數(shù)量不斷增長(zhǎng),需要跟蹤一個(gè)請(qǐng)求從一個(gè)微服務(wù)到下一個(gè)微服務(wù)的傳播過(guò)程, Spring Cloud Sleuth 正是解決這個(gè)問(wèn)題,它在日志中引入唯一ID,以保證微服務(wù)調(diào)用之間的一致性,這樣你就能跟蹤某個(gè)請(qǐng)求是如何從一個(gè)微服務(wù)傳遞到下一個(gè)。

  如果你有使用AOP攔截Servlet的經(jīng)驗(yàn),做一個(gè)基于AOP的簡(jiǎn)單服務(wù)統(tǒng)計(jì)和跟蹤很容易。但要像Zipkin那樣能夠跟蹤服務(wù)調(diào)用鏈就比較困難了。所謂調(diào)用鏈,就是A服務(wù)調(diào)用B服務(wù),B服務(wù)又調(diào)用了C、D服務(wù)。這樣一個(gè)鏈要想統(tǒng)計(jì)跟蹤,要寫(xiě)不少代碼。而Spring Cloud Sleuth能讓你不寫(xiě)一行代碼的情況下完成這些。

  本文涉及5個(gè)spring boot工程:

 

  前三個(gè)驗(yàn)證基本的Sleuth使用,后面兩個(gè)演示如果使用消息中間件作為Zipkin的源,以及如果將Zipkin的監(jiān)控?cái)?shù)據(jù)配置到mysql數(shù)據(jù)庫(kù)。由于前者和后者在配置方面相差較大,因此有必要將其分開(kāi)展示。簡(jiǎn)單的Sleuth應(yīng)用,在這里是指Sleuth http應(yīng)用,就是Sleuth通過(guò)http請(qǐng)求的方式將監(jiān)控日志推送到Zipkin服務(wù)器。如圖所示,cloud-sleuth-server其實(shí)就是Zipkin Server它接收來(lái)自微服務(wù)cloud-sleuth-service1和cloud-sleuth-service2的監(jiān)控日志推送,cloud-sleuth-service1調(diào)用了cloud-sleuth-service2,形成一個(gè)簡(jiǎn)單的調(diào)用鏈。其中cloud-sleuth-service1 pom配置:

  

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-sleuth-zipkin</artifactId></dependency> </dependencies>

?

SleuthClientApplication應(yīng)用:

@SpringBootApplication public class SleuthClientApplication {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(SleuthClientApplication.class, args);} }@RestController class HomeController {private static final Log log = LogFactory.getLog(HomeController.class);@Autowiredprivate RestTemplate restTemplate;private String url="http://localhost:9986";@RequestMapping("/service1")public String service1() throws Exception {log.info("service1");Thread.sleep(200L);String s = this.restTemplate.getForObject(url + "/service2", String.class);return s;} }
??

  

application.properties: spring.application.name=sleuthService1 server.port=9987 spring.zipkin.baseUrl=http://localhost:9966 spring.zipkin.enabled=true

?

  只需要在pom文件里配置spring-cloud-sleuth-zipkin并且在配置文件里配置spring.zipkin.baseUrl,那么service1就可以把監(jiān)控日志發(fā)送給目標(biāo)是baseUrl指向的Zipkin服務(wù)器,就是會(huì)自動(dòng)調(diào)用zipkin的某個(gè)rest接口將監(jiān)控日志傳給它。

  Zipkin Server的pom配置:

? 

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>io.zipkin</groupId><artifactId>zipkin-ui</artifactId><scope>runtime</scope></dependency><dependency><groupId>io.zipkin.java</groupId><artifactId>zipkin-server</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-sleuth-zipkin</artifactId></dependency>

?

SleuthServerApplication:

@SpringBootApplication @EnableZipkinServer public class SleuthServerApplication {public static void main(String[] args) {SpringApplication.run(SleuthServerApplication.class,args);} }

?

?

  application.properties配置:

spring.application.name=sleuthServer server.port=9966

  至于service2,配置和service1一樣,就是Application里面增加了servcie2 rest接口:

@SpringBootApplication public class SleuthClientApplication {public static void main(String[] args) {SpringApplication.run(SleuthClientApplication.class, args);} }@RestController class HiController {private static final Log log = LogFactory.getLog(HiController.class);@RequestMapping("/service2")public String hi() throws Exception {log.info("service2");Thread.sleep(100L);return "service2";} }

?

?

  運(yùn)行后,訪問(wèn)service1,再按照zipkin server配置的端口打開(kāi)zipkin server的監(jiān)控頁(yè)面,運(yùn)行結(jié)果如下:

?  點(diǎn)開(kāi)某一個(gè)請(qǐng)求后,會(huì)看到詳細(xì)的調(diào)用鏈請(qǐng)求信息:

點(diǎn)開(kāi)調(diào)用鏈的某個(gè)請(qǐng)求可以看更詳細(xì)的請(qǐng)求信息:

  上圖所示,依次是:

  Sleuthservcie1 Client Send:service1發(fā)起請(qǐng)求service2的時(shí)間戳。

  Sleuthservcie2 Server Receive:service2收到請(qǐng)求的時(shí)間戳。

  Sleuthservcie2 Server Send:service2處理完發(fā)送結(jié)果時(shí)間戳。

  Sleuthservcie1 Client Receive:service1收到結(jié)果的時(shí)間戳。

  圖中最上方就是這個(gè)請(qǐng)求所用的總的時(shí)間,各個(gè)環(huán)節(jié)的處理請(qǐng)求時(shí)間一目了然。

?

  如果是生產(chǎn)環(huán)境,一般需要用到第二套方案。就是先把日志發(fā)送到消息隊(duì)列,然后再由zipkin接受,zipkin接收后保存日志到數(shù)據(jù)庫(kù)。具體的配置也很簡(jiǎn)單,要注意的地方就是spring 官方的例子找不到消息中間件的具體配置,可能是在某個(gè)地方有默認(rèn),筆者還是自己配置了一下:

  spring.sleuth.sampler.percentage=1.0spring.rabbitmq.host=127.0.0.1spring.rabbitmq.port=5672spring.rabbitmq.username=guestspring.rabbitmq.password=guestspring.rabbitmq.virtualHost=/

?

  消息隊(duì)列只需要配置上就會(huì)自動(dòng)創(chuàng)建隊(duì)列。數(shù)據(jù)庫(kù)配置也是如此,其官方例子中也有,只需配置上就會(huì)自動(dòng)建表。

  spring.datasource.schema=classpath:/mysql.sqlspring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/testspring.datasource.username=rootspring.datasource.password=123spring.datasource.initialize=truespring.datasource.continueOnError=truespring.sleuth.enabled=falsezipkin.storage.type=mysql

?

?  具體參照源碼,源碼在老地方:https://git.oschina.net/zhou666/spring-cloud-7simple

轉(zhuǎn)載于:https://www.cnblogs.com/boonya/p/7462576.html

總結(jié)

以上是生活随笔為你收集整理的Spring Sleuth和Zipkin跟踪微服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。