本文截取自:http://blog.csdn.net/liaokailin/article/details/52077620 html
本博客是博主根據大神的博客,學習而來。 拒絕伸手黨。java
Zipkin 是一款開源的分佈式實時數據追蹤系統(Distributed Tracking System),基於 Google Dapper 的論文設計而來,由 Twitter 公司開發貢獻。其主要功能是彙集來自各個異構系統的實時監控數據,用來追蹤微服務架構下的系統延時問題。linux
若是你不使用zipkin的jar包運行,你也能夠用spring boot來構建zipkin的服務。git
進入官網 http://zipkin.io/pages/quickstart.html,以後使用命令啓動服務jar便可。github
官方提供了jar包獲取辦法,還有linux上經過weget來獲取zipkin的jar包。web
點擊箭頭所指的鏈接,便可下載jar包。下面紅色框內的爲linux下的jar包獲取辦法。spring
運行官方下載的jar包,以下圖所示apache
運行成功之後,咱們便可在瀏覽器輸入 http://localhost:9411,便可看到zipkin的監控頁面。api
注意:博主這個截圖是已經有服務在監控了,你的沒有服務監控 因此都是空的。瀏覽器
該程序基於maven,不會maven的同窗先去看看哈,使用的話仍是比較簡單的。
所有的pom.xml配置
<?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"> <modelVersion>4.0.0</modelVersion> <groupId>com.jg.zipkin</groupId> <artifactId>zipkin-brave</artifactId> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.6.RELEASE</version> </parent> <!-- https://mvnrepository.com/artifact/io.zipkin.brave/brave-core --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave-core</artifactId> <version>3.9.0</version> </dependency> <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave-http</artifactId> <version>3.9.0</version> </dependency> <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave-spancollector-http</artifactId> <version>3.9.0</version> </dependency> <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave-web-servlet-filter</artifactId> <version>3.9.0</version> </dependency> <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave-okhttp</artifactId> <version>3.9.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> </dependencies> <repositories> <repository> <snapshots> <enabled>false</enabled> </snapshots> <id>central</id> <name>bintray</name> <url>http://jcenter.bintray.com</url> </repository> </repositories> <!-- Package as an executable jar --> <build> <finalName>server1</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
package com.jg.zipkin.controller; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; import java.util.Random; import java.util.concurrent.TimeUnit; @RestController @RequestMapping("/") public class HomeController { @Autowired private OkHttpClient client; private Random random = new Random(); @RequestMapping("start") public String start() throws InterruptedException, IOException { int sleep= random.nextInt(100); TimeUnit.MILLISECONDS.sleep(sleep); Request request = new Request.Builder().url("http://localhost:9090/foo").get().build(); Response response = client.newCall(request).execute(); return " [service1 sleep " + sleep+" ms]" + response.body().toString(); } @RequestMapping("foo") public String foo() throws InterruptedException, IOException { int sleep= random.nextInt(100); TimeUnit.MILLISECONDS.sleep(sleep); Request request = new Request.Builder().url("http://localhost:9091/bar").get().build(); //service3 Response response = client.newCall(request).execute(); String result = response.body().string(); request = new Request.Builder().url("http://localhost:9092/tar").get().build(); //service4 response = client.newCall(request).execute(); result += response.body().string(); return " [service2 sleep " + sleep+" ms]" + result; } @RequestMapping("bar") public String bar() throws InterruptedException, IOException { //service3 method int sleep= random.nextInt(100); TimeUnit.MILLISECONDS.sleep(sleep); return " [service3 sleep " + sleep+" ms]"; } @RequestMapping("tar") public String tar() throws InterruptedException, IOException { //service4 method int sleep= random.nextInt(100); TimeUnit.MILLISECONDS.sleep(sleep); return " [service4 sleep " + sleep+" ms]"; } }
package com.jg.zipkin; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication app = new SpringApplication(Application.class); app.run(args); } }
這個類爲zipkin的核心類
package com.jg.zipkin; import okhttp3.OkHttpClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.github.kristofa.brave.Brave; import com.github.kristofa.brave.EmptySpanCollectorMetricsHandler; import com.github.kristofa.brave.Sampler; import com.github.kristofa.brave.SpanCollector; import com.github.kristofa.brave.http.DefaultSpanNameProvider; import com.github.kristofa.brave.http.HttpSpanCollector; import com.github.kristofa.brave.okhttp.BraveOkHttpRequestResponseInterceptor; import com.github.kristofa.brave.servlet.BraveServletFilter; @Configuration public class ZipkinConfig { @Autowired private ZipkinProperties properties; @Bean public SpanCollector spanCollector() { HttpSpanCollector.Config config = HttpSpanCollector.Config.builder() .connectTimeout(5000)//5s,默認10s .readTimeout(6000)//5s,默認60s .compressionEnabled(false)//默認false,span在transport以前是否會被gzipped。 .flushInterval(1)//1s .build(); return HttpSpanCollector.create("http://10.114.72.122:1011", config, new EmptySpanCollectorMetricsHandler()); } @Bean public Brave brave(SpanCollector spanCollector){ Brave.Builder builder = new Brave.Builder("server1"); //指定state builder.spanCollector(spanCollector); builder.traceSampler(Sampler.ALWAYS_SAMPLE); Brave brave = builder.build(); return brave; } @Bean public BraveServletFilter braveServletFilter(Brave brave){ BraveServletFilter filter = new BraveServletFilter(brave.serverRequestInterceptor(),brave.serverResponseInterceptor(),new DefaultSpanNameProvider()); return filter; } @Bean public OkHttpClient okHttpClient(Brave brave){ OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new BraveOkHttpRequestResponseInterceptor(brave.clientRequestInterceptor(), brave.clientResponseInterceptor(), new DefaultSpanNameProvider())) .build(); return client; } }
在application.properties中配置
server.port=8080
按照上面的配置再配置三個服務,基礎配置和上面如出一轍,只用修改分端口號 和 服務名就能夠
上面的講解的服務名爲server1,端口號爲8080的服務
接下來配置其餘三個服務:
server2:
服務名在ZipkinConfig 類中,修改服務名
端口號修改以下:
server.port=9090
server3:
服務名在ZipkinConfig 類中,修改服務名
端口號修改以下:
server.port=9091
server4:
服務名在ZipkinConfig 類中,修改服務名
端口號修改以下:
server.port=9092
分別啓動四個服務。
訪問:http://localhost:8080/start
獲得以下訪問返回值(多訪問幾回):
咱們在回到zipkin的ui上:
就能看到咱們的四個服務
在UI上選擇相應的服務,選擇對應的時間,點擊Find便可獲得響應的請求信息,
以下圖所示。
具體顯示信息:
在zipkin的ui界面點擊頭部導航條中的Dependencies,選擇相應時間,點擊analyze,
便可獲得以下圖所示的關聯關係
zipkin+brave講到這裏就結束了,本文是根據頂部那一篇文章而來,真所謂站在巨人肩膀上,歡迎你們拍磚。
示例代碼地址:
https://github.com/913545731/springcloud_demo/tree/master/springcloud_zipkin_brave