分布式链路追踪_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_consumer/skywalking-agent.jar -jar skywalking_dubbo_consumer.jar &
10、调用接口,接口地址为: http://虚拟机IP地址:8085/hello
http://172.29.35.23:8085/hello
此时如果页面显示:hello skywalking ,那么 dubbo 的调用就成功了。
11、可以打开 skywalking 查看 dubbo 调用的监控情况。
http://172.29.35.23:9010/
二、分布式链路追踪_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)