Обзор
спереди:Построение микросервисного центра отслеживания цепочки вызововВ этой статье мы используем Zipkin для создания центра трассировки цепочки вызовов микросервиса и моделируем экспериментальный сценарий вызова микросервиса. Используя библиотеку Zipkin Brave, мы можем собрать запрос клиента с момента отправки до ответа на него.какие компоненты,какие микросервисы,общее время запроса,Время, потраченное на каждый компоненти другая информация.
В этой статье будет описано, как использовать Zipkin для отслеживания обращений к базе данных Mysql, что также делается с помощью библиотеки OpenZipkin Brave.
Примечание:Эта статья была впервые опубликована на моем официальном аккаунтеCodeSheep,Могунажиматьилисканированиепоследующийбудь остороженЗаходи подписывайся ↓ ↓ ↓
Расширить компонент ZipkinTool
ZipkinTool находится в"Построение микросервисного центра отслеживания цепочки вызовов"Инструментальный компонент, написанный в этой статье, который взаимодействует с Zipkin, использует его для отслеживания цепочки вызовов микросервиса.Теперь, если мы хотим отслеживать цепочку вызовов базы данных Mysql, мы можем расширить его функцию.
- pom.xml добавить зависимости:
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-mysql</artifactId>
<version>4.0.6</version>
</dependency>
- Добавьте MySQLStatementInterceptorManagementBean в класс ZipkinConfiguration.
@Bean
public MySQLStatementInterceptorManagementBean mySQLStatementInterceptorManagementBean() {
return new MySQLStatementInterceptorManagementBean(brave().clientTracer());
}
Добавьте микросервис для доступа к базе данных Mysql.
Все еще наследуем предыдущую статью:"Построение микросервисного центра отслеживания цепочки вызовов", давайте трансформируем микросервис ServiceC в этой статье, и добавим в него взаимодействие с базой данных Mysql.
- Добавьте зависимости JDBC и Mysql в pom.xml.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
- Добавьте конфигурацию подключения Mysql в application.properties.
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://你的Mysql服务所在IP:3307/test?useSSL=false\
&statementInterceptors=com.github.kristofa.brave.mysql.MySQLStatementInterceptor\
&zipkinServiceName=mysqlService
spring.datasource.username=root
spring.datasource.password=XXXXXX
- Добавьте код JdbcTemplate для доступа к базе данных в контроллере.
@GetMapping("/mysqltest”)
public String mysqlTest() {
String name = jdbcTemplate.queryForObject( "SELECT name FROM user WHERE id = 1", String.class );
return "Welcome " + name;
}
Запустите службу базы данных Mysql
1. Запустите контейнер Mysql
docker run -d -p 3307:3306 \
-v ~/mysql/data:/var/lib/mysql \
-v ~/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=XXXXXX \
--name mysql mysql
2. Запустите другой контейнер Mysql, получите к нему доступ и выполните некоторые настройки.
- Сначала введите командную строку mysql
docker run -it --rm \
--link mysql:mysql mysql \
mysql -hmysql -u root -p
- Затем создайте базу данных zipkin: используется для хранения данных, собранных Zipkin.
CREATE DATABASE `zipkin`
CREATE TABLE IF NOT EXISTS zipkin_spans (
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit’,
`trace_id` BIGINT NOT NULL,
`id` BIGINT NOT NULL,
`name` VARCHAR(255) NOT NULL,
`parent_id` BIGINT,
`debug` BIT(1),
`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL’,
`duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query’
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate’;
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations’;
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds’;
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames’;
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range’;
CREATE TABLE IF NOT EXISTS zipkin_annotations (
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit’,
`trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id’,
`span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id’,
`a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1’,
`a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB’,
`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation’,
`a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp’,
`endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null’,
`endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address’,
`endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null’,
`endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null’
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate’;
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans’;
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds’;
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames’;
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces’;
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces’;
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job’;
CREATE TABLE IF NOT EXISTS zipkin_dependencies (
`day` DATE NOT NULL,
`parent` VARCHAR(255) NOT NULL,
`child` VARCHAR(255) NOT NULL,
`call_count` BIGINT,
`error_count` BIGINT
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);
Здесь создаются три таблицы данных.
Файл Sql можно получить по следующей ссылке: https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql/src/main/resources/mysql.sql.
После выполнения скрипта Sql вы увидите, что были построены три таблицы, относящиеся к zipkin:
- Создать тест базы данных: использовать в качестве тестовой базы данных
CREATE DATABASE `test`
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(100) DEFAULT NULL ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET = utf8;
insert into user values (1,”hansonwang99”)
Здесь вставляется часть данных для эксперимента.
Запустите службу зипкин
docker run -d -p 9411:9411 \
--link mysql:mysql \
-e STORAGE_TYPE=mysql \
-e MYSQL_HOST=mysql \
-e MYSQL_TCP_PORT=3306 \
-e MYSQL_DB=zipkin \
-e MYSQL_USER=root \
-e MYSQL_PASS=XXXXXX \
--name zipkin openzipkin/zipkin
Запустите микрослужбу (т.е. службу), которая обращается к базе данных Mysql.
Введите: localhost:8883/mysqltest в браузере. Если вы увидите следующий вывод, это может свидетельствовать об успешном выполнении операции вызова базы данных!
База данных трассировки Zipkin вызывает фактический эксперимент
- **Ввод через браузер: **http://localhost:9411/zipkin/
Откройте веб-интерфейс Zipkin, щелкните раскрывающийся список имени службы, чтобы убедиться, что служба вызовов базы данных Mysql успешно идентифицирована.
- После выбора mysqlservice нажмите «Найти следы».
можно увидетьпервый запросИнформация об отслеживании цепочки вызовов Mysql, существует множество
Нажмите на любой для просмотра:
- **Далее снова введите в браузере: **localhost:8883/mysqltest
Цель состоит в том, чтобы снова вызвать вызов Mysql, а затем снова найти трассировки.Вы можете видеть, что данные трассировки аналогичны следующему рисунку: Он содержит два действия запроса Mysql:
Нажмите на первый запрос для просмотра, который на самом деле находится вПопробуйте подключиться к базе данных Mysql
Нажмите на второй запрос для просмотра и обнаружите, что этоФактический запрос бизнеса
Из графического интерфейса вы можете четко узнать подробные шаги и затраты времени на каждом этапе, поэтому его можно использовать для анализа того, какой оператор SQL выполняется относительно медленно.
постскриптум
Исходный код, использованный в этом эксперименте, был открытым, если необходимо, пожалуйста,самовывоз.
Другие практические статьи автора SpringBt находятся здесь:
- Мониторинг приложений Spring Boot на практике
- Приложения SpringBoot развертываются во внешнем контейнере Tomcat.
- Практика поисковой системы ElasticSearch в SpringBt
- Предварительное изучение совместного программирования Kotlin+SpringBoot
- Практика ведения журнала Spring Boot
- Элегантное кодирование SpringBoot: благословение Ломбока
Если вам интересно, вы также можете уделить время прочтению некоторых статей автора о контейнеризации и микросервисах:
- Используйте стек технологий K8S для создания личного частного облака Серийная статья
- Подробная конфигурация сервера Nginx из списка конфигураций
- Строительство центра мониторинга визуализации контейнеров Docker
- Использование ELK для создания контейнерного центра журналов приложений Docker
- Практика фреймворка RPC: Apache Thrift
- Практика фреймворка RPC: Google gRPC
- Построение микросервисного центра отслеживания цепочки вызовов
- Контейнеры Docker обмениваются данными между хостами
- Предварительное исследование кластера Docker Swarm
- Несколько рекомендаций по эффективному написанию Dockerfile