第十九章 微服务监控与运维体系:构建可观测的Java微服务

一、章节学习目标与重点
1.1 学习目标
- 理解微服务可观测性的核心概念(监控、日志、链路追踪)及价值,掌握微服务运维的核心痛点与解决方案。
- 熟练使用Prometheus + Grafana实现微服务指标监控,包括系统指标、业务指标的采集、可视化与告警。
- 掌握ELK(Elasticsearch + Logstash + Kibana)日志收集与分析体系,实现分布式日志的集中管理与故障排查。
- 运用SkyWalking实现微服务链路追踪,定位跨服务调用的性能瓶颈与异常问题。
- 能够独立搭建完整的微服务运维体系,结合实际场景制定监控告警策略与故障排查流程。
1.2 学习重点
- 可观测性三大支柱(监控、日志、链路追踪)的协同工作原理。
- Prometheus指标采集、PromQL查询与Grafana仪表盘定制。
- ELK日志收集流程与Kibana日志检索、可视化实战。
- SkyWalking链路追踪的核心概念与分布式调用链分析。
- 微服务运维实战:告警配置、故障排查、性能优化案例。
二、微服务可观测性核心概念与体系设计
2.1 为什么需要可观测性?
💡 微服务架构下,系统被拆分为多个独立服务,部署在多台服务器或容器中,相比单体应用,运维复杂度呈指数级提升:
- 服务间依赖关系复杂,一个请求可能跨越多个服务(如用户下单→订单服务→商品服务→支付服务→物流服务),某个环节故障会导致整个流程失败。
- 分布式部署导致问题定位困难,传统单体应用的日志查看、断点调试方式失效。
- 流量波动频繁,需实时监控系统负载、响应时间等指标,提前预警潜在风险。
可观测性(Observability) 正是为解决这些问题而生,核心是通过收集系统的“信号”(指标、日志、链路),让系统的运行状态“可见”,从而快速定位问题、优化性能、保障系统稳定。
可观测性的三大支柱:
2.2 微服务可观测性体系架构
一个完整的微服务可观测性体系需覆盖“数据采集→数据存储→数据分析→可视化→告警”全流程,架构如下:
┌─────────────────────────────────────────────────────────────────┐
│ 微服务集群(user-service/order-service/product-service等) │
└─┬───────────────┬───────────────┬───────────────┬───────────────┘
│ │ │ │
┌─▼───────┐ ┌───▼───────┐ ┌───▼───────┐ ┌───▼───────┐
│指标采集 │ │日志采集 │ │链路采集 │ │健康检查 │
│(Prometheus)│ │(Filebeat)│ │(SkyWalking)│ │(Actuator)│
└─┬───────┘ └───┬───────┘ └───┬───────┘ └───┬───────┘
│ │ │ │
┌─▼───────────────▼───────────────▼───────────────▼───────┐
│ 数据存储层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Prometheus │ │Elasticsearch│ │ SkyWalking │ │
│ │(指标存储) │ │(日志存储) │ │(链路存储) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─┬───────────────┬───────────────┬───────────────┬─────────┘
│ │ │ │
┌─▼───────┐ ┌───▼───────┐ ┌───▼───────┐ ┌───▼───────┐
│Grafana │ │ Kibana │ │SkyWalking UI│ │ 告警系统 │
│(指标可视化)│ │(日志分析)│ │(链路分析)│ │(Email/钉钉)│
└─────────┘ └───────────┘ └───────────┘ └───────────┘
核心组件说明
| Prometheus | 指标采集、存储与查询 | 时序数据库优化、PromQL查询灵活、原生支持告警 |
| Grafana | 指标可视化与仪表盘定制 | 支持多数据源、图表类型丰富、配置简单 |
| Filebeat | 日志采集与转发 | 轻量级、低资源消耗、支持日志结构化 |
| Elasticsearch | 日志存储与检索 | 全文检索高效、支持海量日志存储 |
| Kibana | 日志可视化与分析 | 检索功能强大、支持日志聚合分析 |
| SkyWalking | 链路追踪、服务依赖分析 | 无侵入式采集、支持多语言、性能损耗低 |
| Spring Boot Actuator | 微服务健康检查与指标暴露 | 与Spring Boot无缝整合、配置简单 |
2.3 技术选型对比与推荐
2.3.1 监控工具对比
| Prometheus | 微服务指标监控、时序数据存储 | 开源免费、查询灵活、告警能力强 | 不适合存储非时序数据、长期存储需结合Thanos |
| Zabbix | 服务器、硬件监控 | 成熟稳定、支持多设备监控 | 微服务指标采集能力弱、定制化成本高 |
| InfluxDB | 时序数据存储与监控 | 写入性能高、支持高并发 | 生态不如Prometheus完善 |
💡 推荐:Prometheus + Grafana(微服务监控首选,生态完善、与Spring Cloud无缝整合)。
2.3.2 日志工具对比
| ELK(Elasticsearch+Logstash+Kibana) | 海量日志收集、全文检索 | 功能强大、检索高效、可视化丰富 | Logstash资源消耗高、部署复杂 |
| EFK(Elasticsearch+Filebeat+Kibana) | 海量日志收集、轻量级部署 | Filebeat替代Logstash,资源消耗低 | 日志处理能力弱于Logstash |
| Loki(Prometheus生态) | 日志与指标协同监控 | 存储成本低、与Grafana无缝整合 | 全文检索能力弱于Elasticsearch |
💡 推荐:EFK(Elasticsearch + Filebeat + Kibana)(轻量级、高性能,满足大多数微服务日志需求)。
2.3.3 链路追踪工具对比
| SkyWalking | 微服务链路追踪、服务依赖分析 | 无侵入式、性能损耗低、支持多语言 | 生态不如Jaeger完善 |
| Jaeger | 分布式链路追踪(OpenTelemetry兼容) | 开源免费、与Kubernetes整合好 | 对Java微服务的适配不如SkyWalking |
| Zipkin | 简单链路追踪 | 部署简单、学习成本低 | 功能较基础、不支持复杂链路分析 |
💡 推荐:SkyWalking(Java微服务首选,无侵入式采集、支持服务依赖图、性能指标与链路结合紧密)。
三、监控体系实战:Prometheus + Grafana
3.1 核心概念与环境准备
3.1.1 Prometheus核心概念
- 指标(Metric):监控的核心数据,由名称和标签组成(如http_requests_total{method="GET",status="200"}),支持4种类型:
- Counter(计数器):只增不减(如请求总数、错误总数)。
- Gauge(仪表盘):可增可减(如CPU使用率、内存使用率、当前在线人数)。
- Histogram(直方图):统计数值分布(如响应时间分布)。
- Summary(摘要):统计数值的分位数(如P95、P99响应时间)。
- 采集目标(Target):被监控的对象(如微服务实例、服务器)。
- 任务(Job):一组相同类型的Target(如所有user-service实例)。
- PromQL:Prometheus的查询语言,用于从时序数据库中检索指标数据。
3.1.2 环境准备
- 开发语言:Java 11
- 微服务框架:Spring Boot 2.7.x、Spring Cloud Alibaba 2021.0.4.0
- 监控工具:Prometheus 2.45.0、Grafana 10.2.0
- 依赖组件:Spring Boot Actuator、Micrometer Registry Prometheus(指标暴露组件)
3.2 微服务指标暴露(Actuator + Micrometer)
Spring Boot Actuator提供了微服务的健康检查、指标暴露功能,Micrometer则将Actuator的指标转换为Prometheus可识别的格式。
3.2.1 引入依赖(以user-service为例)
<!– Spring Boot Actuator:健康检查与指标暴露 –>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!– Micrometer:适配Prometheus –>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
3.2.2 配置application.yml
management:
endpoints:
web:
exposure:
include: health,info,prometheus # 暴露的端点(prometheus为指标端点)
base-path: /actuator # 端点基础路径(默认/actuator)
endpoint:
health:
show-details: always # 健康检查显示详细信息
metrics:
tags:
application: ${spring.application.name} # 为指标添加应用名称标签(便于区分不同服务)
export:
prometheus:
enabled: true # 启用Prometheus指标导出
# 自定义业务指标(可选)
business:
metrics:
order-count: 0
3.2.3 暴露自定义业务指标
除了Actuator默认提供的JVM、HTTP指标外,实际开发中需监控业务指标(如订单创建数、支付成功率),可通过Micrometer自定义:
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class BusinessMetrics {
// 订单创建计数器(Counter类型,只增不减)
private final Counter orderCreateCounter;
// 注入MeterRegistry,用于注册自定义指标
@Autowired
public BusinessMetrics(MeterRegistry meterRegistry) {
this.orderCreateCounter = Counter.builder("business.order.create.count")
.description("订单创建总数")
.tag("service", "order-service") // 标签:服务名称
.register(meterRegistry);
}
// 订单创建成功时调用(计数+1)
public void incrementOrderCreateCount() {
orderCreateCounter.increment();
}
}
在OrderController中使用:
@RestController
public class OrderController {
@Autowired
private BusinessMetrics businessMetrics;
@GetMapping("/order/{userId}")
public Order createOrder(@PathVariable Long userId) {
// 订单创建逻辑(略)
// 业务指标计数+1
businessMetrics.incrementOrderCreateCount();
return order;
}
}
3.2.4 验证指标暴露
启动user-service,访问http://localhost:8081/actuator/prometheus,可看到指标数据(如JVM内存使用、HTTP请求数、自定义业务指标):
# HELP http_server_requests_seconds HTTP server request duration
# TYPE http_server_requests_seconds summary
http_server_requests_seconds_count{application="user-service",exception="None",method="GET",outcome="SUCCESS",status="200",uri="/user/{id}",} 10.0
http_server_requests_seconds_sum{application="user-service",exception="None",method="GET",outcome="SUCCESS",status="200",uri="/user/{id}",} 0.567
# HELP business_order_create_count订单创建总数
# TYPE business_order_create_count counter
business_order_create_count{service="order-service",} 5.0
3.3 Prometheus部署与配置
3.3.1 安装Prometheus
① 从Prometheus官网下载Prometheus(推荐2.45.0版本)。 ② 解压后修改配置文件prometheus.yml:
global:
scrape_interval: 15s # 全局采集间隔(默认15秒)
evaluation_interval: 15s # 规则评估间隔(默认15秒)
# 告警规则配置(后续讲解)
alerting:
alertmanagers:
– static_configs:
– targets:
# – alertmanager:9093
# 监控任务配置
scrape_configs:
# 任务1:监控Prometheus自身
– job_name: 'prometheus'
static_configs:
– targets: ['localhost:9090']
# 任务2:监控user-service
– job_name: 'user-service'
metrics_path: '/actuator/prometheus' # 指标端点路径
static_configs:
– targets: ['127.0.0.1:8081'] # user-service实例地址(多实例用逗号分隔)
# 任务3:监控order-service
– job_name: 'order-service'
metrics_path: '/actuator/prometheus'
static_configs:
– targets: ['127.0.0.1:8082']
# 任务4:监控product-service
– job_name: 'product-service'
metrics_path: '/actuator/prometheus'
static_configs:
– targets: ['127.0.0.1:8083']
③ 启动Prometheus:
- Windows:双击prometheus.exe。
- Linux/Mac:执行./prometheus –config.file=prometheus.yml。 ④ 访问http://localhost:9090,进入Prometheus控制台。
3.3.2 Prometheus指标查询(PromQL)
在Prometheus控制台的“Graph”页面,可通过PromQL查询指标,常用查询示例:
| 查询user-service的HTTP请求总数 | http_server_requests_seconds_count{application="user-service"} |
| 查询user-service的GET请求错误率 | sum(http_server_requests_seconds_count{application="user-service",status=~"5.."} / sum(http_server_requests_seconds_count{application="user-service"})) * 100 |
| 查询order-service的订单创建总数 | business_order_create_count{service="order-service"} |
| 查询所有服务的JVM堆内存使用量 | jvm_memory_used_bytes{area="heap",application=~".+"} |
| 查询user-service的P95响应时间 | http_server_requests_seconds{application="user-service",quantile="0.95"} |
3.4 Grafana可视化与告警配置
Prometheus的可视化能力较弱,Grafana可通过连接Prometheus数据源,生成美观、定制化的仪表盘,并支持告警功能。
3.4.1 安装与配置Grafana
① 从Grafana官网下载Grafana(推荐10.2.0版本)。 ② 启动Grafana:
- Windows:双击grafana-server.exe。
- Linux/Mac:执行./grafana-server(默认端口3000)。 ③ 访问http://localhost:3000,默认用户名/密码:admin/admin(首次登录需修改密码)。
3.4.2 添加Prometheus数据源
① 点击左侧“Configuration”→“Data Sources”→“Add data source”。 ② 选择“Prometheus”,配置数据源信息:
- Name:Prometheus(自定义名称)。
- URL:http://localhost:9090(Prometheus地址)。
- 其他默认,点击“Save & test”,提示“Data source is working”则配置成功。
3.4.3 导入微服务监控仪表盘
Grafana官网提供了大量现成的仪表盘模板(Dashboards),可直接导入使用:
① 搜索Spring Boot微服务相关模板,推荐模板ID:
- 12900(Spring Boot 2.7+监控,包含JVM、HTTP、业务指标)。
- 6756(微服务集群监控)。 ② 点击左侧“Dashboards”→“Import”,输入模板ID,点击“Load”。 ③ 选择数据源为之前配置的Prometheus,点击“Import”,即可看到完整的微服务监控仪表盘。
3.4.4 定制业务指标仪表盘
除了导入模板,还可自定义仪表盘展示业务指标(如订单创建数、支付成功率):
① 点击左侧“Dashboards”→“New dashboard”→“Add visualization”。 ② 选择Prometheus数据源,输入PromQL查询语句(如business_order_create_count{service="order-service"})。 ③ 配置图表类型(如折线图、柱状图)、标题、坐标轴等,点击“Apply”。 ④ 重复步骤②-③,添加多个业务指标图表,最终形成业务监控仪表盘。
3.4.5 配置告警规则
当指标超过阈值时(如错误率>5%、响应时间>1秒),Grafana需及时发送告警通知(邮件、钉钉、短信等):
① 配置告警通道:
- 点击左侧“Alerting”→“Contact points”→“Add contact point”。
- 选择告警类型(如Email),配置SMTP信息(邮箱服务器、账号、密码),点击“Test”测试是否能正常发送邮件。
② 配置告警规则:
- 打开自定义的仪表盘,编辑某个图表(如响应时间图表),点击“Alert”→“Create alert rule”。
- 配置告警条件:
- Condition:avg() of query(A, 5m) > 1(5分钟内平均响应时间超过1秒)。
- For:2m(持续2分钟触发告警)。
- 选择告警通道(如之前配置的Email),设置告警标题和内容,点击“Save”。
③ 测试告警:
- 故意让微服务响应缓慢(如添加Thread.sleep(2000)),等待2分钟后,即可收到告警邮件。
四、日志体系实战:ELK/EFK
4.1 核心概念与环境准备
4.1.1 EFK核心组件
- Filebeat:轻量级日志采集工具,部署在微服务所在服务器,实时采集日志文件并转发到Elasticsearch。
- Elasticsearch:分布式搜索引擎,用于存储和检索日志数据,支持全文检索和聚合分析。
- Kibana:日志可视化与分析平台,提供日志检索、过滤、图表展示等功能。
4.1.2 环境准备
- Elasticsearch 7.17.0(注意:Elasticsearch与Kibana版本需一致)。
- Kibana 7.17.0。
- Filebeat 7.17.0。
- 微服务日志框架:SLF4J + Logback(默认集成)。
4.2 微服务日志配置(Logback)
首先需规范微服务的日志输出格式(结构化日志),便于Elasticsearch检索。
4.2.1 配置Logback日志文件
在user-service的src/main/resources目录下创建logback-spring.xml:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!– 日志输出格式(JSON格式,便于结构化解析) –>
<property name="LOG_PATTERN" value='{"timestamp":"%d{yyyy-MM-dd HH:mm:ss.SSS}","level":"%p","thread":"%t","logger":"%logger{50}","message":"%msg","service":"${spring.application.name}","traceId":"%X{traceId:-}","exception":"%ex{full}"}'/>
<!– 日志存储路径 –>
<property name="LOG_PATH" value="logs/${spring.application.name}"/>
<!– 控制台输出 –>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${LOG_PATTERN}</pattern>
</layout>
<charset>UTF-8</charset>
</encoder>
</appender>
<!– 文件输出(按天滚动) –>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/app-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory> <!– 保留7天日志 –>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${LOG_PATTERN}</pattern>
</layout>
<charset>UTF-8</charset>
</encoder>
</appender>
<!– 根日志级别 –>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<!– 业务日志级别(可单独配置) –>
<logger name="com.example.order.service" level="DEBUG"/>
</configuration>
4.2.2 日志中添加链路追踪ID(TraceID)
为了将日志与链路追踪关联,需在日志中添加TraceID(每个请求的唯一标识),可通过SkyWalking或Spring Cloud Sleuth实现(此处以SkyWalking为例,后续链路追踪章节详细讲解)。
4.3 Elasticsearch部署
① 从Elasticsearch官网下载Elasticsearch 7.17.0。 ② 解压后修改config/elasticsearch.yml:
cluster.name: elasticsearch–cluster # 集群名称
node.name: node–1 # 节点名称
network.host: 0.0.0.0 # 绑定所有IP(允许外部访问)
http.port: 9200 # HTTP端口
discovery.seed_hosts: ["127.0.0.1"] # 种子节点
cluster.initial_master_nodes: ["node-1"] # 初始主节点
xpack.security.enabled: false # 关闭安全认证(开发环境)
③ 启动Elasticsearch:
- Windows:双击bin/elasticsearch.bat。
- Linux/Mac:执行bin/elasticsearch。 ④ 访问http://localhost:9200,返回如下结果则启动成功:
{
"name" : "node-1",
"cluster_name" : "elasticsearch-cluster",
"cluster_uuid" : "xxx",
"version" : {
"number" : "7.17.0",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "xxx",
"build_date" : "2022-01-28T08:36:04.875279988Z",
"build_snapshot" : false,
"lucene_version" : "8.11.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
4.4 Filebeat部署与配置
Filebeat负责采集微服务的日志文件,并转发到Elasticsearch。
① 从Filebeat官网下载Filebeat 7.17.0。 ② 解压后修改filebeat.yml:
filebeat.inputs:
– type: filestream
enabled: true
paths:
# 微服务日志文件路径(多个服务用逗号分隔,或新增inputs)
– D:\\projects\\user–service\\logs\\user–service\\app–*.log
– D:\\projects\\order–service\\logs\\order–service\\app–*.log
– D:\\projects\\product–service\\logs\\product–service\\app–*.log
fields:
service: ${spring.application.name} # 自定义字段(服务名称)
# 输出到Elasticsearch
output.elasticsearch:
hosts: ["localhost:9200"] # Elasticsearch地址
index: "micro-service-logs-%{+yyyy.MM.dd}" # 日志索引名称(按天分割)
# 关闭Elasticsearch索引自动创建(可选)
setup.ilm.enabled: false
setup.template.enabled: false
# Kibana配置(用于自动创建索引模式)
setup.kibana:
host: "localhost:5601"
③ 启动Filebeat:
- Windows:执行filebeat.exe -e -c filebeat.yml。
- Linux/Mac:执行./filebeat -e -c filebeat.yml。
4.5 Kibana日志分析实战
4.5.1 Kibana部署与配置
① 从Kibana官网下载Kibana 7.17.0。 ② 解压后修改config/kibana.yml:
server.port: 5601 # Kibana端口
server.host: "0.0.0.0" # 允许外部访问
elasticsearch.hosts: ["http://localhost:9200"] # Elasticsearch地址
i18n.locale: "zh-CN" # 中文界面
③ 启动Kibana:
- Windows:双击bin/kibana.bat。
- Linux/Mac:执行bin/kibana。 ④ 访问http://localhost:5601,进入Kibana控制台。
4.5.2 创建索引模式
Kibana需通过索引模式关联Elasticsearch中的日志索引: ① 点击左侧“Management”→“Stack Management”→“Index Patterns”→“Create index pattern”。 ② 输入索引名称模式(如micro-service-logs-*),点击“Next step”。 ③ 选择时间字段(如timestamp),点击“Create index pattern”。
4.5.3 日志检索与分析
① 点击左侧“Discover”,选择创建的索引模式,即可看到所有微服务的日志。 ② 常用检索功能:
- 全文检索:在搜索框输入关键词(如“订单创建失败”),检索包含该关键词的日志。
- 字段过滤:点击左侧字段列表(如service、level),筛选特定服务(如service:order-service)或特定日志级别(如level:ERROR)的日志。
- 时间范围筛选:选择时间范围(如最近1小时、最近24小时),查看该时间段内的日志。
- 高亮显示:检索结果中关键词会高亮显示,便于快速定位。
③ 日志聚合分析:
- 点击左侧“Visualize Library”→“Create visualization”,选择图表类型(如柱状图、饼图)。
- 配置聚合条件:如按service字段分组,统计各服务的ERROR日志数量,生成日志错误分布图表。
4.5.4 故障排查示例
假设用户反馈“下单失败”,通过Kibana排查步骤:
五、链路追踪实战:SkyWalking
5.1 核心概念与环境准备
5.1.1 SkyWalking核心概念
- Trace(追踪):单个请求在分布式系统中的完整流转路径,由多个Span组成。
- Span(跨度):Trace的基本单位,代表一次服务调用或一个本地方法执行,包含开始时间、结束时间、耗时、标签等信息。
- Segment(片段):一个微服务实例产生的Span集合,对应一个Trace的部分链路。
- 服务依赖图:展示微服务之间的调用关系(如order-service调用user-service和product-service)。
- TraceID:Trace的唯一标识,用于关联同一请求的所有日志和Span。
5.1.2 环境准备
- SkyWalking OAP Server 8.16.0(链路数据存储与分析)。
- SkyWalking UI 8.16.0(链路可视化界面)。
- SkyWalking Agent 8.16.0(微服务链路采集代理,无侵入式)。
- 微服务框架:Spring Boot 2.7.x、Spring Cloud Alibaba 2021.0.4.0。
5.2 SkyWalking Server部署
① 从SkyWalking官网下载SkyWalking 8.16.0(选择“Binary Distribution”)。 ② 解压后修改config/application.yml(默认使用H2内存数据库,开发环境无需修改):
storage:
selector: ${SW_STORAGE:h2} # 存储类型(h2/elasticsearch/mysql等)
h2:
driver: org.h2.jdbcx.JdbcDataSource
url: jdbc:h2:mem:skywalking–oap–db;DB_CLOSE_DELAY=–1
user: sa
metadataQueryMaxSize: 5000
③ 启动SkyWalking Server:
- Windows:双击bin/startup.bat。
- Linux/Mac:执行bin/startup.sh。 ④ 访问http://localhost:8080,进入SkyWalking UI(默认用户名/密码:admin/admin)。
5.3 微服务集成SkyWalking Agent
SkyWalking Agent采用无侵入式采集,通过Java Agent技术在微服务启动时挂载,无需修改代码。
5.3.1 配置SkyWalking Agent
① 解压SkyWalking安装包中的agent目录(如apache-skywalking-apm-bin/agent),复制到微服务项目目录下(或任意目录)。 ② 修改Agent配置文件agent/config/agent.config:
# 应用名称(与微服务名称一致)
agent.service_name=${SW_AGENT_NAME:user-service}
# SkyWalking Server地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}
# 日志级别
logging.level=INFO
5.3.2 启动微服务时挂载Agent
通过JVM参数-javaagent挂载Agent,以IDEA为例: ① 打开微服务的启动配置(Edit Configurations)。 ② 在“VM options”中添加:
-javaagent:D:\\projects\\agent\\skywalking-agent.jar -DSW_AGENT_NAME=user-service -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
- 其中D:\\projects\\agent\\skywalking-agent.jar为Agent的绝对路径。
- SW_AGENT_NAME为微服务名称(需与其他服务区分)。 ③ 依次启动user-service、order-service、product-service(每个服务需单独配置Agent,修改SW_AGENT_NAME)。
5.4 链路追踪实战与分析
5.4.1 触发分布式调用
访问http://localhost:8082/order/1(order-service调用user-service和product-service),触发分布式调用。
5.4.2 查看链路追踪数据
① 进入SkyWalking UI,点击左侧“Trace”→“Trace List”,可看到所有Trace记录。 ② 点击某个Trace的“Trace ID”,进入链路详情页面,可查看:
- 整个请求的流转路径(order-service→user-service→product-service)。
- 每个Span的耗时(如order-service调用user-service耗时50ms,调用product-service耗时80ms)。
- 每个Span的详细信息(请求参数、响应结果、异常信息等)。
5.4.3 服务依赖图分析
点击左侧“Topology”→“Global”,可查看微服务之间的依赖关系图,直观展示服务调用链路(如order-service依赖user-service和product-service,product-service无下游依赖)。
5.4.4 性能瓶颈定位示例
假设用户反馈“下单接口响应缓慢”,通过SkyWalking排查步骤:
5.4.5 业务指标与链路结合
SkyWalking还支持将业务指标与链路关联,例如在链路中添加业务标签(如订单ID、用户ID),便于定位特定业务的链路问题:
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.apache.skywalking.apm.toolkit.trace.Tag;
import org.apache.skywalking.apm.toolkit.trace.Tags;
@RestController
public class OrderController {
@GetMapping("/order/{userId}")
@Tags({
@Tag(key = "userId", value = "${userId}"),
@Tag(key = "productId", value = "1")
})
public Order createOrder(@PathVariable Long userId) {
// 订单创建逻辑(略)
// 获取当前TraceID,添加到日志(已通过Logback配置自动实现)
String traceId = TraceContext.traceId();
System.out.println("TraceID: " + traceId);
return order;
}
}
重启微服务后,再次触发调用,在SkyWalking UI的Trace详情中可看到自定义标签(userId、productId),便于筛选特定用户或商品的链路。
六、微服务运维实战:告警、故障排查与性能优化
6.1 告警体系建设
一个完善的告警体系需覆盖“指标告警、日志告警、链路告警”,确保问题早发现、早处理。
6.1.1 告警触发条件设计
| 系统指标 | CPU使用率 | 持续5分钟>80% | 警告 |
| 系统指标 | 内存使用率 | 持续5分钟>85% | 警告 |
| 系统指标 | 磁盘使用率 | 持续10分钟>90% | 严重 |
| 应用指标 | HTTP错误率(5xx) | 持续2分钟>5% | 严重 |
| 应用指标 | 平均响应时间 | 持续2分钟>1秒 | 警告 |
| 应用指标 | 服务不可用(健康检查失败) | 持续1分钟 | 严重 |
| 链路指标 | 链路错误率 | 持续2分钟>5% | 严重 |
| 链路指标 | 链路平均耗时 | 持续2分钟>2秒 | 警告 |
| 日志指标 | ERROR日志数 | 持续1分钟>10条 | 警告 |
6.1.2 告警通知渠道选择
| 警告 | 钉钉群、企业微信群 | 批量通知,便于团队知晓 |
| 严重 | 短信、电话、邮件+钉钉群 | 紧急通知,确保负责人及时处理 |
6.2 故障排查流程
微服务故障排查需结合监控、日志、链路三大支柱,遵循“先定位范围,再细化排查”的原则,流程如下:
- 通过SkyWalking UI查看该时间段内的服务健康状态,判断是单个服务故障还是多个服务故障。
- 通过服务依赖图,判断故障是否由下游服务引发(如order-service故障可能是product-service不可用导致)。
- 通过Grafana查看故障服务的错误率、响应时间、QPS等指标,确认是否存在性能瓶颈或流量突增。
- 通过Kibana检索故障服务的ERROR日志,查看错误堆栈和详细信息。
- 若涉及分布式调用,通过TraceID检索完整日志链路,定位问题环节。
- 通过SkyWalking查看故障时间段的Trace记录,分析哪个Span耗时过长或出现异常。
- 根据排查结果修复问题(如修复代码bug、优化SQL、扩容服务器)。
- 重新测试,通过监控、日志、链路确认问题是否解决。
6.3 性能优化案例
6.3.1 案例1:数据库慢查询导致接口响应缓慢
现象:order-service的下单接口响应时间超过2秒,SkyWalking显示product-service的/product/stock/deduct接口耗时1.8秒。 排查:
6.3.2 案例2:服务未做限流导致雪崩
现象:促销活动期间,user-service的QPS突增到5000,导致服务崩溃,依赖user-service的order-service和product-service也随之不可用。 排查:
6.3.3 案例3:分布式调用超时导致重试风暴
现象:order-service调用product-service时频繁超时,导致大量重试,进而引发线程池耗尽。 排查:
feign:
client:
config:
default:
connect-timeout: 3000 # 连接超时3秒
read-timeout: 5000 # 读取超时5秒
retry:
enabled: true
max-attempts: 1 # 重试1次(默认3次)
七、本章总结
✅ 本章详细讲解了微服务可观测性体系的三大支柱(监控、日志、链路追踪),通过Prometheus + Grafana实现指标监控与可视化,ELK/EFK实现日志集中管理与分析,SkyWalking实现分布式链路追踪,最终结合实战案例讲解了告警配置、故障排查与性能优化。
通过本章学习,读者应掌握:
微服务运维的核心是“可观测性”,只有让系统的运行状态“可见、可测、可追溯”,才能保障系统稳定运行。下一章将讲解微服务的容器化与云原生部署(Docker + Kubernetes),帮助读者构建完整的微服务部署体系。
网硕互联帮助中心






评论前必须登录!
注册