Учебная комната Cabbage Java охватывает основные знания
Spring Cloud Alibaba Actual Combat (1) Подготовка
Spring Cloud Alibaba Actual Combat (2) Nacos
Spring Cloud Alibaba Actual Combat (3) Sentinel
Весеннее облако Alibaba бой (4) Oauth2
Spring Cloud Alibaba Actual Combat (5) Zuul
Реальные бои Spring Cloud Alibaba (6) Статьи RocketMQ
Spring Cloud Alibaba Actual Combat (7) Seata
Spring Cloud Alibaba Actual Combat (8) SkyWalking
Адрес проекта на GitHub:GitHub.com/D2C-CAI/Хайер…
1. Введение в SkyWalking
Skywalking — это продукт с открытым исходным кодом, представленный в инкубаторе Apache отечественным энтузиастом открытого исходного кода Ву Шэном (бывшим инженером OneAPM, в настоящее время работающим в Huawei). точки. Это система мониторинга производительности приложений, основанная на распределенной трассировке. Кроме того, сообщество также создало организацию под названием OpenTracing, целью которой является продвижение некоторых спецификаций и стандартов для мониторинга цепочки вызовов.
- SkyWalking — это платформа мониторинга с открытым исходным кодом для сбора, анализа, агрегирования и визуализации данных из сервисов и облачной инфраструктуры.
- SkyWalking предоставляет простой способ поддерживать четкое представление о распределенных системах даже в облаках. Это современный APM, разработанный для облачных распределенных систем на основе контейнеров.
- SkyWalking отслеживает приложения по трем параметрам: служба (служба), экземпляр службы (экземпляр) и конечная точка (конечная точка). Не так много, чтобы сказать о службах и экземплярах, конечная точка — это определенный путь или URI в службе.
- SkyWalking позволяет пользователям понимать топологические отношения между службами и конечными точками, просматривать показатели для каждой службы/экземпляра службы/конечной точки и устанавливать правила предупреждений.
Состав SkyWalking
Основными компонентами SkyWalking являются:
- Агент в основном отвечает за сбор различных индикаторов и данных связи из системы и отправку их в службу oap.
- Служба oap получает данные, отправленные агентом, сохраняет их, выполняет анализ и предоставляет функции запросов и сигналов тревоги.
- Хранилище и пользовательский интерфейс отвечают за хранение и просмотр данных.
2. Используйте Docker для быстрой сборки SkyWalking 8.0
- Выберите и создайте каталог на сервере Linux;
mkdir skywalking-docker
- Войдите в каталог skywalking-docker и создайте файл сценария с именем skywalking.yaml со следующим содержимым.:
version: '3'
services:
elasticsearch7:
image: docker.elastic.co/elasticsearch/elasticsearch:7.5.0
container_name: elasticsearch7
restart: always
ports:
- 9023:9200
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- TZ=Asia/Shanghai
ulimits:
memlock:
soft: -1
hard: -1
networks:
- skywalking
volumes:
- elasticsearch7:/usr/share/elasticsearch/data
oap:
image: apache/skywalking-oap-server:8.0.1-es7
container_name: oap
depends_on:
- elasticsearch7
links:
- elasticsearch7
restart: always
ports:
- 9022:11800
- 9021:12800
networks:
- skywalking
volumes:
- ./ext-config:/skywalking/ext-config
ui:
image: apache/skywalking-ui:8.0.1
container_name: ui
depends_on:
- oap
links:
- oap
restart: always
ports:
- 9020:8080
environment:
SW_OAP_ADDRESS: oap:12800
networks:
- skywalking
networks:
skywalking:
driver: bridge
volumes:
elasticsearch7:
driver: local
Уведомление: Если мы хотим перезаписать файл конфигурации в каталоге /skywalking/config в образе oap, мы можем смонтировать каталог /skywalking/ext-config в докере и поместить файл конфигурации в этот каталог.
- Выполните скрипт skywalking.yaml, чтобы запустить контейнер.:
docker-compose -f skywalking.yaml up
- Войдите в консоль для ходьбы по небу и найдите различные панели инструментов, которые, конечно, сначала пусты.:
http://(安装SkyWalking机器的IP):9020
3. Представьте клиент SkyWalking в проекте Spring.
Глобальный журнал отслеживает использование traceId:
- Добавить зависимости файла pom:
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.0.1</version>
</dependency>
- Добавьте файл logback-spring.xml в каталог ресурсов со следующим содержимым.:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="logger.path" value="/mnt/logs"/>
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 输出到控制台 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- ConsoleAppender:把日志输出到控制台 -->
<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.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>
<![CDATA[%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} [%X{tid}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}]]></Pattern>
</layout>
</encoder>
</appender>
<!-- 输出到文件 -->
<!-- 时间滚动输出 level为 DEBUG 日志 -->
<!-- <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logger.path}/log_debug.log</file>
<!–日志文件输出格式–>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!– 设置字符集 –>
</encoder>
<!– 日志记录器的滚动策略,按日期,按大小记录 –>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!– 日志归档 –>
<fileNamePattern>${logger.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!–日志文件保留天数–>
<maxHistory>15</maxHistory>
</rollingPolicy>
<!– 此日志文件只记录debug级别的 –>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender> -->
<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${logger.path}/log_info.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${logger.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 WARN 日志 -->
<!-- <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!– 正在记录的日志文件的路径及文件名 –>
<file>${logger.path}/log_warn.log</file>
<!–日志文件输出格式–>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!– 此处设置字符集 –>
</encoder>
<!– 日志记录器的滚动策略,按日期,按大小记录 –>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logger.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!–日志文件保留天数–>
<maxHistory>15</maxHistory>
</rollingPolicy>
<!– 此日志文件只记录warn级别的 –>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender> -->
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${logger.path}/log_error.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logger.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
不能设置为INHERITED或者同义词NULL。默认是DEBUG
可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="STDOUT"/>
<!--<appender-ref ref="DEBUG_FILE" />-->
<appender-ref ref="INFO_FILE"/>
<!--<appender-ref ref="WARN_FILE" />-->
<appender-ref ref="ERROR_FILE"/>
</root>
</configuration>
Уведомление: Остальные — обычные конфигурации логов, в основном эта часть<appender-ref ref="STDOUT"/>
Конфигурация.
- Войдите на официальный сайт Skywalking, чтобы загрузить SkyWalking APM, в основном для использования агента.:
Адрес загрузки официального сайта Skywalking:skywalking.apache.org/downloads/
- Разархивируйте скачанный пакет apache-skywalking-apm-es7-8.0.1.tar.gz, структура каталогов показана на рисунке:
Нам нужен только каталог агента в нем.Вещи в агенте, вероятно, следующие:
Скопируйте каталог агента в нужный каталог.Через некоторое время вам нужно настроить каталог параметров запуска JVM.Конечно, автор поместил его прямо в проект:
- Добавьте следующие параметры запуска JVM в команду запуска программы idea.:
-javaagent:(agent文件夹所在的目录)\agent\skywalking-agent.jar -Dskywalking.agent.service_name=(服务名)-service -Dskywalking.agent.instance_name=(服务名)-instance -Dskywalking.collector.backend_service=(安装SkyWalking机器的IP):9022
Поскольку переход по небу — это ненавязчивая скрытая точка для отслеживания распределенных ссылок и мониторинга производительности, обычно используется метод javaagent.
Что такое Javaагент(Статический инструмент перед запуском JVM)?
Javaagent является аргументом команды java. Параметр javaagent можно использовать для указания пакета jar, и для пакета java есть два требования:
- В файле MANIFEST.MF этого пакета jar должен быть указан элемент Premain-Class.
- Класс, указанный Premain-Class, должен реализовывать метод premain().
Метод premain() буквально представляет собой класс, который запускается перед функцией main(). Когда запускается виртуальная машина Java, перед выполнением функции main() jvm сначала запускает метод premain() класса Premain в пакете jar, указанном параметром -javaagent.
- Мы построили полный проект в предыдущих статьях.В этих проектах следуйте приведенной выше конфигурации и запустите ее, чтобы увидеть эффект.:
- Сервис шлюза: herring-gateway, микросервис унифицированного шлюза zuul.
- Сервис аутентификации: herring-oauth2, микросервис центра аутентификации oauth2.
- Member service: herring-member-service, один из микросервисов, отправится в центр аутентификации для проверки после получения запроса.
- Сервис заказов: herring-orders-service, второй микросервис, отправится в удостоверяющий центр для проверки после получения запроса.
- Товарный сервис: селедка-товар-сервис, третий микросервис, отправится в удостоверяющий центр на проверку после получения запроса.
- Протестируем, сначала запросим токен, а потом запросим /api/member/update:
####
POST http://localhost:8080/oauth2-service/oauth/token?grant_type=password&username=admin&password=123456&client_id=app-client&client_secret=client-secret-8888&scope=all
Accept: */*
Cache-Control: no-cache
Получите токен результата возврата:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiZ2F0ZXdheS1zZXJ2aWNlIl0sInVzZXJfbmFtZSI6ImFkbWluIiwiand0LWV4dCI6IkpXVCDmianlsZXkv6Hmga8iLCJzY29wZSI6WyJhbGwiXSwiZXhwIjoxNjEzOTcwMDk2LCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6IjU4MDY5ODlhLWUyNDQtNGQyMy04YTU5LTBjODRiYzE0Yjk5OSIsImNsaWVudF9pZCI6ImFwcC1jbGllbnQifQ.EP4acam0tkJQ9kSGRGk_mQsfi1y4M_hhiBL0H931v60",
"token_type": "bearer",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiZ2F0ZXdheS1zZXJ2aWNlIl0sInVzZXJfbmFtZSI6ImFkbWluIiwiand0LWV4dCI6IkpXVCDmianlsZXkv6Hmga8iLCJzY29wZSI6WyJhbGwiXSwiYXRpIjoiNTgwNjk4OWEtZTI0NC00ZDIzLThhNTktMGM4NGJjMTRiOTk5IiwiZXhwIjoxNjE0MDM0ODk2LCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6IjQxZGM1ZDc1LTZmZDgtNDU3My04YmRjLWI4ZTMwNWEzMThmMyIsImNsaWVudF9pZCI6ImFwcC1jbGllbnQifQ.CGmGx_msqJBHxa95bBROY2SAO14RyeRklVPYrRxZ7pQ",
"expires_in": 7199,
"scope": "all",
"jwt-ext": "JWT 扩展信息",
"jti": "5806989a-e244-4d23-8a59-0c84bc14b999"
}
Запрос на выполнение /api/member/update
####
GET http://localhost:8080/member-service/api/member/update
Accept: */*
Cache-Control: no-cache
Authorization: bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiZ2F0ZXdheS1zZXJ2aWNlIl0sInVzZXJfbmFtZSI6ImFkbWluIiwiand0LWV4dCI6IkpXVCDmianlsZXkv6Hmga8iLCJzY29wZSI6WyJhbGwiXSwiZXhwIjoxNjEzOTcwMDk2LCJhdXRob3JpdGllcyI6WyJST0xFX0FETUlOIl0sImp0aSI6IjU4MDY5ODlhLWUyNDQtNGQyMy04YTU5LTBjODRiYzE0Yjk5OSIsImNsaWVudF9pZCI6ImFwcC1jbGllbnQifQ.EP4acam0tkJQ9kSGRGk_mQsfi1y4M_hhiBL0H931v60
Отображение результатов на приборной панели:
Отображение результатов карты топологии:
Отображение результатов отслеживания ссылок:
Spring Cloud Alibaba Actual Combat (1) Подготовка
Spring Cloud Alibaba Actual Combat (2) Nacos
Spring Cloud Alibaba Actual Combat (3) Sentinel
Весеннее облако Alibaba бой (4) Oauth2
Spring Cloud Alibaba Actual Combat (5) Zuul
Реальные бои Spring Cloud Alibaba (6) Статьи RocketMQ
Spring Cloud Alibaba Actual Combat (7) Seata
Spring Cloud Alibaba Actual Combat (8) SkyWalking
Адрес проекта на GitHub:GitHub.com/D2C-CAI/Хайер…