SpringBoot2.0 ZipKin示例代碼
Zipkin是一種分布式跟蹤系統(tǒng)。它有助于收集解決微服務(wù)架構(gòu)中延遲問題所需的時(shí)序數(shù)據(jù)。它管理這些數(shù)據(jù)的收集和查找。Zipkin的設(shè)計(jì)基于 Google Dapper論文。
應(yīng)用程序用于向Zipkin報(bào)告時(shí)間數(shù)據(jù)。Zipkin用戶界面還提供了一個(gè)依賴關(guān)系圖,顯示每個(gè)應(yīng)用程序有多少跟蹤請(qǐng)求。如果您正在解決延遲問題或錯(cuò)誤問題,則可以根據(jù)應(yīng)用程序,跟蹤長度,注釋或時(shí)間戳過濾或排序所有跟蹤。選擇跟蹤后,您可以看到每個(gè)跨度所需的總跟蹤時(shí)間百分比,從而可以識(shí)別問題應(yīng)用程序。
這是翻譯過來的原意,自己在這里想如果有個(gè)調(diào)用鏈,我們自己該怎么實(shí)現(xiàn)。要去質(zhì)疑任何代碼。
官方流程圖:最關(guān)鍵的是Transport這個(gè)地方,通過幾種方式傳輸給Conllector。如何在這里支持多種協(xié)議,有興趣的可以進(jìn)去看看源碼。

開始示例,在這里通過一個(gè)項(xiàng)目調(diào)用不同的方法來進(jìn)行測(cè)試。
先下載Zipkin的web UI,通過java -jar zipkin.jar執(zhí)行

項(xiàng)目結(jié)構(gòu):

pom.xml
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- zipkin--> <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave-core</artifactId> <version>3.10.0</version> </dependency> <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave-spancollector-http</artifactId> <version>3.10.0</version> </dependency> <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave-web-servlet-filter</artifactId> <version>3.10.0</version> </dependency> <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave-okhttp</artifactId> <version>3.10.0</version> </dependency> <!-- zipkin-->
application.properties
server.port=9000 ##########請(qǐng)求的項(xiàng)目名########## server.servlet.context-path=/zipkinTest ##########zipKin################ zipkin.serviceName=zipkin-test zipkin.url=http://localhost:9411 zipkin.connectTimeout=6000 zipkin.readTimeout=6000 zipkin.flushInterval=1 zipkin.compressionEnabled=true
- server.port 訪問端口號(hào)
- server.servlet.context-path 訪問項(xiàng)目名
- zipkin.serviceName 服務(wù)名
- zipkin.url Zipkin的web ui訪問地址
- zipkin.connectTimeout 連接時(shí)間
- zipkin.readTimeout 讀數(shù)據(jù)時(shí)間
- zipkin.flushInterval 采集率
- zipkin.compressionEnabled 是否壓縮
ZipkinProperties.java
package com.cms.zipkin;
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 static com.github.kristofa.brave.Brave.Builder;
import static com.github.kristofa.brave.http.HttpSpanCollector.Config;
import static com.github.kristofa.brave.http.HttpSpanCollector.create;
import com.github.kristofa.brave.okhttp.BraveOkHttpRequestResponseInterceptor;
import com.github.kristofa.brave.servlet.BraveServletFilter;
import lombok.Data;
import okhttp3.OkHttpClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @program: zjsz-user
* @description: Zipkin配置
* @author: Mr.Yang
* @create: 2018-07-03 21:58
**/
@Data
@Configuration
@ConfigurationProperties(prefix = ZipkinProperties.ZIPKIN_PREFIX)
public class ZipkinProperties {
public static final String ZIPKIN_PREFIX = "zipkin";
/**
* 服務(wù)名稱
*/
private String serviceName;
/**
* zipkin地址
*/
private String url;
/**
* 連接時(shí)間
*/
private int connectTimeout;
/**
* 讀取時(shí)間
*/
private int readTimeout;
/**
* 每間隔多少秒執(zhí)行一次Span信息上傳
*/
private int flushInterval;
/**
* 是否啟動(dòng)壓縮
*/
private boolean compressionEnabled;
/**
* @Description: span(一次請(qǐng)求信息或者一次鏈路調(diào)用)信息收集器
* @Param:
* @return: SpanCollector 控制器
* @Author: Mr.Yang
* @Date: 2018/7/3 0002
*/
@Bean
public SpanCollector spanCollector() {
Config config = Config.builder()
// 默認(rèn)false,span在transport之前是否會(huì)被gzipped
.compressionEnabled(compressionEnabled)
.connectTimeout(connectTimeout)
.flushInterval(flushInterval)
.readTimeout(readTimeout)
.build();
return create(url, config, new EmptySpanCollectorMetricsHandler());
}
/**
* @Description: 作為各調(diào)用鏈路,只需要負(fù)責(zé)將指定格式的數(shù)據(jù)發(fā)送給zipkin
* @Param:
* @return:
* @Author: Mr.Yang
* @Date: 2018/7/3 0002
*/
@Bean
public Brave brave(SpanCollector spanCollector) {
//調(diào)用服務(wù)的名稱
Builder builder = new Builder(serviceName);
builder.spanCollector(spanCollector);
//采集率
builder.traceSampler(Sampler.ALWAYS_SAMPLE);
return builder.build();
}
/**
* @Description: 設(shè)置server的(服務(wù)端收到請(qǐng)求和服務(wù)端完成處理,并將結(jié)果發(fā)送給客戶端)過濾器
* @Param:
* @return: 過濾器
* @Author: Mr.Yang
* @Date: 2018/7/3 0002
*/
@Bean
public BraveServletFilter braveServletFilter(Brave brave) {
BraveServletFilter filter = new BraveServletFilter(brave.serverRequestInterceptor(),
brave.serverResponseInterceptor(), new DefaultSpanNameProvider());
return filter;
}
/**
* @Description: 設(shè)置client的(發(fā)起請(qǐng)求和獲取到服務(wù)端返回信息)攔截器
* @Param:
* @return: OkHttpClient 返回請(qǐng)求實(shí)例
* @Author: Mr.Yang
* @Date: 2018/7/3 0002
*/
@Bean
public OkHttpClient okHttpClient(Brave brave) {
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(new BraveOkHttpRequestResponseInterceptor(
brave.clientRequestInterceptor(),
brave.clientResponseInterceptor(),
new DefaultSpanNameProvider())).build();
return httpClient;
}
}
ZipkinBraveController1
package com.cms.contorller;
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.RestController;
/**
* @program: zjsz-user
* @description: 服務(wù)一
* @author: Mr.Yang
* @create: 2018-07-03 21:58
**/
@RestController
@RequestMapping("server1")
public class ZipkinBraveController1 {
@Autowired
private OkHttpClient client;
/**
* @Description: 第一步調(diào)用
* @Param:
* @return: 字符串
* @Author: Mr.Yang
* @Date: 2018/7/3
*/
@RequestMapping("/zipkin")
public String service1() throws Exception {
Thread.sleep(100);
Request request = new Request.Builder().url("http://localhost:9000/zipkinTest/server2/zipkin").build();
Response response = client.newCall(request).execute();
return response.body().string();
}
}
ZipkinBraveController2
package com.cms.contorller;
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.RestController;
/**
* @program: zjsz-user
* @description: 服務(wù)二
* @author: Mr.Yang
* @create: 2018-07-03 21:58
**/
@RestController
@RequestMapping("server2")
public class ZipkinBraveController2 {
@Autowired
private OkHttpClient client;
/**
* @Description: 第二步調(diào)用
* @Param:
* @return: 字符串
* @Author: Mr.Yang
* @Date: 2018/7/3
*/
@RequestMapping("/zipkin")
public String service1() throws Exception {
Thread.sleep(100);
Request request = new Request.Builder().url("http://localhost:9000/zipkinTest/server3/zipkin").build();
Response response = client.newCall(request).execute();
return response.body().string();
}
}
ZipkinBraveController3
package com.cms.contorller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @program: zjsz-user
* @description: 服務(wù)三
* @author: Mr.Yang
* @create: 2018-07-03 21:58
**/
@RestController
@RequestMapping("server3")
public class ZipkinBraveController3 {
/**
* @Description: 第三步調(diào)用
* @Param:
* @return: 字符串
* @Author: Mr.Yang
* @Date: 2018/7/3
*/
@RequestMapping("/zipkin")
public String service1() throws Exception {
Thread.sleep(200);
return "你好,歡迎進(jìn)入Zipkin的世界";
}
}
項(xiàng)目啟動(dòng)后,訪問http://localhost:9000/zipkinTest/server1/zipkin 就可以看到
你好,歡迎進(jìn)入Zipkin的世界
我們通過http://localhost:9411/zipkin 查看zipkin的web UI

查看每條調(diào)用鏈的詳情

后面還會(huì)講關(guān)于zipkin將數(shù)據(jù)整合到Mysql、Elasticsearch中去。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 淺析springcloud 整合 zipkin-server 內(nèi)存日志監(jiān)控
- SpringBoot集成Zipkin實(shí)現(xiàn)分布式全鏈路監(jiān)控
- SpringCloud整合分布式服務(wù)跟蹤zipkin的實(shí)現(xiàn)
- 詳解spring cloud分布式整合zipkin的鏈路跟蹤
- spring-cloud Sleuth的使用方法
- 淺談Spring-cloud 之 sleuth 服務(wù)鏈路跟蹤
- SpringBoot+SpringCloud用戶信息微服務(wù)傳遞實(shí)現(xiàn)解析
- Spring Cloud Sleuth整合zipkin過程解析
相關(guān)文章
java文件操作報(bào)錯(cuò):java.io.FileNotFoundException(拒絕訪問)問題
在進(jìn)行編程時(shí),經(jīng)常會(huì)遇到因疏忽小細(xì)節(jié)而導(dǎo)致的錯(cuò)誤,如忘記在路徑后添加文件名,本文通過一個(gè)具體的修改前后對(duì)比示例,解釋了錯(cuò)誤原因,并給出了解決方案,這類經(jīng)驗(yàn)分享對(duì)編程學(xué)習(xí)者具有參考價(jià)值2024-10-10
解決idea每次打開新的項(xiàng)目都需要重新配置maven問題
這篇文章主要介紹了解決idea每次打開新的項(xiàng)目都需要重新配置maven問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
SpringBoot整合Javamail實(shí)現(xiàn)郵件發(fā)送的詳細(xì)過程
日常開發(fā)過程中,我們經(jīng)常需要使用到郵件發(fā)送任務(wù),比方說驗(yàn)證碼的發(fā)送、日常信息的通知等,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Javamail實(shí)現(xiàn)郵件發(fā)送的詳細(xì)過程,需要的朋友可以參考下2022-10-10
Java模擬實(shí)現(xiàn)HTTP服務(wù)器項(xiàng)目實(shí)戰(zhàn)
本文主要介紹了Java模擬實(shí)現(xiàn)HTTP服務(wù)器項(xiàng)目實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
IntelliJ IDEA2020.1版本更新pom文件自動(dòng)導(dǎo)包的方法
這篇文章主要介紹了IntelliJ IDEA2020.1版本更新pom文件自動(dòng)導(dǎo)包的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06

