安装skywalking并集成到微服务项目

文章目录

一、前言

本片文章主要讲解skywalking的安装教程 ,及其在微服务架构 中的链路追踪功能。

本文中的演示项目运行环境如下:

  • springcloud:2020.0.6
  • springboot:2.5.14
  • jdk:1.8
  • skywalking:9.4.0
  • os:windows

skywalking的介绍分多篇文章:

二、介绍

skywalking是一个开源的应用性能管理系统可观测性分析平台 。用于收集分析聚合可视化 来自服务和云原生基础设施的数据。SkyWalking提供了一种简单的方法来保持我们的分布式系统的清晰视图,甚至跨云。这是一个现代的APM(应用性能管理和监控技术),专门为云本地的、基于容器的分布式系统而设计。

SkyWalking在许多不同的场景中为观察监控 分布式系统提供了解决方案。首先,与传统方法一样,SkyWalking为服务提供了自动仪器代理,如Java、C#、Node.js、Go、PHP和Nginx LUA。

SkyWalking为服务服务实例端点流程提供了可观察性。

  • 服务 :代表为传入请求提供相同行为的一组工作负载。使用仪器代理或SDK时,可以定义服务名
  • 服务实例服务组 中的每个工作负载称为一个实例。像Kubernetes中的pods一样,它不需要是单个操作系统进程,但是,如果您使用的是工具代理,实例实际上是一个真正的操作系统进程
  • 端点 :服务中用于传入请求的路径,例如HTTP URI路径gRPC服务类+方法签名
  • 流程:操作系统进程。在某些场景中,一个服务实例不是一个流程,比如一个pod Kubernetes可以包含多个流程。

1. 架构

SkyWalking在逻辑上分为四个部分:Probe(探针)backend(平台后端)storage(存储)UI

  • Probe(探针) :探针收集遥测数据,包括各种格式的度量轨迹日志事件
  • backend(平台后端) :支持数据聚合分析流式处理 ,包括跟踪 、指标、日志 和事件。充当聚合者 角色、接收者角色或两者兼而有之。
  • storage(存储):通过开放/可插拔的接口存储数据。你可以选择一个现有的实现,比如ElasticSearch、H2、MySQL、TiDB、BanyanDB。
  • UI :一个高度可定制的基于web的界面,允许skywalk终端用户可视化管理skywalk数据

三、安装skywalking服务端

进入skywalking下载页面,按照以下截图进行不同版本的下载

下载成功后进行解压,解压后如下所示

重点关注以下文件夹

  • bin:包括用于后端服务前端UI 的启动shell脚本cmd脚本
  • config:后端服务的配置文件 ,主要关注application.ymllog4j.xmlalarm-settings.yml
  • oap-libs:后端服务所需要的所有依赖
  • webapp:前端应用 以及配置文件

四、启动skywalking服务端

进入bin文件夹,双击webappService.bat启动skywalking服务的后端与前端

启动成功后如下所示

既然服务启动成功,我们下一步就是通过浏览器打开skywalking的可视化界面了。

首先需要查看前端服务运行的端口 ,进入webapp文件夹,查看前端配置文件application.yml,发现前端服务的运行端口号是通过变量SW_SERVER_PORT设置的,其默认端口号为8081

在浏览器输入localhost:8081,进入控制台页面

五、微服务项目开发

本项目仅用于演示skywalking的集成过程,项目结构如下图所示

  • skywalking-eureka-server:eureka服务注册中心
  • skywalking-gateway:网关
  • skywalking-goods:商品服务
  • skywalking-order:订单服务
  • skywalking-payment:支付服务

项目架构图如下所示

注册中心

本项目的注册中心仅用于服务注册,其配置文件如下所示

启动注册中心后,在浏览器打开注册中心页面,输入localhost:8080/eureka

从注册中心中可以看出,我们启动的实例如下

  • eureka注册中心:只有一个实例,端口号为8080,为单机模式
  • 网关:只有一个实例,端口号为8090,为单机模式
  • 商品服务:两个实例,端口号分别为8011和8012,为集群模式
  • 订单服务:两个实例,端口号分别为8021和8022,为集群模式
  • 支付服务:两个实例,端口号分别为8031和8032,为集群模式

网关服务

本项目的注册中心仅用于转发请求,其配置文件如下所示

该配置中的三个路由分别用于转发请求到商品服务、订单服务和支付服务。

商品服务

商品服务中定义的接口如下:

当用户调用该接口时,打印日志进行记录,然后通过feign接口调用订单服务的创建订单接口,最后返回结果,

订单服务

订单服务中定义了一个由商品服务调用的接口如下:

该接口由商品服务调用,其返回值0代表成功1代表失败 。当传入的商品id为2的倍数时,则订单创建失败 ,否则通过feign接口调用支付服务的支付接口,最后返回结果。

支付服务

支付服务中定义了一个由订单服务调用的接口如下:

该接口由订单服务调用,其返回值0代表成功1代表失败 。当传入的商品id为3的倍数时,则支付失败,否则返回成功的结果。

测试

当我们调用商品服务的接口并传入商品id为1

得到的结果为0,即成功

查看日志如下:

从日志中可以看出,此次请求的调用链如下所示

当我们调用商品服务的接口并传入商品id为2

得到的结果为1,即失败

查看日志如下:

从日志中可以看出,此次请求的调用链如下所示

当我们调用商品服务的接口并传入商品id为3

得到的结果为1,即失败

查看日志如下:

从日志中可以看出,此次请求的调用链如下所示

六、下载java客户端

skywalking使用java agent将客户端植入到微服务中,当项目启动时,会自动与skywalking服务端建立连接。

下面我们进入官网下载页面

下载成功后进行解压,解压后如下所示

重点关注以下文件

  • config:客户端的配置
  • logs:日志
  • skywalking-agent.jar:skywalking的客户端

七、微服务集成skywalking客户端

skywalking要求我们通过-javaagent将skywalking客户端集成到微服务中,现在我们对上面演示项目的各个服务进行集成

1. idea启动

使用idea启动项目的情况下,我们进入项目的启动配置(Run/Debug Configuration)中

以端口号为8011的商品服务为例,添加以下JVM启动参数

properties 复制代码
# skywalking客户端路径
-javaagent:E:\skywalking\skywalking-agent\skywalking-agent.jar
# 服务名称
-Dskywalking.agent.service_name=skywalking-goods

如下图所示

2. 命令行启动

同样以端口号为8011的商品服务为例,当我们使用命令行启动微服务的jar包时,只需要将上面的两个参数放在-jar参数的前面即可,如下所示

shell 复制代码
java \
-javaagent:/data/skywalking/skywalking-agent.jar \
-Dskywalking.agent.service_name=skywalking-goods \
-jar \
skywalking-goods.jar

3. 集成效果

启动参数添加完成后,重启项目,然后进入skywalking服务端的控制台页面

不难发现,我们已经把项目中的eureka服务端网关商品服务订单服务支付服务 集成到skywalking了。

该页面中包含四个标签页:ServiceTopologyTraceLog

  • Service:微服务列表 。类比eureka服务端的服务列表。

    在该列表中,发现其表格中包含了以下几列

    • Service Groups:服务分组

      当我们启动服务时,在JVM启动参数 中为其添加了skywalking的服务名称 -Dskywalking.agent.service_name=skywalking-goods,如果需要为该服务指定分组,则需要以 分组名::服务名 配置服务名称。

      例如我们需要将商品服务的分组设置为sw-business,则将该参数修改为-Dskywalking.agent.service_name=sw-business::skywalking-goods

    • Service Names:服务名称。

    • Load(calls/min):平均每分钟调用次数

    • Success Rate(%):调用成功率

    • Latency(ms):延迟

    • apdex:应用性能指数

  • Topology:服务拓扑图

  • Trace:服务调用链路

  • Log:服务调用日志

4. 服务实例

点击服务名,可查看该服务详情 ,其中包含该服务的实例列表

  • 查看eureka服务实例

    通过以下截图看到eureka服务的实例数为1个 ,其实例名称为skywalking自动生成的,其规则为UUID + @ + IP

  • 查看网关服务实例

    通过以下截图看到网关服务的实例数为1个 ,其实例名称为skywalking自动生成的,其规则为UUID + @ + IP

  • 查看商品服务实例

    通过以下截图看到商品服务的实例数为2个 ,其实例名称为skywalking自动生成的,其规则为UUID + @ + IP

  • 查看订单服务实例

    通过以下截图看到订单服务的实例数为2个 ,其实例名称为skywalking自动生成的,其规则为UUID + @ + IP

  • 查看支付服务实例

    通过以下截图看到支付服务的实例数为2个 ,其实例名称为skywalking自动生成的,其规则为UUID + @ + IP

5. 修改服务实例名称

由于skywalking生成的实例名称有默认规则,我们可以对其进行修改,以增加各个服务实例的辨识度。

在项目的JVM启动参数 中添加配置:-Dskywalking.agent.instance_name=实例名称。以商品服务为例

  • 端口号为8011的商品服务

  • 端口号为8012的商品服务

重新启动商品服务的两个实例,可以看到对应的实例名称已被修改,且可以发现实例名称支持中文

八、skywalking客户端配置

skywalking客户端提供了多种配置方式:配置文件jvm启动参数-javaagent选项操作系统环境变量

1. 配置文件

在skywalking客户端的配置文件config/agent.config中,包含了大量客户端配置,如下截图所示。

服务名的配置 为例,配置项为agent.service_name,对应的值将从系统环境变量 中获取SW_AGENT_NAME变量的值作为服务名,冒号:后面为默认配置,即如果系统环境变量中不存在该配置,则取默认值

2. jvm启动参数

使用 skywalking. + 配置项 实现对配置文件中对应配置项的覆盖 ,因此优先级更高

  • 为什么要给配置项添加前缀skywalking.

    前缀可以避免冲突

例如:配置命名空间

sh 复制代码
-Dskywalking.agent.namespace=my_namespace

3. javaagent选项

格式:

多个配置项之间以逗号","分隔

sh 复制代码
-javaagent:/path/to/skywalking-agent.jar=[option1]=[value1],[option2]=[value2]

例如配置服务名命名空间

sh 复制代码
-javaagent:/path/to/skywalking-agent.jar=agent.service_name=my_service_name,agent.namespace=my_namespace

如果配置项或配置值中包含特殊符号,则应当使用单引号''将其包含

sh 复制代码
-javaagent:/path/to/skywalking-agent.jar=agent.service_name=my_service_name,agent.ignore_suffix='.jpg,.jpeg'

4. 操作系统环境变量

服务名的配置 为例,配置项为agent.service_name,对应的值将从系统环境变量 中获取SW_AGENT_NAME变量的值作为服务名,冒号:后面为默认配置,即如果系统环境变量中不存在该配置,则取默认值。

以上就是skywalking的安装、以及如何与微服务项目进行集成的过程。

纸上得来终觉浅,绝知此事要躬行。

------------------------我是万万岁,我们下期再见------------------------

相关推荐
DokiDoki之父8 分钟前
多线程—飞机大战排行榜功能(2.0版本)
android·java·开发语言
高山上有一只小老虎13 分钟前
走方格的方案数
java·算法
whatever who cares14 分钟前
Java 中表示数据集的常用集合类
java·开发语言
JavaArchJourney1 小时前
TreeMap 源码分析
java
whitepure1 小时前
万字详解Java中的IO及序列化
java·后端
还梦呦1 小时前
2025年09月计算机二级Java选择题每日一练——第一期
java·开发语言
与火星的孩子对话1 小时前
Unity高级开发:反射原理深入解析与实践指南 C#
java·unity·c#·游戏引擎·lucene·反射
花开富贵ii2 小时前
代码随想录算法训练营四十六天|图论part04
java·数据结构·算法·图论
Miraitowa_cheems2 小时前
LeetCode算法日记 - Day 15: 和为 K 的子数组、和可被 K 整除的子数组
java·数据结构·算法·leetcode·职场和发展·哈希算法
答题卡上的情书2 小时前
java第一个接口
java·开发语言