отслеживание ссылок
Современные интернет-сервисы часто реализуются с использованием сложных крупномасштабных распределенных систем. Эти приложения часто строятся из большого количества программных модулей, которые могут разрабатываться разными группами, могут использовать разные языки программирования и могут охватывать тысячи машин на нескольких физических объектах. В этой среде бесценны инструменты, помогающие понять поведение системы и причину проблем с производительностью.
Микросервисная архитектура является распределенной архитектурой. В реальной разработке мы разделяем сервисные единицы в соответствии с бизнес-требованиями. Система часто состоит из нескольких бизнес-единиц. В этом случае запрос может быть обработан несколькими бизнес-подразделениями для завершения ответа.Если возникает ошибка или исключение, его трудно найти.
Чтобы решить эту проблему, Google открыл исходный код распределенного компонента отслеживания ссылок Drapper и опубликовал статью.Dapper, крупномасштабная инфраструктура трассировки распределенных системПредставлена дизайнерская идея Drapper. Под влиянием этого документа Twitter спроектировал, разработал и открыл исходный код распределенной системы отслеживания ссылок Zipkin.
Zipkin
Zipkin — это распределенная система трассировки, которая помогает собирать данные о времени для решения проблем с задержкой в архитектуре микросервисов. Он также предоставляет функции сбора и запроса распределенных данных системного времени. Архитектура Zipkin показана на следующем рисунке:
Из схемы архитектуры видно, что Zipkin состоит из четырех компонентов: Collector, Storage, API и UI. Reporter предоставляется прикладной системой и собирает данные. Принцип его работы примерно следующий:
- Внедрите в приложение трассировщик, который использует Span для записи информации о времени и метаданных действий приложения;
- Reporter отправляет Span сборщику данных Zipkin Collector;
- Collector сохраняет данные в базу данных через компонент Storage;
- Компоненты пользовательского интерфейса запрашивают и отображают данные отслеживания через интерфейс API;
Zipkin представляет трассировку запроса через структуру Trace.Запрос обрабатывается несколькими сервисами, и каждый сервис генерирует спан.Между спанами одного и того же запроса существует ассоциативное отношение, которое отображается в виде дерева в компонент пользовательского интерфейса. Основная модель данных Span выглядит следующим образом:
поле | тип | инструкция |
---|---|---|
traceId | string | Генерируется случайным образом для уникальной идентификации информации об отслеживании, все промежутки содержат эту информацию. |
name | string | Имя диапазона, которому можно присвоить имя с помощью метода и отобразить в компоненте пользовательского интерфейса. |
parentId | string | Номер родительского спана, если пусто, значит корневой спан |
id | string | номер пролета |
timestamp | integer | время создания промежутка |
duration | integer | длительность промежутка |
annotations | Annotation | Сопоставьте событие, чтобы объяснить информацию о задержке с отметками времени |
tags | Tags | Тег пролета, используемый для поиска, отображения и анализа |
Чиповкинские чипов ввели поддержку различных общих языков, таких как C #, Go, Java, JavaScript, Ruby, Scala, PHP, также внес дополнительное поддержку сообщества Python, C / C ++, Lua и другие языки.
Практическая тренировка
Шаг-0: Подготовка
Эта статья продолжит "серию микросервисов go-kit" и будет использовать go-kit для интеграции Zipkin для реализации отслеживания ссылок сервисов арифметических операций. Она будет состоять из двух частей:
- у ворот
gateway
Добавлена логика сбора отслеживания ссылок в , а также добавлены настройки отслеживания в обратном прокси-сервере. - Добавьте логику отслеживания и получения ссылок на транспортный уровень и уровень конечной точки службы арифметических операций.
Походный комплектtracing
Пакет добавлен по умолчаниюzipkin
поддержку, поэтому работа по интеграции будет проще. Перед запуском необходимо скачать следующие зависимости:
# zipkin官方库
go get github.com/openzipkin/zipkin-go
# 下面三个包都是依赖,按需下载
git clone https://github.com/googleapis/googleapis.git [your GOPATH]/src/google.golang.org/genproto
git clone https://github.com/grpc/grpc-go.git [your GOPATH]/src/google.golang.org/grpc
git clone https://github.com/golang/text.git [your GOPATH]/src/golang.org/text
В этом упражнении используетсяarithmetic_consul_demo
серединаgateway
иregister
Две службы, скопируйте этот каталог и переименуйте его вarithmetic_trace_demo
,Удалитьdiscover
.
Шаг 1: Docker запускает Zipkin
- открыть файл
docker/docker-compose.yml
, добавьте информацию о конфигурации zipkin на основе консула (используйте официально рекомендованныйopenzipkin/zipkin
), окончательное содержание выглядит так:
version: '2'
services:
consul:
image: progrium/consul:latest
ports:
- 8400:8400
- 8500:8500
- 8600:53/udp
hostname: consulserver
command: -server -bootstrap -ui-dir /ui
zipkin:
image: openzipkin/zipkin
ports:
- 9411:9411
- Откройте терминал и переключитесь на
docker
каталоге выполните следующие команды, чтобы запустить consul и zipkin.
sudo docker-compose up
- После успешного запуска откройте ввод браузера
http://localhost:9411
Проверьте, прошел ли запуск успешно.
Шаг 2. Измените шлюз
gateway
будет первой и последней остановкой трассировки ссылки, нам нужно перехватить приходgateway
Все запросы, запись информации об отслеживании.gateway
Как сервер для внешних запросов и как клиент для служб арифметических операций (внутренняя реализация обратного прокси).
Создать трекер
В сочетании со схемой архитектуры Zipkin компонент Reporter должен быть интегрирован в приложение, и мы используем официальный пакет go. Код выглядит следующим образом (URL-адрес zipkin установлен по умолчанию):
// 创建环境变量
var (
// consul环境变量省略
zipkinURL = flag.String("zipkin.url", "http://192.168.192.146:9411/api/v2/spans", "Zipkin server url")
)
flag.Parse()
var zipkinTracer *zipkin.Tracer
{
var (
err error
hostPort = "localhost:9090"
serviceName = "gateway-service"
useNoopTracer = (*zipkinURL == "")
reporter = zipkinhttp.NewReporter(*zipkinURL)
)
defer reporter.Close()
zEP, _ := zipkin.NewEndpoint(serviceName, hostPort)
zipkinTracer, err = zipkin.NewTracer(
reporter, zipkin.WithLocalEndpoint(zEP), zipkin.WithNoopTracer(useNoopTracer),
)
if err != nil {
logger.Log("err", err)
os.Exit(1)
}
if !useNoopTracer {
logger.Log("tracer", "Zipkin", "type", "Native", "URL", *zipkinURL)
}
}
Добавлено отслеживание ссылок для всех запросов
Используемый нами способ передачи — http, вы можете использоватьzipkin-go
который предоставилmiddleware/http
package, который использует шаблон декоратора, чтобы поместить нашhttp.Handler
Инкапсулируйте его, а затем начните слушать.Код выглядит следующим образом:
//创建反向代理
proxy := NewReverseProxy(consulClient, zipkinTracer, logger)
tags := map[string]string{
"component": "gateway_server",
}
handler := zipkinhttpsvr.NewServerMiddleware(
zipkinTracer,
zipkinhttpsvr.SpanName("gateway"),
zipkinhttpsvr.TagResponseSize(true),
zipkinhttpsvr.ServerTags(tags),
)(proxy)
Настройки обратного прокси
gateway
Получив запрос, создайте егоspan
,один из нихtraceId
будет использоваться как уникальный номер для этого запроса,gateway
должен поставить этоtraceId
"Сообщить" службе арифметических операций, чтобы служба арифметических операций могла непрерывно записывать информацию трассировки для запроса.
существуетReverseProxy
который может выполнить эту задачуTransport
, мы можем использоватьzipkin-go
изmiddleware/http
пакет предоставленNewTransport
заменить систему по умолчаниюhttp.DefaultTransport
. Код выглядит следующим образом:
// NewReverseProxy 创建反向代理处理方法
func NewReverseProxy(client *api.Client, zikkinTracer *zipkin.Tracer, logger log.Logger) *httputil.ReverseProxy {
//创建Director
director := func(req *http.Request) {
//省略
}
// 为反向代理增加追踪逻辑,使用如下RoundTrip代替默认Transport
roundTrip, _ := zipkinhttpsvr.NewTransport(zikkinTracer, zipkinhttpsvr.TransportTrace(true))
return &httputil.ReverseProxy{
Director: director,
Transport: roundTrip,
}
}
Этот шаг имеет решающее значение! Если не установлено, все отслеживание ссылок будет неполным. Для того, чтобы решить эту проблему, потребовалось много времени, и, наконец, черезzipkin-go
изREADMEРазвеял сомнения.
После завершения вышеуказанного процесса вы можете скомпилировать и запустить.
Шаг 3. Измените арифметический сервис.
Создать трекер
Этот шаг связан сgateway
Способ обработки тот же и повторно описываться не будет.
Конечная точка отслеживания
Go-Kit обеспечиваетzipkin-go
Инкапсуляция промежуточного программного обеспечения может быть вызвана напрямуюTraceEndpoint
Два для арифметических операцийEndpoint
Сделайте настройки. код показывает, как показано ниже:
endpoint := MakeArithmeticEndpoint(svc)
endpoint = NewTokenBucketLimitterWithBuildIn(ratebucket)(endpoint)
//添加追踪,设置span的名称为calculate-endpoint
endpoint = kitzipkin.TraceEndpoint(zipkinTracer, "calculate-endpoint")(endpoint)
//创建健康检查的Endpoint
healthEndpoint := MakeHealthCheckEndpoint(svc)
healthEndpoint = NewTokenBucketLimitterWithBuildIn(ratebucket)(healthEndpoint)
//添加追踪,设置span的名称为health-endpoint
healthEndpoint = kitzipkin.TraceEndpoint(zipkinTracer, "health-endpoint")(healthEndpoint)
Трек Транспорт
- Исправлять
transports.go
изMakeHttpHandler
метод. Добавить параметрыzipkinTracer
, а затем задайте параметры отслеживания в ServerOption. код показывает, как показано ниже:
// MakeHttpHandler make http handler use mux
func MakeHttpHandler(ctx context.Context, endpoints ArithmeticEndpoints, zipkinTracer *gozipkin.Tracer, logger log.Logger) http.Handler {
r := mux.NewRouter()
zipkinServer := zipkin.HTTPServerTrace(zipkinTracer, zipkin.Name("http-transport"))
options := []kithttp.ServerOption{
kithttp.ServerErrorLogger(logger),
kithttp.ServerErrorEncoder(kithttp.DefaultErrorEncoder),
zipkinServer,
}
//省略代码
return r
}
- существует
main.go
вызыватьMakeHttpHandler
.
//创建http.Handler
r := MakeHttpHandler(ctx, endpts, zipkinTracer, logger)
На этом все работы по модификации кода завершены, и следующим шагом будет запуск теста.
Шаг 4: Запустите и протестируйте
удостоверитьсяConsul
,Zipkin
,gateway
,register
Четыре службы работают нормально, а затем используют Postman для проверки запроса (аналогично предыдущему, для удобства просмотра данных можно нажать еще несколько раз).
открыть в браузереhttp://localhost:9411
, нажмите кнопку «Найти следы», вы увидите следующий интерфейс. Отображается подробная информация, такая как время выполнения каждого запроса, количество отрезков и имя службы маршрута.
Откройте первый запрос и войдите в интерфейс отслеживания ссылок запроса, как показано на следующем рисунке.
- В верхней части показано: время выполнения запроса — 10,970 миллисекунды, маршрут обслуживания — 2, глубина ссылки — 3, количество пролетов — 3.
- Отображение в нижней части: Отображение отрезков в виде дерева и визуальное отображение информации, такой как служба маршрутизации, время выполнения, имя отрезка и т. д. для каждого отрезка.
Через этот интерфейс мы можем узнать, что отнимающая много времени ссылка в ссылке запросаgateway-service
. Причина в том, что каждый раз, когда приходит запрос, программа должна обратиться к Консулу, чтобы запросить экземпляр службы и динамически создать адрес службы.
Кроме того, щелкните каждый диапазон в древовидной структуре, чтобы просмотреть информацию об описании диапазона, и описание здесь не будет развернуто.
Суммировать
В этой статье используется go-kittracing
компоненты иzipkin-go
Пакет, который добавляет функции отслеживания ссылок к службам шлюза и службам арифметических операций, а также демонстрирует интеграцию в go-kit с примерами.Zipkin
Путь. Пример относительно простой, надеюсь, он будет вам полезен!
Ссылка в этой статье
- Исходный код этой статьи @github
- Зипкин Быстрый старт
- официальный сайт Ципкина
- Шикарные документы
- zipkin-go
Эта статья была впервые опубликована в моей публичной учетной записи WeChat [Xi Yiang Bar], пожалуйста, отсканируйте код, чтобы следовать!