
- Главная
- Каталог
- Интернет технологии
- Библиотека Java разработчика
Статистика канала
Trace ID (например, abc-123) и кладет его в HTTP-заголовки (обычно используется стандарт W3C traceparent или b3).
Когда Gateway вызывает OrderService, он передает эти заголовки дальше. OrderService читает их и понимает: "Ага, я часть большой трассы abc-123".
Вам не нужно писать этот код руками! В Spring Boot 3 за это отвечает библиотека Micrometer Tracing. Она автоматически перехватывает все вызовы через RestTemplate, WebClient, Feign и запросы к БД, вклеивая туда нужные ID.
🛠 Настройка (Spring Boot 3 + Zipkin)
Вам нужно добавить всего пару зависимостей в pom.xml:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
</dependency>
{}
В application.yaml указываем адрес сервера Zipkin:
management:
tracing:
sampling:
probability: 1.0 # Отправлять 100% запросов (на проде обычно ставят 0.1, чтобы не грузить сеть)
zipkin:
tracing:
endpoint: "http://localhost:9411/api/v2/spans"
{}
🔭 Zipkin и Jaeger: UI для детективов
Ваши микросервисы в фоновом режиме отправляют данные о спанах (время старта и конца) в специальный сервер. Самые популярные решения это Zipkin (написан на Java, проще) или Jaeger (от Uber, написан на Go, мощнее).
Вы заходите в веб-интерфейс Jaeger, вбиваете Trace ID (который вы скопировали из логов в Kibana) и видите красивую цветную лесенку:
🟦 Gateway (Всего: 5.0s)
🟩 OrderService.create() (4.9s)
🟨 DB: INSERT order (0.05s)
🟧 PaymentService.pay() (4.8s) 👈 АГА! ВОТ КТО ТОРМОЗИТ!
🟥 External Bank API (4.75s)
За 5 секунд вы поняли, что проблема не в вашем коде и не в вашей базе данных, а в том, что API стороннего банка отвечает почти 5 секунд. Вы сэкономили часы дебага!
🔥 Итог: "Святая Троица" Observability
Теперь у вас есть полный набор инструментов Senior-разработчика:
1. Метрики (Prometheus/Grafana): Говорят ЕСТЬ ЛИ проблема. (У нас всплеск 500-х ошибок!).
2. Трассировка (Jaeger/Zipkin): Говорит ГДЕ проблема. (Ошибки летят из Payment Service при походе в банк).
3. Логи (ELK): Говорят В ЧЕМ проблема. (Смотрим логи Payment Service по Trace ID и видим: ConnectionTimeoutException).
#DevOps #Jaeger #Zipkin #Tracing #Microservices #SpringBoot
📲 Мы в MAX
👉@BookJava2023-10-25 INFO [main] UserService: User created
Это плохо. Компьютеру сложно понять, где тут дата, а где сообщение.
В микросервисах мы пишем логи в JSON:
{
"timestamp": "2023-10-25T10:00:00",
"level": "INFO",
"logger": "UserService",
"message": "User created",
"user_id": "123",
"trace_id": "abc-987"
}
{}
Как сделать в Spring Boot?
Подключаем библиотеку logstash-logback-encoder и настраиваем logback-spring.xml. Теперь ваши логи это структурированные данные, по которым можно фильтровать!
🔍 2. Correlation ID (Trace ID) - Самое важное!
Представьте ситуацию:
User - Service A - Service B - Service C (Ошибка!).
Вы видите ошибку в логах Service C. Но кто её вызвал? Какой пользователь? С какого запроса всё началось? Без связующей нити вы потратите часы на расследование.
Решение: Micrometer Tracing (бывший Spring Cloud Sleuth).
Он автоматически добавляет Trace ID и Span ID в каждый лог.
• Trace ID: Одинаковый для всей цепочки запросов (от входа пользователя до базы данных).
• Теперь в Kibana вы просто вбиваете trace_id="abc-987" и видите все логи всех сервисов, которые участвовали в этом конкретном запросе.
📊 3. Kibana: Визуализация
Kibana — это не просто поиск. Это аналитика.
Вы можете построить дашборд:
• Круговая диаграмма: Распределение ошибок по типам (NPE, DatabaseTimeout).
• График: Количество логинов в минуту.
• Таблица: Топ-10 самых медленных SQL-запросов (если вы логируете время выполнения).
🛠 Pro-Tip: MDC (Mapped Diagnostic Context)
Хотите, чтобы в каждом логе автоматически писался ID текущего пользователя или IP-адрес, но не хотите передавать их в каждый метод?
Используйте MDC.
// В фильтре на входе запроса
MDC.put("userId", request.getHeader("X-User-ID"));
// Где-то глубоко в сервисе
log.info("Заказ создан");
// В JSON-логе автоматически появится поле "userId": "123"
// В конце
MDC.clear();
{}
🔥 Итог
1. Приложение пишет логи в JSON в консоль.
2. Filebeat забирает их и кидает в Elasticsearch.
3. Разработчик открывает Kibana и ищет проблему за 5 секунд по Trace ID.
4. Никаких SSH и grep.
#DevOps #ELK #Logging #Kibana #Elasticsearch
📲 Мы в MAX
👉@BookJavapom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
{}
В application.yaml:
management:
endpoints:
web:
exposure:
include: prometheus, health, info
{}
Теперь, если вы перейдете по адресу /actuator/prometheus, вы увидите не JSON, а скучный текст:
# HELP jvm_memory_used_bytes The amount of used memory
# TYPE jvm_memory_used_bytes gauge
jvm_memory_used_bytes{area="heap",id="G1 Eden Space",} 2.5165824E7
http_server_requests_seconds_count{uri="/users",status="200",} 452.0
{}
Это и есть пища для Прометея.
2️⃣ Prometheus: Пылесос данных
Prometheus это Time Series Database (База данных временных рядов). Она хранит цифры с привязкой ко времени.
Его киллер-фича: Pull Model (Модель вытягивания).
В отличие от логов, которые приложение само отправляет (Push), Prometheus сам приходит к вашему приложению раз в 15 секунд и скачивает (Scrape) данные со страницы /actuator/prometheus.
Почему Pull лучше Push?
Если ваше приложение под дикой нагрузкой и умирает, оно не сможет отправить метрики. Но Prometheus придет, увидит, что ответа нет, и зафиксирует: "Сервис упал".
3️⃣ Grafana: Капитанский мостик
Prometheus хранит данные, но смотреть на них в текстовом виде больно.
Grafana подключается к Prometheus и превращает скучные цифры в космолет.
Вы можете создать дашборды для всего:
MeterRegistry.
@Service
public class OrderService {
private final Counter orderCounter;
public OrderService(MeterRegistry registry) {
// Создаем счетчик "orders.created"
this.orderCounter = registry.counter("orders.created");
}
public void createOrder(Order order) {
repo.save(order);
orderCounter.increment(); // +1 к метрике
}
}
{}
Теперь в Grafana вы увидите график "Заказов в секунду".
🔥 Итог
1. Actuator открывает "дверь" (/actuator/prometheus).
2. Prometheus заходит в эту дверь каждые 15 секунд и забирает цифры.
3. Grafana рисует графики на основе этих цифр и будит вас ночью, если всё сломалось.
#DevOps #Monitoring #Prometheus #Grafana #SpringBoot
📲 Мы в MAX
👉@BookJavaapp.jar.
• Редко: 1 Pod = Java App + Sidecar (например, агент логирования). Они живут вместе, как сиамские близнецы, и делят сеть.
👮♂️ 2. Deployment (Развертывание) - Начальник
Вы никогда не создаете Поды вручную. Потому что Поды смертны. Если Под умер - он умер.
Вместо этого вы создаете Deployment. Это инструкция для K8s:
"Я хочу, чтобы у меня ВСЕГДА было 3 копии моего приложения OrderService".Deployment создает ReplicaSet, который следит за численностью. • Если один Под упал K8s создает новый. • Если нагрузка выросла Вы меняете цифру 3 на 10, и K8s мгновенно создает еще 7 копий. 🚦 3. Service (Сервис) - Единая точка входа Поды рождаются и умирают. У них меняются IP-адреса. Как фронтенду узнать, на какой IP слать запрос, если они меняются каждую минуту? Тут выходит Service. Это стабильный сетевой адрес (и DNS-имя), который не меняется никогда. • Service работает как Load Balancer (Балансировщик). • Он принимает запрос на
http://order-service и пересылает его на один из живых Подов. Ему все равно, 3 их или 30.
📝 Как это выглядит в коде? (YAML)
В мире K8s мы не пишем команды, мы пишем Манифесты (YAML-файлы), описывающие Желаемое состояние.
# 1. Описываем Deployment (Что запускать?)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-java-app
spec:
replicas: 3 # Хочу 3 экземпляра!
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: java-app
image: my-docker-hub/app:v1 # Берем этот образ
ports:
- containerPort: 8080
---
# 2. Описываем Service (Как достучаться?)
apiVersion: v1
kind: Service
metadata:
name: my-backend-service
spec:
selector:
app: backend # Ищи Поды с меткой 'backend'
ports:
- protocol: TCP
port: 80 # Внешний порт
targetPort: 8080 # Порт контейнера
{}
Вы скармливаете этот файл командой kubectl apply -f app.yaml, и магия случается.
🔥 Итог
1. Pod: Обертка над контейнером.
2. Deployment: Следит, чтобы нужное количество Подов всегда работало.
3. Service: Стабильный адрес, распределяющий запросы по Подам.
#Kubernetes #K8s #DevOps #Docker #Java
📲 Мы в MAX
👉@BookJavamain или develop).
Каждый раз, когда вы делаете git push, специальный сервер (GitLab CI, GitHub Actions, Jenkins) автоматически:
1. Скачивает ваш свежий код.
2. Собирает проект (mvn clean compile).
3. Запускает все Unit и Integration тесты.
Если хоть один тест упал - сборка помечается красным крестиком (Build Failed). Код не пройдет дальше.
Итог: Ваша главная ветка в Git всегда находится в рабочем состоянии.
📦 2. CD (Continuous Delivery & Deployment)
Здесь две буквы "D", и они немного отличаются:
Lint (Проверка стиля кода, нет ли неиспользуемых импортов).
2. Test (Запуск JUnit тестов).
3. Build (Сборка `app.jar`).
4. Dockerize (Сборка Docker-образа и отправка его в Docker Registry).
5. Deploy (Команда серверу: "Скачай новый образ и перезапустись").
💻 Как это выглядит в коде? (GitHub Actions)
Вам не нужно кликать мышкой в интерфейсах. Пайплайн описывается кодом (YAML) и лежит прямо в вашем репозитории (подход Infrastructure as Code).
Вот пример простого .github/workflows/build.yml для Java-проекта:
name: Spring Boot CI/CD
on:
push:
branches: [ "main" ] # Запускать только при пуше в main
jobs:
build-and-test:
runs-on: ubuntu-latest # Выделяем виртуальную машину Linux
steps:
- uses: actions/checkout@v3 # 1. Скачиваем код из Git
- name: Установка Java 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Сборка и Тесты (Maven) # 2. Запускаем тесты и сборку
run: ./mvnw clean package
# Дальше могут быть шаги для сборки Docker и деплоя...
{}
Стоит вам сделать git push, и GitHub сам поднимет сервер, выполнит эти команды и пришлет вам письмо, если что-то сломалось.
🆚 Что выбрать?
Отзывы канала
всего 15 отзывов
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Библиотека Java разработчика — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 10.5K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 8.4, количество отзывов – 15, со средней оценкой 4.9.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 6993.0 ₽, а за 85 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий