什么是Sleuth
整个分布式系统中能跟踪一个用户请求的过程(包括数据采集,数据传输,数据存储,数据分析,数据可视化),捕获这些跟踪数据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具
什么是Zipkin
Zipkin 是一个开放源代码分布式的跟踪系统,每个服务向zipkin报告计时数据,zipkin会根据调用关系通过Zipkin UI生成依赖关系图
什么是ELK
日志分析系统
点击下载
Maven添加依赖
<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>springcloud-demo-decartifactId>
<groupId>com.examplegroupId>
<version>1.0.0-SNAPSHOTversion>
<relativePath>../../pom.xmlrelativePath>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>zipkin-serverartifactId>
<dependencies>
<dependency>
<groupId>io.zipkin.javagroupId>
<artifactId>zipkin-serverartifactId>
<version>2.8.4version>
dependency>
<dependency>
<groupId>io.zipkin.javagroupId>
<artifactId>zipkin-autoconfigure-uiartifactId>
<version>2.8.4version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<mainClass>com.example.springcloud.ZipkinApplicationmainClass>
configuration>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>
plugins>
build>
project>
application.yml
spring:
application:
name: zipkin-server
main:
allow-bean-definition-overriding: true
server:
port: 62100
management:
metrics:
web:
server:
auto-time-requests: false # 如若没有这个配置,访问WEB时,会抛出"There is already an existing meter named 'http_server_requests_seconds'"
启动类
@EnableZipkinServer
@SpringBootApplication
public class ZipkinApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(ZipkinApplication.class)
.web(WebApplicationType.SERVLET)
.run(args);
}
}
启动与访问 Zipkin
java -jar zipkin-server-${version}.jar
http://localhost:62100/zipkin/
Maven添加依赖
<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>springcloud-demo-decartifactId>
<groupId>com.examplegroupId>
<version>1.0.0-SNAPSHOTversion>
<relativePath>../../pom.xmlrelativePath>
parent>
<modelVersion>4.0.0modelVersion>
<packaging>jarpackaging>
<artifactId>sleuth-traceAartifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-sleuthartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zipkinartifactId>
dependency>
project>
application.yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:20000/eureka/
info:
app:
description: test
name: sleuth-traceA
logging:
file: ${spring.application.name}.log
management:
endpoint:
env:
enabled: false
health:
show-details: always
endpoints:
web:
exposure:
include: '*'
server:
port: 62000
spring:
application:
name: sleuth-traceA
zipkin:
base-url: http://localhost:62100 # Zipkin的地址
---
# Sleuth采样率
spring:
sleuth:
sampler:
probability: 1 # 1 = 100% 如若采样 50% 就是 0.5
logback-spring.xml
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<springProperty scope="context" name="springAppName"
source="spring.application.name" />
<property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${springAppName}" />
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFOlevel>
filter>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}pattern>
<charset>utf8charset>
encoder>
appender>
<root level="INFO">
<appender-ref ref="console" />
root>
configuration>
启动类
@Slf4j
@RestController
@EnableDiscoveryClient
@SpringBootApplication
public class SleuthTrace1Application {
@Bean
@LoadBalanced
public RestTemplate lb() {
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
@GetMapping(value = "/traceA")
public String traceA() {
log.info("-------Trace A");
return restTemplate.getForEntity("http://sleuth-traceB/traceB", String.class).getBody();
}
public static void main(String[] args) {
new SpringApplicationBuilder(SleuthTrace1Application.class)
.web(WebApplicationType.SERVLET)
.run(args);
}
}
请求 traceA 后的链路信息
通过kibana查询服务与服务之间调用的traceId, 从而得到整个链路的日志检索
ELK为了演示使用单体容器方式实现
sleuth-traceA 与 sleuth-traceB 添加依赖
<dependency>
<groupId>net.logstash.logbackgroupId>
<artifactId>logstash-logback-encoderartifactId>
<version>5.2version>
dependency>
sleuth-traceA 与 sleuth-traceB 的 logback-spring.xml 添加 logstash 配置
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.8.246:5044destination>
<encoder
class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTCtimeZone>
timestamp>
<pattern>
<pattern>
{
"severity": "%level",
"service": "${springAppName:-}",
"trace": "%X{X-B3-TraceId:-}",
"span": "%X{X-B3-SpanId:-}",
"exportable": "%X{X-Span-Export:-}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"rest": "%message"
}
pattern>
pattern>
providers>
encoder>
appender>
<root level="INFO">
<appender-ref ref="console" />
<appender-ref ref="logstash" />
root>
http://localhost:5601/
Discover --> 选择 ‘*’
GitHub
博客园
CSDN
我的博客