SkyWalking--整合dubbo--使用/教程/实例

亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述SkyWalking--整合dubbo--使用/教程/实例相关的知识,希望能为你提供帮助。


?
简介说明
        本文用实例来展示使用SkyWalking追踪dubbo调用。
        SkyWalking是一款最强的链路追踪工具,比CAT、Zipkin、Pinpoint都要强。具体对比可以见这篇文章:??链路追踪---选型对比_IT利刃出鞘的博客-CSDN博客??。
在使用SkyWalking之前,排查问题会碰到如下痛点:

  1. 想优化请求响应时间,但不知道哪个地方是最耗时的地方。
  1. 可以自己打印相应日志,统计时间。但是,这样的代码不能放到生产中的,而且,如果没有一个前端界面看到整个链路的时间,排查起来依然很费时费力
  1. 服务器打印很多日志,很难分清哪个是自己想要的日志。
  2. 根据日志找到代码位置比较费力气。
  1. 因为需要拿日志到代码中去搜,如果日志没有很强的标志性,定位位置很麻烦。
  1. 服务器线程请求很多,不知道哪些日志是同一个请求的。
用了SkyWalking,以上问题全都是小菜一碟????。
本文的意图 
本文将展示Skywalking与dubbo整合,达到如下目标:
  1. 在网页端看到整个执行的链路(执行流程、服务节点名、执行时间等)
  2. 在日志里可以看到traceId。
  1. 这样可以分辨哪些日志是同一个请求的。
  1. 代码中手动获取traceId并传递给前端。
  1. 这样可以通过traceId到SkyWalking的网页端搜索
本项目概述业务场景
        本项目以比较典型的电商的下订单为例。流程如下:
  1. 用户请求创建订单接口
  2. 将订单并写入数据库(order服务调用自己本地的service)
  3. 减去相应商品的库存(order服务通过dubbo调用storage服务)
  4. 减去相应用户的余额(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
实际项目可以改进的地方 
  1. 使用ES存SkyWalking的数据
  1. 本文为了简单,SkyWalking的数据存储用的是默认的H2,它是存储在内存中的,不用任何配置。
  2. SkyWalking支持Elasticsearch、mysql、H2、TiDB。默认是H2,是存到内存。实际项目里边我们一般将其存到ES。
  3. 可以写一个清除ES数据的程序,只保留最近几天的请求数据。
  1. 加入告警功能
  1. 可以监控:平均响应时间、请求成功率 等
  2. 支持微信、钉钉、自定义 等通知方式
公共代码表结构及数据
【SkyWalking--整合dubbo--使用/教程/实例】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
< ?xml version="1.0" encoding="UTF-8"?>
< 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="https://www.songbingjia.com/android/[%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

    推荐阅读