🚀 作者 :“二当家-小D”
🚀 博主简介:⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人,8年开发架构经验,精通java,擅长分布式高并发架构,自动化压力测试,微服务容器化k8s等
🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬
🍅文末获取源码联系 配套笔记打包🍅
🔗往期文章传送门:
快速入门SpringCloudAlibaba实战篇【SpringBoot3.x + JDK17】!
高并发解决方案:Sentinel的流量控制、熔断与OpenFeign整合实战 !
构建微服务网关:SpringCloud Gateway快速入门!
AlibabaCloud微服务下的链路追踪系统实战详解!新一代分布式链路追踪skywalking实战(上)
目录
- 一、 Springboot整合分布式链路追踪SkyWalking
- 1. 链路追踪-Springboot项目环境搭建
- 2. SpringBoot+MybaitsPlus+Mysql开发测试接口
- 3. 分布式链路追踪的卧底 Skywalking Agent 探针介绍
- 4. IDEA编辑器配置Skywalking-Agent链路采集实战
- 二、分布式链路追踪SkyWalking进阶实战
- 1. 自定义SkyWalking链路追踪配置实战
- 2. SkyWalking-RocketBot性能剖析讲解
- 3. SkyWalking链路追踪-日志和RPC上报实战
- 4. 源码部署 Apache SkyWalking实战
- 5. SkyWalking链路追踪-告警模块和WebHook通知《上》
- 6. SkyWalking链路追踪-告警模块和WebHook通知《下》
- 7. Jar包和微服务方式打包运行整合Skywalking实战
一、 Springboot整合分布式链路追踪SkyWalking
1. 链路追踪-Springboot项目环境搭建
简介:链路追踪-框架Springboot项目搭建
- Springboot介绍
- GitHub地址:https://github.com/spring-projects/spring-boot
- 官方文档:https://spring.io/guides/gs/spring-boot/
- 视频地址:https://item.taobao.com/item.htm?id=618384570391
- 在线创建:https://start.spring.io/
- 相关的软件环境
- jdk11+maven3.5+ Mysql8.0
- 编辑器IDEA
- 创建一个Springboot项目
- 创建数据库导入数据 (自己安装Mysql8)
- 库名xdclass_sky_shop
CREATE TABLE `product` (`id` bigint NOT NULL,`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品标题',`detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '详情',`img` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '图片',`amount` decimal(16,0) DEFAULT NULL COMMENT '现价',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;INSERT INTO `xdclass_sky_shop`.`product` (`id`, `title`, `detail`, `img`, `amount`) VALUES (1, '商用短链平台-海量数据项目大课', '打造最佳简历项目的,短链平台大课项目', 'https://file.xdclass.net/video/2022/71-HLSJCL/05.jpeg', 66);INSERT INTO `xdclass_sky_shop`.`product` (`id`, `title`, `detail`, `img`, `amount`) VALUES (2, '新一代AlibabaCloud全家桶实战', '高并发分布式项目', 'https://file.xdclass.net/video/2022/71-HLSJCL/05.jpeg', 88);INSERT INTO `xdclass_sky_shop`.`product` (`id`, `title`, `detail`, `img`, `amount`) VALUES (3, '小滴课堂永久会员', '观看全部IT专题视频,永久有效', 'https://file.xdclass.net/video/2022/banner/03.jpeg', 999);INSERT INTO `xdclass_sky_shop`.`product` (`id`, `title`, `detail`, `img`, `amount`) VALUES (4, '架构大课训练营', '全方位提升综合能力,存储、网络、架构、解决方案', 'https://file.xdclass.net/video/2022/72-ShardingJDBC/banner.jpeg', 79);
2. SpringBoot+MybaitsPlus+Mysql开发测试接口
简介:SpringBoot+MybaitsPlus+Mysql开发测试接口
- 添加依赖配置
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency>
- 添加配置
server.port=8081
#==============================数据库相关配置========================================
spring.datasource.driver-class-name =com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://112.74.107.230:3307/xdclass_sky_shop?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username =root
spring.datasource.password =xdclass.net168#配置mybatis plus打印sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
- 开发接口
- 商品列表接口
- 商品详情接口
- 代码
@SpringBootApplication
@MapperScan("net.xdclass.xdclassskydemo.mapper")
public class XdclassSkyDemoApplication {public static void main(String[] args) {SpringApplication.run(XdclassSkyDemoApplication.class, args);}}@RestController
@RequestMapping("/api/product/v1")
public class ProductController {@Autowiredprivate ProductService productService;/*** 查看商品列表接口** @return*/@GetMapping("list")public JsonData list() {List<ProductDO> list = productService.list();return JsonData.buildSuccess(list);}/*** 查看商品详情** @param productId* @return*/@GetMapping("/detail/{product_id}")public JsonData detail(@PathVariable("product_id") long productId) {ProductDO productDO = productService.findDetailById(productId);return JsonData.buildSuccess(productDO);}
}@Service
public class ProductOrderServiceImpl implements ProductService {@Autowiredprivate ProductMapper productMapper;@Overridepublic List<ProductDO> list() {return productMapper.selectList(new QueryWrapper<>());}@Overridepublic ProductDO findDetailById(long productId) {return productMapper.selectOne(new QueryWrapper<ProductDO>().eq("id", productId));}
}public interface ProductMapper extends BaseMapper<ProductDO> {}@TableName("product")
public class ProductDO {private Long id;/*** 商品标题*/private String title;/*** 详情*/private String detail;/*** 图片*/private String img;/*** 现价*/private BigDecimal amount;// set、get方法
}
3. 分布式链路追踪的卧底 Skywalking Agent 探针介绍
简介:分布式链路追踪的卧底 Skywalking Agent 探针介绍
- 什么SkyWalking探针
- 探针表示集成到目标系统中的代理或 SDK 库,即收集并格式化数据, 并发送到后端 包括链路追踪和性能指标
- Skywalking-Agent的安装和使用
- 下载skywalking
- 地址:https://skywalking.apache.org/downloads/
- 下载skywalking
-
skywalking-agen目录文件的介绍
- logs:skywalking agent的相关运行日志
- bootstrap-plugins:插件包
- optional-plugins:插件包(可供选择的插件包,如果需要生效则需要拷贝到plugins包下)
- plugins:插件包(生效的插件包,支持多个框架链路追踪)
- optional-reporter-plugins:插件包
- activations:插件包
- config: 配置文件
- skywalking-agent.jar:agent代理的jar包(主要是这个!)
-
skywalking-agent的使用方式
- 优先级:探针-> JVM配置-> 环境变量配置 -> agent.config(优先级低)
- 第一种-javaagent:/path/to/skywalking-agent.jar={config1}={value1},{config2}={value2}
-javaagent:../skywalking-agent.jar=agent.service_name=XdclassApp,collector.backend_service=127.0.0.1:11800
- 第二种:-Dskywalking.[option1]=[value2]
-javaagent: ../skywalking-agent.jar -Dskywalking.agent.service_name=XdclassApp -Dskywalking.collector.backend_service=127.0.0.1:11800
- agent.service_name:客户端服务名,在apm系统中显示的服务名称
- collector.backend_service:SW上传的服务地址
4. IDEA编辑器配置Skywalking-Agent链路采集实战
简介:IDEA编辑器配置Skywalking-Agent链路采集实战
-
IDEA编辑器里面配置Skywalking-Agent
- agent.service_name:客户端服务名,在apm系统中显示的服务名称
- collector.backend_service:SW上传的服务地址
-javaagent:/Users/xdclass/Desktop/agent/skywalking-agent.jar -Dskywalking.agent.service_name=XdclassShop -Dskywalking.collector.backend_service=120.79.150.146:11800
-
请求接口(多几次)
- 商品列表接口
- 商品详情接口
-
查看RocketBot界面数据
- 注意:如果没数据,分析数据链路,端口、程序日志分析
二、分布式链路追踪SkyWalking进阶实战
1. 自定义SkyWalking链路追踪配置实战
简介:自定义 SkyWalking链路追踪配置实战
-
什么是TraceId
- 用来标识一条请求链路,一条请求链路中包含一个Trace ID,多个Span ID
-
背景
- 对业务代码进行链路追踪,方便排查问题
- 比如,某个接口请求耗时慢,想对业务接口方法进行追踪
- controller->service 方法,记录业务方法加入到链路中,记录入参、返回值等
-
编码
- 添加依赖
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.5.0</version> </dependency>
- 业务方法添加注解
@Trace
- 记录入参和返回值
- POJO记得重写toString方法
@Tags({@Tag(key = "方法名-input", value = "arg[0]"), @Tag(key = "方法名-output", value = "returnedObj")} )
-
缺点
- 代码有侵入性
2. SkyWalking-RocketBot性能剖析讲解
简介:SkyWalking-RocketBot性能剖析讲解
- 性能剖析
- 新建任务:新建需要分析的端点
- 左侧列表:对任务进行采样
- 右侧:每个端点的链路信息
- 性能分析:可以查看对应方法的调用栈,找出问题点
- 直接定位到代码方法和代码行
- 注意:一个服务在监控持续时间内只能设置一个端点监控任务
3. SkyWalking链路追踪-日志和RPC上报实战
简介: SkyWalking链路追踪-日志和RPC上报实战
-
背景
-
用户请求接口,怎么在我们日志中找到traceId来跟踪系统调用链路
-
需要在系统日志打印出traceId
-
注意(重要)
- 由于阿里云选择的的服务器和带宽不高,安装了多个组件 oap、ui、es7等
- 所以测试的时候有时数据有延迟、或者服务器压力过高,有时数据出不来,刷新页面几次才出来数据
- 如果本地有docker环境和机器配置高,也可以本地进行安装skywalking相关组件
- 后续也有源码安装
-
-
实战
- 添加依赖
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.5.0</version> </dependency>
- 配置logback打印日志(SpringBoot默认使用Logback),配置文件名 logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 控制台输出 --><appender name="console" 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>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><!--系统操作日志--><root level="INFO"> <appender-ref ref="console"/> </root> </configuration>
- 代码打印日志
import org.slf4j.Logger; import org.slf4j.LoggerFactory;Logger logger = LoggerFactory.getLogger(ProductController.class);//代码中 logger.info 打印日志
- 将日志上传到skywalking oap中,查看更方便
<!-- skywalking grpc 日志收集上报服务端 8.4.0版本后支持 --> <appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><!--系统操作日志--><root level="INFO"> <appender-ref ref="console"/> <appender-ref ref="grpc-log"/></root>
-
注意
- skywaling agent 默认是上传到本地的oap,如果oap server地址不是本地,则需要单独配置oap server地址
- agent文件夹里面config配置
#日志数据的grpc服务器的主机 plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:120.79.150.146} #日志数据的grpc服务器的端口 plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800} #日志数据的最大大小 plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760} #发送数据时将超时多长时间。单位是秒 plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}#下面是正式:不加中文注释plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:120.79.150.146} plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800} plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760} plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}
4. 源码部署 Apache SkyWalking实战
简介: 本地源码部署 Apache SkyWalking实战
-
基础环境(win和linux都在支持,但是推荐Linux系统进行操作,win存在坑)
-
安装jdk8或者jdk11(资料包里有)
-
SkyWalking源码(资料里有)
-
实战是Mac苹果系统,底层和Linux CentOS是一样,常规操作命令一致
-
注意:SkyWalking的路径里面不要有中文,最好空格也不要有,导致启动失败
-
-
config配置文件 application.yml
- 存储
- H2(默认)
- ElasticSearch 6, 7
- MySQL
- TiDB
- InfluxDB
- 存储
-
本地部署SkyWalking
- 方式一命令
bin/startup.sh
- 方式二:分别依次启动
#端口 11800 bin/oapService.sh#端口8080 bin/webappService.sh
- 查看日志
#oap日志 skywalking-oap-server.log #ui界面日志 webapp.log
-
如果本地部署,则访问
- localhost:8080
5. SkyWalking链路追踪-告警模块和WebHook通知《上》
简介: SkyWalking链路追踪-告警模块和WebHook《上》
- 需求
- 监控业务相关接口性能,超过阈值则触发告警功能
- 通过调用webhook接口进行触发,具体的webhook接口地址可以自行定义路径
- 注意:要OAP Server的网络可以触发的webhook接口
- 开发人员可以在webhook接口中编写告警方式,比如邮件、短信等,就是一个http接口
-
Apache Skywalking默认的告警规则配置
-
安装目录下的config文件夹下 alarm-settings.yml文件
-
默认内置多个规则
- 最近3分钟内服务的平均响应时间超过1秒
- 最近2分钟服务成功率低于80%
- 最近3分钟90%服务响应时间超过1秒
- 最近2分钟内服务实例的平均响应时间超过1秒
-
配置讲解
- metrics-name 脚本中的度量名称
- threshold 阈值
- op 比较操作符,可以设定>,<,=
- period 多久检查一次当前的指标数据是否符合告警规则,单位分钟
- count 达到多少次后,触发告警消息
- silence-period 在多久时间之内,忽略相同的告警消息,在时间T触发了某告警,那么在(T+10)这个时间段,不会再次触发相同告警
- message 告警消息内容
- webhooks 配置告警产生时的触发的调用地址
-
6. SkyWalking链路追踪-告警模块和WebHook通知《下》
简介: SkyWalking链路追踪-告警模块和WebHook《下》
-
编码实战
//实体类 public class AlarmMessage {private int scopeId;private String scope;private String name;private String id0;private String id1;private String ruleName;private String alarmMessage;private long startTime;private transient int period;private transient boolean onlyAsCondition;//set get方法 }@RestController public class CallbackController {private List<AlarmMessage> messageList = new ArrayList<>();@PostMapping("/webhook")public void webhook(@RequestBody List<AlarmMessage> alarmMessageList){System.out.println("收到消息:" +alarmMessageList);messageList = alarmMessageList;}@GetMapping("/show")public List<AlarmMessage> show(){return messageList;} }
-
配置webhook接口,POST方式推送
- 注意:要重启oap server!!!
webhooks:- http://127.0.0.1:8081/webhook/
-
测试请求路径
- 修改睡眠时间为2秒,模拟接口响应慢
-
结果
[AlarmMessage{scopeId=2, scope='SERVICE_INSTANCE', name='abecc615d94a48bea4bf95b3c510d398@192.168.0.107 of XdclassShop', id0='WGRjbGFzc1Nob3A=.1_YWJlY2M2MTVkOTRhNDhiZWE0YmY5NWIzYzUxMGQzOThAMTkyLjE2OC4wLjEwNw==', id1='', ruleName='service_instance_resp_time_rule', alarmMessage='Response time of service instance abecc615d94a48bea4bf95b3c510d398@192.168.0.107 of XdclassShop is more than 1000ms in 2 minutes of last 10 minutes', startTime=1652693421403, period=0, onlyAsCondition=false}]
7. Jar包和微服务方式打包运行整合Skywalking实战
简介: 微服务和Jar方式打包运行整合Skywalking实战
-
项目打包
-
springboot项目和springcloud项目都一样,jar方式运行
-
通过java -jar 加入参数
-
项目打包
mvn install
-
-
例子
java -jar -javaagent:/Users/xdclass/Desktop/agent/skywalking-agent.jar -Dskywalking.agent.service_name=XdclassShop -Dskywalking.collector.backend_service=127.0.0.1:11800 xdclass-sky-0.0.1-SNAPSHOT.jar
今天的文章就分享到这了,希望对你有帮助,关注D哥,下期分享更多干货内容!
资料获取📚
完整代码和笔记已经准备好,如果有问题,可以在评论区留言讨论💬
原创不易,别忘了点赞👍+收藏⭐哦!
点击下方链接即可获取完整资料压缩包🎁,快来领取吧!↓↓↓↓