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

分布式链路追踪_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)

相关推荐
王道长服务器 | 亚马逊云3 天前
一个迁移案例:从传统 IDC 到 AWS 的真实对比
java·spring boot·git·云计算·github·dubbo·aws
妄小闲6 天前
百度竞价推广:搜索竞价信息流推广代运营
dubbo
Sam-August7 天前
【分布式架构实战】Spring Cloud 与 Dubbo 深度对比:从架构到实战,谁才是微服务的王者?
java·spring cloud·dubbo
syty20207 天前
K8s是什么
容器·kubernetes·dubbo
程序员小潘7 天前
Dubbo3序列化安全机制导致的一次生产故障
dubbo
LuiChun8 天前
docker desktop更新到【4.45.0 】后,旧容器镜像都丢失了
docker·容器·dubbo
程序员小潘11 天前
Dubbo3.3 Triple协议处理东西向流量
dubbo
敲上瘾11 天前
Docker 容器核心指令与数据库容器化实践
linux·运维·服务器·docker·容器·eureka·dubbo
YF云飞12 天前
Dubbo分布式服务框架全解析
java·dubbo
XT462513 天前
SkyWalking 支持的告警通知方式(Alarm Hooks)类型
skywalking