使用 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.propertiesbuild.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

spring cloud集成nacos

无法使用 spring cloud gcp starter 将 Spring Boot 与 Cloud SQL 连接