SkyWalking--整合dubbo--使用/教程/实例
Posted IT利刃出鞘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SkyWalking--整合dubbo--使用/教程/实例相关的知识,希望对你有一定的参考价值。
简介
说明
本文用实例来展示使用SkyWalking追踪dubbo调用。
SkyWalking是一款最强的链路追踪工具,比CAT、Zipkin、Pinpoint都要强。具体对比可以见这篇文章:链路追踪---选型对比_IT利刃出鞘的博客-CSDN博客。
在使用SkyWalking之前,排查问题会碰到如下痛点:
- 想优化请求响应时间,但不知道哪个地方是最耗时的地方。
- 可以自己打印相应日志,统计时间。但是,这样的代码不能放到生产中的,而且,如果没有一个前端界面看到整个链路的时间,排查起来依然很费时费力
- 服务器打印很多日志,很难分清哪个是自己想要的日志。
- 根据日志找到代码位置比较费力气。
- 因为需要拿日志到代码中去搜,如果日志没有很强的标志性,定位位置很麻烦。
- 服务器线程请求很多,不知道哪些日志是同一个请求的。
用了SkyWalking,以上问题全都是小菜一碟????。
本文的意图
本文将展示Skywalking与dubbo整合,达到如下目标:
- 在网页端看到整个执行的链路(执行流程、服务节点名、执行时间等)
- 在日志里可以看到traceId。
- 这样可以分辨哪些日志是同一个请求的。
- 代码中手动获取traceId并传递给前端。
- 这样可以通过traceId到SkyWalking的网页端搜索
本项目概述
业务场景
本项目以比较典型的电商的下订单为例。流程如下:
- 用户请求创建订单接口
- 将订单并写入数据库(order服务调用自己本地的service)
- 减去相应商品的库存(order服务通过dubbo调用storage服务)
- 减去相应用户的余额(order服务通过dubbo调用account服务)
项目结构
- account:账户服务。
- common:公共代码。包括:公共配置、全局异常处理、全局响应处理等
- order:订单服务。
- parent:父工程。里边只有pom.xml,用于引入公共的依赖;
- storage:库存服务。(account和order的结构和本服务基本一样)
- storage-api:用于向外部提供dubbo接口。
- storage-service:用于实现dubbo接口;库存的CRUD都在这里。
技术栈版本
本分支:使用skywalking追踪dubbo。
服务的版本
- jdk版本为:1.8.0_201
- 自测:1.8.0_20会导致应用报JVM错误起不来;1.8.0_201及之后的版本没问题
- zookeeper版本为:3.7.0
- skywalking版本为:8.7.0
依赖版本
- spring-boot-starter-parent:2.3.8.RELEASE
- dubbo-spring-boot-starter:2.7.13
- //建议用2.x,本版本为2.x最后一个版本。3.x很多不兼容,例:skywalking-8.7.0追踪会无效
- mybatis-plus-boot-starter:3.4.3.2
- curator-framework:4.2.0 //zookeeper客户端依赖
- curator-x-discovery:4.2.0 //zookeeper客户端服务发现依赖
- apm-toolkit-logback-1.x:8.7.0 //将traceId 记录到logback
- apm-toolkit-trace:8.7.0 //支持在代码中获取skywalking的traceId
实际项目可以改进的地方
- 使用ES存SkyWalking的数据
- 本文为了简单,SkyWalking的数据存储用的是默认的H2,它是存储在内存中的,不用任何配置。
- SkyWalking支持Elasticsearch、mysql、H2、TiDB。默认是H2,是存到内存。实际项目里边我们一般将其存到ES。
- 可以写一个清除ES数据的程序,只保留最近几天的请求数据。
- 加入告警功能
- 可以监控:平均响应时间、请求成功率 等
- 支持微信、钉钉、自定义 等通知方式
公共代码
表结构及数据
business.sql
DROP DATABASE IF EXISTS dubbo;
CREATE DATABASE dubbo DEFAULT CHARACTER SET utf8;
USE dubbo;
DROP TABLE IF EXISTS `t_order`;
DROP TABLE IF EXISTS `t_account`;
DROP TABLE IF EXISTS `t_storage`;
CREATE TABLE `t_order` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`user_id` bigint(11) DEFAULT NULL COMMENT 用户id,
`product_id` bigint(11) DEFAULT NULL COMMENT 产品id,
`count` int(11) DEFAULT NULL COMMENT 数量,
`money` decimal(11,0) DEFAULT NULL COMMENT 金额,
`status` int(1) DEFAULT NULL COMMENT 订单状态:0:创建中;1:已完结,
`create_time` datetime(0) NULL DEFAULT NULL,
`update_time` datetime(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `t_account` (
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT id,
`user_id` bigint(11) DEFAULT NULL COMMENT 用户id,
`total` decimal(10,0) DEFAULT NULL COMMENT 总额度,
`used` decimal(10,0) DEFAULT NULL COMMENT 已用余额,
`residue` decimal(10,0) DEFAULT 0 COMMENT 剩余可用额度,
`create_time` datetime(0) NULL DEFAULT NULL,
`update_time` datetime(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `t_storage` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`product_id` bigint(11) DEFAULT NULL COMMENT 产品id,
`total` int(11) DEFAULT NULL COMMENT 总库存,
`used` int(11) DEFAULT NULL COMMENT 已用库存,
`residue` int(11) DEFAULT NULL COMMENT 剩余库存,
`create_time` datetime(0) NULL DEFAULT NULL,
`update_time` datetime(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `t_account` (`id`, `user_id`, `total`, `used`, `residue`) VALUES (1, 1, 1000, 0, 1000);
INSERT INTO `t_storage` (`id`, `product_id`, `total`, `used`, `residue`) VALUES (1, 1, 100, 0, 100);
公共项目(common)
配置及依赖
application-common.yml
本配置放到common项目的resources目录下,所有项目都引用此公共配置。
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/dubbo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: 222333
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
dubbo:
registry:
protocol: zookeeper #注册中心的协议
address: 127.0.0.1:2181 #注册中心的地址
protocol:
name: dubbo #通信协议。分布式固定是dubbo,不要改
monitor:
protocol: registry #监控中心
logback-spring.xml
<configuration>
<!--<include resource="org/springframework/boot/logging/logback/base.xml"/>-->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!--<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>-->
<!--<include resource="org/springframework/boot/logging/logback/file-appender.xml" />-->
<springProperty scope="context" name="appName" source="spring.application.name"/>
<!--用Spring的默认配置,有颜色,格式很好-->
<property name="spring_pattern"
value="[%tid] $CONSOLE_LOG_PATTERN:-%clr(%d$LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS)faint %clr($LOG_LEVEL_PATTERN:-%5p) %clr($PID:- )magenta %clr(---) faint %clr([%15.15t])faint %clr(%-40.40logger39)cyan %clr(:)faint %m%n$LOG_EXCEPTION_CONVERSION_WORD:-%wEx"
/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>$spring_pattern如何使用 SkyWalking 给 Dubbo 服务做链路追踪?