# 分布式链路追踪_skywalking_学习(2)

发布于:2024-05-22 ⋅ 阅读:(65) ⋅ 点赞:(0)

分布式链路追踪_skywalking_学习(2)

一、分布式链路追踪_skywalking :Rpc 调用监控

1、Skywalking(6.5.0) 支持的 Rpc 框架有以下几种:

  • Dubbo 2.5.4 -> 2.6.0
  • Dubbox 2.8.4
  • Apache Dubbo 2.7.0
  • Motan 0.2.x -> 1.1.0
  • gRPC 1.x
  • Apache ServiceComb Java Chassis 0.1 -> 0.5,1.0.x
  • SOFARPC 5.4.0

2、使用 Spring Boot 和 Dubbo 搭建一个简单的服务提供方和服务消费方来测试 Skywalking 对于 Rpc 调用的支持。新建两个工程(skywalking_dubbo_consumer 和skywalking_dubbo_provider),并打包 skywalking_dubbo_consumer.jar 和skywalking_dubbo_provider.jar 来进行测试。

2.1 打开 idea,创建 服务消费方 skywalking_dubbo_consumer 的 maven 工程。
	--> idea --> File 
	--> New --> Project 
	--> Maven 
		Project SDK: ( 1.8(java version "1.8.0_131" ) 
	--> Next 
	--> Groupld : ( djh.it )
		Artifactld : ( skywalking_dubbo_consumer )
		Version : 1.0-SNAPSHOT
	--> Name: ( skywalking_dubbo_consumer )
		Location: ( \skywalking_dubbo_consumer\ )	
	--> Finish
	
2.2 在工程 skywalking_dubbo_consumer (模块)中的 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>djh.it</groupId>
    <artifactId>skywalking_dubbo_consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>skywalking_dubbo_consumer</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.3 在工程 skywalking_dubbo_consumer (模块)中,创建配置文件 application.properties。
## 2024-5-21 创建配置文件 application.properties

spring.application.name=skywalking_dubbo_consumer
server.port=8085
2.4 在工程 skywalking_dubbo_consumer (模块)中,创建 接口类 IHelloService.java。
/**
*  2024-5-21 创建 接口类 IHelloService.java
*
*  简化项目的开发,将 IHelloService接口在消费方和提供方都编写一份
*/
package djh.it.api;

public interface IHelloService {
    public String hello();
}

2.5 在工程 skywalking_dubbo_consumer (模块)中,创建 启动类 SkywalkingDubboConsumerApplication.java。
/**
*  2024-5-21 创建 启动类 SkywalkingDubboConsumerApplication.java
*/
package djh.it.skywalking_dubbo_consumer;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubboConfiguration  //添加dubbo生效注解
public class SkywalkingDubboConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SkywalkingDubboConsumerApplication.class, args);
    }
}

2.6 在工程 skywalking_dubbo_consumer (模块)中,创建 Controller 类 TestController.java 进行测试。
/**
*  2024-5-21 创建 Controller 类 TestController.java
*/
package djh.it.skywalking_dubbo_consumer.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import djh.it.api.IHelloService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
	//采用直连而非从注册中心获取服务地址的方式,在 @Reference 注解 中声明
    @Reference(url = "dubbo://127.0.0.1:20880")
    private IHelloService helloService;

    @GetMapping("/hello")
    public String hello(){
        return helloService.hello();
    }
}

3、创建 服务提供方 skywalking_dubbo_provider 的 maven 工程

3.1 打开 idea,创建 artifactId 名为 skywalking_dubbo_provider 的 maven 工程。
	--> idea --> File 
	--> New --> Project 
	--> Maven 
		Project SDK: ( 1.8(java version "1.8.0_131" ) 
	--> Next 
	--> Groupld : ( djh.it )
		Artifactld : ( skywalking_dubbo_provider )
		Version : 1.0-SNAPSHOT
	--> Name: ( skywalking_dubbo_provider )
		Location: ( \skywalking_dubbo_provider\ )	
	--> Finish
	
3.2 在工程 skywalking_dubbo_provider (模块)中的 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>djh.it</groupId>
    <artifactId>skywalking_dubbo_provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>skywalking_dubbo_provider</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--添加springboot和dubbo集成配置-->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.3 在工程 skywalking_dubbo_provider (模块)中,创建配置文件 application.properties。
## 2024-5-21 创建配置文件 application.properties

## 为了简化环境搭建,采用了本地直接调用的方式,所以将注册中心写成 N/A 表示不注册到注册中
心。

spring.application.name=skywalking_dubbo_provider
spring.dubbo.server=true
spring.dubbo.registry=N/A
server.port=8086
3.4 在工程 skywalking_dubbo_provider (模块)中,创建 接口类 IHelloService.java。
/**
*  2024-5-21 创建 接口类 IHelloService.java
*
*  简化项目的开发,将 IHelloService接口在消费方和提供方都编写一份
*/
package djh.it.api;

public interface IHelloService {
    public String hello();
}

3.5 在工程 skywalking_dubbo_provider (模块)中,创建 启动类 SkywalkingDubboProviderApplication.java。
/**
*  2024-5-21 创建 启动类 SkywalkingDubboProviderApplication.java
*/
package djh.it.skywalking_dubbo_provider;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubboConfiguration  //添加dubbo生效注解
public class SkywalkingDubboProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(SkywalkingDubboProviderApplication.class, args);
    }
}

3.6 在工程 skywalking_dubbo_provider (模块)中,创建 接口实现 类 HelloServiceImpl.java。
/**
*  2024-5-21 创建 接口实现 类 HelloServiceImpl.java
*/
package djh.it.skywalking_dubbo_provider.service;

import com.alibaba.dubbo.config.annotation.Service;
import djh.it.api.IHelloService;
import org.springframework.stereotype.Component;

@Service(interfaceClass = IHelloService.class)
@Component
public class HelloServiceImpl implements IHelloService {
    @Override
    public String hello() {
        return "hello skywalking";
    }
}

4、打包 skywalking_dubbo_consumer.jar 和 skywalking_dubbo_provider.jar 上传

至 /usr/local/skywalking 目录下。

5、复制两份 agent,防止使用的冲突。

cd /usr/local/skywalking/apache-skywalking-apm-bin/
cp -r agent agent_dubbo_provider
cp -r agent agent_dubbo_consumer

6、修改 agent_dubbo_provider 配置中的应用名为:

vi agent_dubbo_provider/config/agent.config

# The service name in UI
agent.service_name=${SW_AGENT_NAME:dubbo_provider}

7、接着修改 agent_dubbo_consumer:修改应用名:

vi agent_dubbo_consumer/config/agent.config

# The service name in UI
agent.service_name=${SW_AGENT_NAME:dubbo_consumer}

8、先启动 provider,等待启动成功。

# 切换到目录下
cd /usr/local/skywalking

# 启动 provider
java -javaagent:/usr/local/skywalking/apache-skywalking-apm-
bin/agent_dubbo_provider/skywalking-agent.jar  -jar
skywalking_dubbo_provider.jar &

9、启动 consumer,等待启动成功。

# 切换到目录下
cd /usr/local/skywalking

# 启动 consumer
java -javaagent:/usr/local/skywalking/apache-skywalking-apm-
bin/agent_dubbo_sonsumer/skywalking-agent.jar  -jar
skywalking_dubbo_consumer.jar &

10、调用接口,接口地址为: http://虚拟机IP地址:8085/hello

此时如果页面显示:hello skywalking ,那么 dubbo 的调用就成功了。

11、可以打开 skywalking 查看 dubbo 调用的监控情况。

在这里插入图片描述

在这里插入图片描述

二、分布式链路追踪_skywalking : Mysql 调用监控

1、使用 docker 启动 Mysql – 安装 docker

引言:

Docker 是一种流行的容器化平台,用于在不同的环境中快速部署和运行应用程序。
它提供了一种轻量级和便捷的方式来封装、分发和管理应用程序及其依赖项。
所以使用 docker 启动 Mysql 比较简单便捷。

1.1 安装 docker:更新软件包索引:
sudo apt-get update
1.2 安装 docker:允许 APT 使用 HTTPS:
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
1.3 安装 docker:添加 Docker 官方 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
1.4 安装 docker:添加 Docker 的稳定版本仓库:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
1.5 安装 docker:再次更新软件包索引:
sudo apt-get update
1.6 安装 docker:安装 Docker Community Edition(CE)(社区版):
sudo apt-get install docker-ce
1.7 安装 docker:验证 Docker 是否安装成功并运行(检查 Docker 服务的状态):
sudo systemctl status docker
sudo docker info

如果显示 active (running) 则表示 Docker 服务已成功启动。

1.8 安装 docker:或者验证安装(检查 Docker 版本),或者简单地运行:
# 检查 Docker 版本
sudo docker --version 
sudo docker -V 

# 简单地运行拉取镜像
sudo docker run hello-world

如果安装成功,你将看到 Docker 拉取 hello-world 镜像并运行容器的信息。

1.9 安装 docker:查看 docker 本地镜像,或拉取 mysql:
# 查看 docker 本地镜像
sudo docker images

# 拉取 mysql
docker pull mysql

2、安装 mysql 或 运行 MySQL 容器

docker run --name mysql-server -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest

# 例如:
docker run -di --name=skywalking_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7

参数说明:

–name :给你的容器设定了一个名字 mysql-server。
-e :MYSQL_ROOT_PASSWORD=my-secret-pw 设置了root用户的密码。
-d :表示以后台模式运行容器。
-di :后端守护式启动。
mysql:latest 指定了要运行的 MySQL 镜像版本。
33306:3306 :将 33306 端口映射到 3306 端口。
MYSQL_ROOT_PASSWORD :设置 root 用户初始化密码为 123456。

3、使用工具(SQLyong)连接 mysql,端口为 33306 密码为 123456。

在这里插入图片描述

4、创建数据库:

数据库名称:skywalking 
基字符集:utf8
数据库排序规则:utf8_unicode_ci

5、执行建表语句:

CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

6、向数据库中插入数据。

insert  into `t_user`(`name`) values ('张三'),('李四'),('王五');

7、创建一个 Spring Boot 工程 skywalking_mysql,集成 Spring Data JDBC。

7.1 打开 idea,创建 skywalking_mysql 的 maven 工程。
	--> idea --> File 
	--> New --> Project 
	--> Maven 
		Project SDK: ( 1.8(java version "1.8.0_131" ) 
	--> Next 
	--> Groupld : ( djh.it )
		Artifactld : ( skywalking_mysql )
		Version : 1.0-SNAPSHOT
	--> Name: ( skywalking_mysql )
		Location: ( \skywalking_mysql\ )	
	--> Finish
	
7.2 在工程 skywalking_mysql (模块)中的 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>djh.it</groupId>
    <artifactId>skywalking_mysql</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>skywalking_mysql</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>


7.3 在工程 skywalking_mysql (模块)中,创建配置文件 application.properties。
## 2024-5-21 创建配置文件 application.properties

spring.datasource.url=jdbc:mysql://localhost:33306/skywalking
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
server.port=8087
7.4 在工程 skywalking_mysql (模块)中,创建 pojo 类 User.java。
/**
*  2024-5-21 创建 创建 pojo 类 User.java
*/
package djh.it.skywalking_mysql.pojo;

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;

@Table("t_user")
public class User {
    @Id
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

7.5 在工程 skywalking_mysql (模块)中,创建 dao 持久层 接口类 UserRepository。
/**
*  2024-5-21 创建 dao 持久层 接口类 UserRepository
*/
package djh.it.skywalking_mysql.dao;

import djh.it.skywalking_mysql.pojo.User;
import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<User, Integer> {
}

7.6 在工程 skywalking_mysql (模块)中,创建 Controller 类 MysqlController.java 进行测试。
/**
*  2024-5-21 创建 Controller 类 MysqlController.java
*/
package djh.it.skywalking_mysql.controller;

import djh.it.skywalking_mysql.dao.UserRepository;
import djh.it.skywalking_mysql.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class MysqlController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/users")
    public List<User> findAll(){
        List<User> result = new ArrayList<>();
        userRepository.findAll().forEach((user) -> {
            result.add(user);
        });

        return result;
    }
}

7.7 在工程 skywalking_mysql (模块)中,创建 启动类 SkywalkingMysqlApplication.java。
/**
*  2024-5-21 创建 启动类 SkywalkingMysqlApplication.java
*/
package djh.it.skywalking_mysql;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SkywalkingMysqlApplication {

    public static void main(String[] args) {
        SpringApplication.run(SkywalkingMysqlApplication.class, args);
    }

}

8、将工程 skywalking_mysql 打包成 skywalking_mysql.jar 并上传至 /usr/local/skywalking 目录下。

9、复制 agent,更名为:agent_mysql,防止使用的冲突。

cd /usr/local/skywalking/apache-skywalking-apm-bin/
cp -r agent agent_mysql

# 修改 agent_mysql 配置中的应用名为:
vi agent_mysql/config/agent.config

# The service name in UI
agent.service_name=${SW_AGENT_NAME:skywalking_mysql}

# 保存并退出编辑器。
:wq!

10、启动 skywalking_mysql 应用,等待启动成功。

#切换到目录下
cd /usr/local/skywalking

#启动spring boot
java -javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent_mysql/skywalking-agent.jar  -jar skywalking_mysql.jar &

11、调用接口,接口地址为: http://虚拟机IP地址:8087/users

12、此时如果页面显示 mysql 中数据。

[{“id”:1,“name”:“张三”},{“id”:2,“name”:“李四”},{“id”:3,“name”:“王五”}]

说明 mysql 的调用就成功了。

13、打开 skywalking 查看 mysql 调用的监控情况。

在这里插入图片描述

上一节关联链接请点击:

# 分布式链路追踪_skywalking_学习(1)