使用 MySQL 的 Spring Cloud Sleuth
Posted
技术标签:
【中文标题】使用 MySQL 的 Spring Cloud Sleuth【英文标题】:Spring Cloud Sleuth with MySQL 【发布时间】:2021-09-06 23:14:33 【问题描述】:我一直在寻找任何合适的示例来证明我可以找出跟踪并将其存储在本地 mysql 数据库中。 我使用 zipkin 服务器来可视化我对微服务的分布式跟踪。 如果有人在最新版本的 gradle 中使用 Spring Cloud Sleuth,请交出可以帮助我的完美示例。
这是我的代码:
build.gradle
plugins
id 'org.springframework.boot' version '2.2.6.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations
compileOnly
extendsFrom annotationProcessor
repositories
mavenCentral()
ext
set('springCloudVersion', "Hoxton.SR4")
dependencies
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test')
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.16'
// https://mvnrepository.com/artifact/io.zipkin.zipkin2/zipkin-storage-mysql-v1
implementation group: 'io.zipkin.zipkin2', name: 'zipkin-storage-mysql-v1', version: '2.23.2'
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', version: '2.5.0'
dependencyManagement
imports
mavenBom "org.springframework.cloud:spring-cloud-dependencies:$springCloudVersion"
test
useJUnitPlatform()
application.properties
server.port=8083
spring.application.name=service1
#logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG
spring.sleuth.sampler.percentage=1.0
spring.zipkin.enabled=true
spring.zipkin.base-url=http://localhost:9411/
spring.sleuth.enabled=true
spring.zipkin.storage.type=mysql
spring.datasource.url=jdbc:mysql://localhost:3306/zipkin
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.schema=classpath:mysql.sql
spring.datasource.initialization-mode=always
spring.jpa.show-sql=true
spring.sleuth.web.enabled=true
spring.zipkin.sender.type=web
控制器类
@RestController
@Slf4j
@RequiredArgsConstructor
public class SpaceShipRestController
private final RestTemplate restTemplate;
@GetMapping("/service1")
public String service1()
log.info("service1 start");
String service2 = restTemplate.getForObject("http://localhost:8090/service2", String.class);
String service3 = restTemplate.getForObject("http://localhost:9090/service3", String.class);
log.info("call" + service2 + "and" + service3);
return "calling service2";
应用程序类
@SpringBootApplication
@EnableAutoConfiguration
public class DemoApplication
public static void main(String[] args)
SpringApplication.run(DemoApplication.class, args);
@Bean
public RestTemplate restTemplate()
return new RestTemplate();
@Bean
@Primary
public MySQLStorage mySQLStorage(DataSource datasource)
return MySQLStorage.newBuilder().datasource(datasource).executor(Runnable::run).build();
我已使用 zipkin-server-2.23.2-exec jar 在端口 localhost:9411 作为默认端口启动服务器 在 cmd 上使用此命令。 java -jar zipkin-server-2.23.2-exec
我的 zipkin 已启动并且工作正常,我只是被困在我的 MySQL 数据库中存储跟踪,这些表正在正确创建。但是记录是空的。 我不知道为什么我认为我缺少任何配置。 我关注了this 文章,因为他们显示将跟踪存储在数据库中。 任何人都可以建议我在哪里进行评估。
My zipkin UI looks like
My MySQL DB
【问题讨论】:
【参考方案1】:请使用 Spring Cloud Sleuth 3.1.0-SNAPSHOT(通过 2021.0.0-SNAPSHOT 火车,我们应该在 6 月 AFAIR 有 M1)。在这里你可以找到一个示例https://github.com/spring-cloud-samples/spring-cloud-sleuth-samples/tree/3.1.x/data(记住这部分https://github.com/spring-cloud-samples/spring-cloud-sleuth-samples/blob/3.1.x/data/pom.xml#L33-L38)和文档https://docs.spring.io/spring-cloud-sleuth/docs/3.1.0-SNAPSHOT/reference/html/integrations.html#sleuth-jdbc-integration。为了您的方便,我复制下面的代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.sleuthsamples</groupId>
<artifactId>data</artifactId>
<version>1.0.0-SLEUTH</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<spring-cloud.version>2021.0.0-SNAPSHOT</spring-cloud.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Either p6spy or datasource-proxy -->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
<scope>runtime</scope>
</dependency>
<!-- Either p6spy or datasource-proxy -->
<!-- <dependency>
<groupId>net.ttddyy</groupId>
<artifactId>datasource-proxy</artifactId>
<version>1.7</version>
<scope>runtime</scope>
</dependency> -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>$spring-cloud.version</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/release</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-plugin-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-plugin-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/release</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
如果您不想使用快照,则需要使用 Brave 的 p6spy 支持 https://github.com/openzipkin/brave/tree/master/instrumentation/p6spy 。请将io.zipkin.brave:brave-instrumentation-p6spy
添加到类路径并更改项目自述文件中显示的属性
【讨论】:
感谢您回答@Marcin Grzejszczak 其实我想知道在 MySQL 中存储和创建表的过程,请您帮我解决这个问题,或者只是建议任何简单的示例 application.properties 和 build.gradle 创建与 MySQl DB 的连接并创建包含 traceId、sapnId 等列的表 所以这完全不同。你为什么想这么做?使用 mysql 数据存储启动一个 zipkin 实例,您已经准备好了。 嘿@Marcin Grzejszczak 我刚刚用我的代码编辑了我的问题,你能不能回顾一下,因为我需要将我的traceIds和SpanIdsas存储在Db中。当服务器关闭时,Zipkin 会清除所有的痕迹,所以我只需要将它与 MySql 一起存储。以上是关于使用 MySQL 的 Spring Cloud Sleuth的主要内容,如果未能解决你的问题,请参考以下文章
Spring cloud alibaba Nacos配置中心多数据源配置,Nacos使用占位符${}进行参数配置,Nacos配置MySQL持久化保存配置信息
Spring cloud alibaba Nacos配置中心多数据源配置,Nacos使用占位符${}进行参数配置,Nacos配置MySQL持久化保存配置信息
将 Spring Boot 应用程序连接到 Google Cloud 中的 MySQL 数据库
无法通过 spring.cloud.config.enabled:false 禁用 Spring Cloud Config