🎛 Конфигурация Spring Boot: YAML, Профили и Секреты
Хардкодить настройки (порты, пароли, URL-ы) в Java-коде - это моветон. Если вам нужно поменять порт сервера, вы не должны перекомпилировать приложение.
Spring Boot следует принципу: "Код отдельно, настройки отдельно".
1️⃣ Properties vs YAML
По умолчанию Spring создает
Весь мир переходит на YAML (
Было (
Стало (
Меньше дублирования, глазам приятнее.
2️⃣ Как достать настройки в коде?
Способ А: Простой (
Подходит для точечных настроек.
Способ Б: Профессиональный (
Если настроек много (например, настройки почты или API), лучше собрать их в отдельный класс. Это дает типизацию и проверку данных!
Теперь вы просто внедряете
3️⃣ Профили (Profiles) - Киллер-фича
На локальной машине у вас H2 база данных, а на продакшене - PostgreSQL. Как не менять конфиги вручную?
Используйте Профили.
Вы создаете несколько файлов рядом с основным
🔴
🔴
В основном файле вы указываете, какой профиль активен по умолчанию:
А при запуске на сервере вы просто передаете флаг, и Spring подхватит нужный файл, перетерев дефолтные настройки:
4️⃣ Секреты (Никаких паролей в Git!)
Самая страшная ошибка - закоммитить
Правило: В файлах храним только дефолтные/безопасные значения. Реальные пароли передаем через Переменные Окружения (Environment Variables).
Spring Boot имеет строгий приоритет загрузки. Переменные окружения OS имеют более высокий приоритет, чем файлы.
🔴 В файле:
🔴 В переменной ОС:
Spring увидит переменную в системе и проигнорирует то, что написано в файле. Ваш секрет в безопасности.
🔥 Итог
1. Используйте YAML вместо properties.
2. Группируйте настройки через
3. Разделяйте среды через Профили (
4. Никогда не храните боевые пароли в файлах. Используйте ENV vars.
#SpringBoot #Configuration #YAML #DevOps #BestPractices
📲 Мы в MAX
👉@BookJava
Хардкодить настройки (порты, пароли, URL-ы) в Java-коде - это моветон. Если вам нужно поменять порт сервера, вы не должны перекомпилировать приложение.
Spring Boot следует принципу: "Код отдельно, настройки отдельно".
1️⃣ Properties vs YAML
По умолчанию Spring создает
application.properties. Это старый формат (ключ=значение).Весь мир переходит на YAML (
.yaml или .yml). Он читабельнее и поддерживает иерархию.Было (
.properties):
spring.datasource.url=jdbc:postgresql://localhost/db
spring.datasource.username=admin
server.port=8080
Стало (
.yaml):
server:
port: 8080
spring:
datasource:
url: jdbc:postgresql://localhost/db
username: admin
Меньше дублирования, глазам приятнее.
2️⃣ Как достать настройки в коде?
Способ А: Простой (
@Value)Подходит для точечных настроек.
@Value("${server.port}")
private int port;
Способ Б: Профессиональный (
@ConfigurationProperties)Если настроек много (например, настройки почты или API), лучше собрать их в отдельный класс. Это дает типизацию и проверку данных!
@ConfigurationProperties(prefix = "mail")
public record MailConfig(String host, int port, String username) {}
Теперь вы просто внедряете
MailConfig в свои сервисы, как обычный бин.3️⃣ Профили (Profiles) - Киллер-фича
На локальной машине у вас H2 база данных, а на продакшене - PostgreSQL. Как не менять конфиги вручную?
Используйте Профили.
Вы создаете несколько файлов рядом с основным
application.yaml:application-dev.yaml (для разработки)application-prod.yaml (для боевого сервера)В основном файле вы указываете, какой профиль активен по умолчанию:
spring:
profiles:
active: dev # По умолчанию грузим dev-настройки
А при запуске на сервере вы просто передаете флаг, и Spring подхватит нужный файл, перетерев дефолтные настройки:
java -jar app.jar -Dspring.profiles.active=prod4️⃣ Секреты (Никаких паролей в Git!)
Самая страшная ошибка - закоммитить
application-prod.yaml с паролем от боевой БД в репозиторий. ☠️Правило: В файлах храним только дефолтные/безопасные значения. Реальные пароли передаем через Переменные Окружения (Environment Variables).
Spring Boot имеет строгий приоритет загрузки. Переменные окружения OS имеют более высокий приоритет, чем файлы.
spring.datasource.password=secretSPRING_DATASOURCE_PASSWORD=SuperSecurePass123Spring увидит переменную в системе и проигнорирует то, что написано в файле. Ваш секрет в безопасности.
🔥 Итог
1. Используйте YAML вместо properties.
2. Группируйте настройки через
@ConfigurationProperties.3. Разделяйте среды через Профили (
dev, test, prod).4. Никогда не храните боевые пароли в файлах. Используйте ENV vars.
#SpringBoot #Configuration #YAML #DevOps #BestPractices
📲 Мы в MAX
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍1🤔1
📦 От Кода к Продакшену: JAR и Docker
В старые времена (Java EE) процесс деплоя был адом: нужно было установить на сервер Tomcat, настроить его, скомпилировать
Spring Boot принес концепцию Fat JAR (Жирный JAR).
🍔 1. Fat JAR - "Всё своё ношу с собой"
Spring Boot упаковывает ваше приложение, все библиотеки (зависимости) и даже сам веб-сервер (Tomcat) в один единственный файл
Этот файл работает как
Как собрать?
В терминале (в папке проекта):
В папке
Как запустить?
Где угодно (на сервере, на ноутбуке друга), где есть Java:
Всё! Сервер стартует.
🐳 2. Docker - "Работает везде"
JAR это хорошо. Но что, если на сервере стоит Java 11, а у вас Java 17? Или другая ОС? Начинается проблема "На моем компьютере работало!".
Docker решает это, упаковывая ваше приложение вместе с Java и операционной системой в Контейнер.
Пишем
Создайте файл без расширения с именем
Вариант для новичков (Простой):
Как запустить:
🏗 3. Multi-stage Build (Уровень Pro)
В варианте выше вам нужно сначала собрать JAR руками. Это неудобно для CI/CD.
В профессиональном Dockerfile мы делаем сборку внутри Docker.
Почему это круто? В финальном образе нет исходного кода и тяжелого Maven. Только Java и ваш JAR. Образ весит минимум, а собрать его можно одной командой
🔥 Итог
1. Maven/Gradle собирают код в один Fat JAR.
2. Dockerfile описывает среду для запуска.
3. Multi-stage build позволяет собирать и запускать приложение в изолированной среде, не засоряя систему.
#SpringBoot #Docker #DevOps #Deployment #Java
📲 Мы в MAX
👉@BookJava
В старые времена (Java EE) процесс деплоя был адом: нужно было установить на сервер Tomcat, настроить его, скомпилировать
.war файл, закинуть его в папку... 🤯Spring Boot принес концепцию Fat JAR (Жирный JAR).
🍔 1. Fat JAR - "Всё своё ношу с собой"
Spring Boot упаковывает ваше приложение, все библиотеки (зависимости) и даже сам веб-сервер (Tomcat) в один единственный файл
.jar.Этот файл работает как
.exe в Windows. Ему ничего не нужно, кроме установленной Java.Как собрать?
В терминале (в папке проекта):
# Для Maven
./mvnw clean package
# Для Gradle
./gradlew build
В папке
target (или build/libs) появится файл myapp-0.0.1-SNAPSHOT.jar.Как запустить?
Где угодно (на сервере, на ноутбуке друга), где есть Java:
java -jar myapp.0.0.1-SNAPSHOT.jar
Всё! Сервер стартует.
🐳 2. Docker - "Работает везде"
JAR это хорошо. Но что, если на сервере стоит Java 11, а у вас Java 17? Или другая ОС? Начинается проблема "На моем компьютере работало!".
Docker решает это, упаковывая ваше приложение вместе с Java и операционной системой в Контейнер.
Пишем
DockerfileСоздайте файл без расширения с именем
Dockerfile в корне проекта.Вариант для новичков (Простой):
# 1. Берем базовый образ с Java 17 (легковесный Alpine Linux)
FROM eclipse-temurin:17-jre-alpine
# 2. Копируем наш JAR внутрь образа
# (Предварительно нужно сделать mvn package руками!)
COPY target/*.jar app.jar
# 3. Говорим, какую команду запустить при старте контейнера
ENTRYPOINT ["java", "-jar", "/app.jar"]
Как запустить:
# 1. Собираем образ (Image)
docker build -t my-spring-app .
# 2. Запускаем контейнер
# -p 8080:8080 пробрасывает порт наружу
docker run -p 8080:8080 my-spring-app
🏗 3. Multi-stage Build (Уровень Pro)
В варианте выше вам нужно сначала собрать JAR руками. Это неудобно для CI/CD.
В профессиональном Dockerfile мы делаем сборку внутри Docker.
# --- Этап 1: Сборка (Build) ---
FROM maven:3.8.5-openjdk-17 AS builder
WORKDIR /app
COPY . .
# Собираем JAR, пропуская тесты (для скорости)
RUN mvn clean package -DskipTests
# --- Этап 2: Запуск (Run) ---
# Берем чистый, маленький образ для запуска
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
# Копируем ТОЛЬКО готовый jar из первого этапа
COPY --from=builder /app/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
Почему это круто? В финальном образе нет исходного кода и тяжелого Maven. Только Java и ваш JAR. Образ весит минимум, а собрать его можно одной командой
docker build, даже если на компьютере вообще не установлена Java!🔥 Итог
1. Maven/Gradle собирают код в один Fat JAR.
2. Dockerfile описывает среду для запуска.
3. Multi-stage build позволяет собирать и запускать приложение в изолированной среде, не засоряя систему.
#SpringBoot #Docker #DevOps #Deployment #Java
📲 Мы в MAX
👉@BookJava
👍7❤4👎1
🚀 CI/CD: Роботы делают рутину за вас
Аббревиатура состоит из двух частей, и они решают разные проблемы.
🛠 1. CI (Continuous Integration / Непрерывная интеграция)
Суть: Разработчики постоянно (несколько раз в день) сливают свой код в общую ветку (например,
Каждый раз, когда вы делаете
1. Скачивает ваш свежий код.
2. Собирает проект (
3. Запускает все Unit и Integration тесты.
Если хоть один тест упал - сборка помечается красным крестиком (Build Failed). Код не пройдет дальше.
Итог: Ваша главная ветка в Git всегда находится в рабочем состоянии.
📦 2. CD (Continuous Delivery & Deployment)
Здесь две буквы "D", и они немного отличаются:
🔴 Continuous Delivery (Доставка): Код автоматически собирается в готовый артефакт (например, Docker-образ) и кладется в хранилище. Нажать кнопку "Опубликовать на Production" должен человек (например, тимлид).
🔴 Continuous Deployment (Развертывание): Полная автоматизация. Прошли тесты? Собрался образ? Он сразу же автоматически загружается на боевой сервер и заменяет старую версию. (Так делает Amazon, выкатывая обновления тысячи раз в день).
⚙️ Анатомия Пайплайна (Pipeline)
Пайплайн - это скрипт, состоящий из шагов (Stages), которые выполняются строго друг за другом. Упал предыдущий - следующий не запустится.
Типичный пайплайн для Spring Boot + Docker:
1.
2.
3.
4.
5.
💻 Как это выглядит в коде? (GitHub Actions)
Вам не нужно кликать мышкой в интерфейсах. Пайплайн описывается кодом (YAML) и лежит прямо в вашем репозитории (подход Infrastructure as Code).
Вот пример простого
Стоит вам сделать
🆚 Что выбрать?
🔴 Jenkins: "Дед" в мире CI/CD. Мощный, гибкий, но сложный в настройке (нужно поднимать свой сервер). Написан на Java.
🔴 GitLab CI: Стандарт индустрии корпоративного сектора. Очень удобен, так как встроен прямо в репозиторий кода.
🔴 GitHub Actions: Современный, быстрый, идеален для Open Source и проектов, уже живущих в GitHub.
🔥 Итог
CI/CD убивает фактор "человеческой ошибки". Вы перестаете бояться релизов. Деплой новой фичи превращается из стрессового события в пятницу вечером в скучную рутину: сделал пуш подождал 5 минут фича на проде.
#DevOps #CICD #Java #SpringBoot #GitHubActions
📲 Мы в MAX
👉@BookJava
Аббревиатура состоит из двух частей, и они решают разные проблемы.
🛠 1. CI (Continuous Integration / Непрерывная интеграция)
Суть: Разработчики постоянно (несколько раз в день) сливают свой код в общую ветку (например,
main или 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", и они немного отличаются:
⚙️ Анатомия Пайплайна (Pipeline)
Пайплайн - это скрипт, состоящий из шагов (Stages), которые выполняются строго друг за другом. Упал предыдущий - следующий не запустится.
Типичный пайплайн для Spring Boot + Docker:
1.
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 сам поднимет сервер, выполнит эти команды и пришлет вам письмо, если что-то сломалось.🆚 Что выбрать?
🔥 Итог
CI/CD убивает фактор "человеческой ошибки". Вы перестаете бояться релизов. Деплой новой фичи превращается из стрессового события в пятницу вечером в скучную рутину: сделал пуш подождал 5 минут фича на проде.
#DevOps #CICD #Java #SpringBoot #GitHubActions
📲 Мы в MAX
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
☸️ Kubernetes: Оркестратор вашего зоопарка
Представьте, что у вас 50 микросервисов, каждый запущен в 3 экземплярах (для надежности). Итого 150 контейнеров.
Вдруг сервер №2 сгорает. 50 контейнеров умирают.
Без K8s: Админ просыпается в 3 ночи и руками запускает их на сервере №3.
С K8s: Вы спите. K8s замечает, что "кого-то не хватает", и сам перезапускает умершие контейнеры на живых серверах за секунды. Это называется Self-healing (Самовосстановление).
Чтобы понять K8s, нужно выучить всего три главных слова: Pod, Deployment, Service.
📦 1. Pod - Атом системы
В Docker мы запускаем Контейнеры. В Kubernetes мы запускаем Поды.
• Pod - это минимальная единица. Это обертка вокруг одного (или нескольких) контейнеров.
• У Пода есть свой IP-адрес.
• Обычно: 1 Pod = 1 Контейнер с вашим
• Редко: 1 Pod = Java App + Sidecar (например, агент логирования). Они живут вместе, как сиамские близнецы, и делят сеть.
👮♂️ 2. Deployment (Развертывание) - Начальник
Вы никогда не создаете Поды вручную. Потому что Поды смертны. Если Под умер - он умер.
Вместо этого вы создаете Deployment. Это инструкция для K8s:
Deployment создает ReplicaSet, который следит за численностью.
• Если один Под упал K8s создает новый.
• Если нагрузка выросла Вы меняете цифру 3 на 10, и K8s мгновенно создает еще 7 копий.
🚦 3. Service (Сервис) - Единая точка входа
Поды рождаются и умирают. У них меняются IP-адреса.
Как фронтенду узнать, на какой IP слать запрос, если они меняются каждую минуту?
Тут выходит Service.
Это стабильный сетевой адрес (и DNS-имя), который не меняется никогда.
• Service работает как Load Balancer (Балансировщик).
• Он принимает запрос на
📝 Как это выглядит в коде? (YAML)
В мире K8s мы не пишем команды, мы пишем Манифесты (YAML-файлы), описывающие Желаемое состояние.
Вы скармливаете этот файл командой
🔥 Итог
1. Pod: Обертка над контейнером.
2. Deployment: Следит, чтобы нужное количество Подов всегда работало.
3. Service: Стабильный адрес, распределяющий запросы по Подам.
#Kubernetes #K8s #DevOps #Docker #Java
📲 Мы в MAX
👉@BookJava
Представьте, что у вас 50 микросервисов, каждый запущен в 3 экземплярах (для надежности). Итого 150 контейнеров.
Вдруг сервер №2 сгорает. 50 контейнеров умирают.
Без K8s: Админ просыпается в 3 ночи и руками запускает их на сервере №3.
С K8s: Вы спите. K8s замечает, что "кого-то не хватает", и сам перезапускает умершие контейнеры на живых серверах за секунды. Это называется Self-healing (Самовосстановление).
Чтобы понять K8s, нужно выучить всего три главных слова: Pod, Deployment, Service.
📦 1. Pod - Атом системы
В Docker мы запускаем Контейнеры. В Kubernetes мы запускаем Поды.
• Pod - это минимальная единица. Это обертка вокруг одного (или нескольких) контейнеров.
• У Пода есть свой IP-адрес.
• Обычно: 1 Pod = 1 Контейнер с вашим
app.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
👉@BookJava
👍6❤3🔥2
📊 Мониторинг: Пульс вашего приложения
В мире мониторинга Java есть три главных игрока:
1. Spring Boot Actuator (Генерирует метрики).
2. Prometheus (Собирает и хранит их).
3. Grafana (Рисует красивые графики).
Давайте разберем, как они работают вместе.
1️⃣ Spring Boot Actuator & Micrometer
Сначала нужно научить приложение рассказывать о себе.
В Spring Boot это делается добавлением двух зависимостей: Actuator и Micrometer.
Micrometer это как SLF4J, только для метрик. Это фасад. Вы пишете код один раз, а Micrometer умеет отправлять эти данные хоть в Prometheus, хоть в Datadog, хоть в New Relic.
В
В
Теперь, если вы перейдете по адресу
Это и есть пища для Прометея.
2️⃣ Prometheus: Пылесос данных
Prometheus это Time Series Database (База данных временных рядов). Она хранит цифры с привязкой ко времени.
Его киллер-фича: Pull Model (Модель вытягивания).
В отличие от логов, которые приложение само отправляет (Push), Prometheus сам приходит к вашему приложению раз в 15 секунд и скачивает (Scrape) данные со страницы
Почему Pull лучше Push?
Если ваше приложение под дикой нагрузкой и умирает, оно не сможет отправить метрики. Но Prometheus придет, увидит, что ответа нет, и зафиксирует: "Сервис упал".
3️⃣ Grafana: Капитанский мостик
Prometheus хранит данные, но смотреть на них в текстовом виде больно.
Grafana подключается к Prometheus и превращает скучные цифры в космолет.
Вы можете создать дашборды для всего:
🔴 JVM: Сколько памяти съедено? Как часто работает Garbage Collector?
🔴 Tomcat: Сколько потоков занято?
🔴 Бизнес-метрики: Сколько заказов оформлено за час? Какая выручка?
Alerting (Оповещения):
Самое важное - Графана умеет "кричать".
Вы настраиваете правило: "Если количество ошибок 500 превышает 1% в течение 5 минут - отправь сообщение в Telegram/Slack команде дежурных".
🛠 Кастомные метрики
Spring дает кучу метрик из коробки (CPU, Memory, HTTP requests). Но бизнесу нужны свои цифры.
Создать их легко через
Теперь в Grafana вы увидите график "Заказов в секунду".
🔥 Итог
1. Actuator открывает "дверь" (
2. Prometheus заходит в эту дверь каждые 15 секунд и забирает цифры.
3. Grafana рисует графики на основе этих цифр и будит вас ночью, если всё сломалось.
#DevOps #Monitoring #Prometheus #Grafana #SpringBoot
📲 Мы в MAX
👉@BookJava
В мире мониторинга Java есть три главных игрока:
1. Spring Boot Actuator (Генерирует метрики).
2. Prometheus (Собирает и хранит их).
3. Grafana (Рисует красивые графики).
Давайте разберем, как они работают вместе.
1️⃣ Spring Boot Actuator & Micrometer
Сначала нужно научить приложение рассказывать о себе.
В Spring Boot это делается добавлением двух зависимостей: Actuator и Micrometer.
Micrometer это как SLF4J, только для метрик. Это фасад. Вы пишете код один раз, а Micrometer умеет отправлять эти данные хоть в Prometheus, хоть в Datadog, хоть в New Relic.
В
pom.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 и превращает скучные цифры в космолет.
Вы можете создать дашборды для всего:
Alerting (Оповещения):
Самое важное - Графана умеет "кричать".
Вы настраиваете правило: "Если количество ошибок 500 превышает 1% в течение 5 минут - отправь сообщение в Telegram/Slack команде дежурных".
🛠 Кастомные метрики
Spring дает кучу метрик из коробки (CPU, Memory, HTTP requests). Но бизнесу нужны свои цифры.
Создать их легко через
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
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤3
🪵 ELK Stack: Гугл для ваших логов
ELK - это аббревиатура трех инструментов, которые стали стандартом индустрии:
1. Elasticsearch (База данных).
2. Logstash (Труба).
3. Kibana (Интерфейс).
В современном мире к ним часто добавляется Filebeat (или Fluentd), и стек превращается в EFK.
🏗 Как это работает? (Архитектура)
Представьте конвейер:
1. Java App: Просто пишет логи в консоль (STDOUT) в формате JSON.
2. Filebeat: Маленький агент, который стоит на каждом сервере (или в каждом Поде K8s). Он "слушает" консоль приложения, собирает строки и отправляет их дальше.
3. Logstash: (Опционально) Фильтрует и обрабатывает логи (например, скрывает пароли, парсит даты).
4. Elasticsearch: Хранит терабайты логов и позволяет искать по ним мгновенно.
5. Kibana: Сайт, на который вы заходите, чтобы увидеть графики и поиск.
📝 1. JSON Logging: Забудьте про текст
Обычные логи Java выглядят так:
Это плохо. Компьютеру сложно понять, где тут дата, а где сообщение.
В микросервисах мы пишем логи в JSON:
Как сделать в Spring Boot?
Подключаем библиотеку
🔍 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 вы просто вбиваете
📊 3. Kibana: Визуализация
Kibana — это не просто поиск. Это аналитика.
Вы можете построить дашборд:
• Круговая диаграмма: Распределение ошибок по типам (NPE, DatabaseTimeout).
• График: Количество логинов в минуту.
• Таблица: Топ-10 самых медленных SQL-запросов (если вы логируете время выполнения).
🛠 Pro-Tip: MDC (Mapped Diagnostic Context)
Хотите, чтобы в каждом логе автоматически писался ID текущего пользователя или IP-адрес, но не хотите передавать их в каждый метод?
Используйте MDC.
🔥 Итог
1. Приложение пишет логи в JSON в консоль.
2. Filebeat забирает их и кидает в Elasticsearch.
3. Разработчик открывает Kibana и ищет проблему за 5 секунд по Trace ID.
4. Никаких SSH и
#DevOps #ELK #Logging #Kibana #Elasticsearch
📲 Мы в MAX
👉@BookJava
ELK - это аббревиатура трех инструментов, которые стали стандартом индустрии:
1. Elasticsearch (База данных).
2. Logstash (Труба).
3. Kibana (Интерфейс).
В современном мире к ним часто добавляется Filebeat (или Fluentd), и стек превращается в EFK.
🏗 Как это работает? (Архитектура)
Представьте конвейер:
1. Java App: Просто пишет логи в консоль (STDOUT) в формате JSON.
2. Filebeat: Маленький агент, который стоит на каждом сервере (или в каждом Поде K8s). Он "слушает" консоль приложения, собирает строки и отправляет их дальше.
3. Logstash: (Опционально) Фильтрует и обрабатывает логи (например, скрывает пароли, парсит даты).
4. Elasticsearch: Хранит терабайты логов и позволяет искать по ним мгновенно.
5. Kibana: Сайт, на который вы заходите, чтобы увидеть графики и поиск.
📝 1. JSON Logging: Забудьте про текст
Обычные логи Java выглядят так:
2023-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
👉@BookJava
❤6👍1🔥1
🕸️ Распределенная Трассировка: Ищем "бутылочное горлышко" (Zipkin & Jaeger)
Если логи это текст, а метрики это графики, то трассировка это диаграмма Ганта (каскад) для каждого отдельного HTTP-запроса.
🧩 Главные понятия: Trace и Span
Вся магия строится на двух терминах:
1. Trace (След/Трасса): Это весь путь запроса от клика пользователя в браузере до самого глубокого ответа от базы данных. У него есть единый Trace ID.
2. Span (Пролет/Отрезок): Это один конкретный шаг внутри Трассы. Например, "поход в базу данных" - это один Span. "HTTP-запрос в сервис оплаты" - это другой Span. У каждого спана есть свой Span ID и информация о том, сколько миллисекунд он выполнялся.
🕵️♂️ Как сервисы передают ID друг другу?
Когда Gateway принимает запрос, он генерирует
Когда Gateway вызывает
Вам не нужно писать этот код руками! В Spring Boot 3 за это отвечает библиотека Micrometer Tracing. Она автоматически перехватывает все вызовы через
🛠 Настройка (Spring Boot 3 + Zipkin)
Вам нужно добавить всего пару зависимостей в
В
🔭 Zipkin и Jaeger: UI для детективов
Ваши микросервисы в фоновом режиме отправляют данные о спанах (время старта и конца) в специальный сервер. Самые популярные решения это Zipkin (написан на Java, проще) или Jaeger (от Uber, написан на Go, мощнее).
Вы заходите в веб-интерфейс Jaeger, вбиваете
🟦
🟩
🟨
🟧
🟥
За 5 секунд вы поняли, что проблема не в вашем коде и не в вашей базе данных, а в том, что API стороннего банка отвечает почти 5 секунд. Вы сэкономили часы дебага!
🔥 Итог: "Святая Троица" Observability
Теперь у вас есть полный набор инструментов Senior-разработчика:
1. Метрики (Prometheus/Grafana): Говорят ЕСТЬ ЛИ проблема. (У нас всплеск 500-х ошибок!).
2. Трассировка (Jaeger/Zipkin): Говорит ГДЕ проблема. (Ошибки летят из Payment Service при походе в банк).
3. Логи (ELK): Говорят В ЧЕМ проблема. (Смотрим логи Payment Service по Trace ID и видим:
#DevOps #Jaeger #Zipkin #Tracing #Microservices #SpringBoot
📲 Мы в MAX
👉@BookJava
Если логи это текст, а метрики это графики, то трассировка это диаграмма Ганта (каскад) для каждого отдельного HTTP-запроса.
🧩 Главные понятия: Trace и Span
Вся магия строится на двух терминах:
1. Trace (След/Трасса): Это весь путь запроса от клика пользователя в браузере до самого глубокого ответа от базы данных. У него есть единый Trace ID.
2. Span (Пролет/Отрезок): Это один конкретный шаг внутри Трассы. Например, "поход в базу данных" - это один Span. "HTTP-запрос в сервис оплаты" - это другой Span. У каждого спана есть свой Span ID и информация о том, сколько миллисекунд он выполнялся.
🕵️♂️ Как сервисы передают ID друг другу?
Когда Gateway принимает запрос, он генерирует
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
👉@BookJava
🔥5❤1👍1
🕸️ Service Mesh: Инфраструктура, невидимая для кода
❌ Проблема: "Толстые" микросервисы
Если вы используете Spring Cloud (Netflix OSS), ваша бизнес-логика перемешана с сетевой логикой.
Вам нужно добавлять в код Java аннотации для ретраев (повторных запросов), настраивать Circuit Breaker (Предохранитель), писать логику для распределенной трассировки.
А теперь представьте, что в компанию пришла команда, которая пишет на Go или Node.js. Им придется искать аналоги всех этих библиотек для своих языков! Разве сеть это проблема программиста? Нет, это проблема инфраструктуры.
🦸♂️ Решение: Service Mesh и паттерн Sidecar
Service Mesh (Сервисная сетка) - это выделенный инфраструктурный слой для безопасного, быстрого и надежного общения микросервисов друг с другом. Самый популярный инструмент на рынке - Istio.
Вся магия строится на паттерне Sidecar (Коляска мотоцикла).
Рядом с вашим контейнером Java в том же поде (Pod) Kubernetes незаметно запускается второй маленький контейнер - Proxy-сервер (обычно это Envoy).
Теперь ваше Java-приложение вообще ничего не знает о внешнем мире.
1. Оно хочет отправить запрос в
2. Sidecar-прокси перехватывает этот запрос.
3. Sidecar сам находит нужный сервис, сам шифрует трафик, сам делает ретраи, если сеть моргнула, и отправляет запрос другому Sidecar-у на стороне
🎛️ Как устроен Istio: Data Plane и Control Plane
• Data Plane (Плоскость данных): Это армия тех самых Sidecar-прокси (Envoy), которые стоят рядом с каждым сервисом и перекидывают байты.
• Control Plane (Плоскость управления): Это мозг (Istiod). Он раздает команды всем прокси-серверам: "Так, с сегодняшнего дня все запросы шифруем", "А теперь 5% трафика направь на новую версию сервиса".
✨ Суперспособности Service Mesh
Зачем терпеть усложнение архитектуры? Ради этих фич:
1. Управление трафиком (Traffic Routing)
Вам больше не нужно деплоить новую версию на всех сразу и молиться, чтобы она не упала.
Вы можете сказать Istio: "Пусти 99% пользователей на версию v1, и только 1% пользователей с iPhone - на версию v2 (Канареечный релиз)". Если v2 работает стабильно, плавно увеличиваем процент.
2. Нулевое доверие (Zero-Trust Security & mTLS)
Если хакер проникнет во внутреннюю сеть дата-центра, он сможет "слушать" трафик между вашими сервисами (там могут лететь пароли и токены в открытом виде).
Istio из коробки включает mTLS (Mutual TLS). Трафик между ВСЕМИ микросервисами автоматически шифруется. При этом разработчикам не нужно возиться с сертификатами в Java-коде.
3. Наблюдаемость (Observability) без кода
Помните Jaeger, Zipkin и Prometheus из прошлого сезона? Чтобы они работали, мы добавляли библиотеки в
С Service Mesh это не нужно! Так как все запросы проходят через Sidecar-прокси, он сам собирает метрики (сколько времени занял запрос, какие были ошибки) и сам рисует красивые графы зависимостей в Grafana и Jaeger.
4. Устойчивость к сбоям (Resilience)
Если
⚔️ Service Mesh vs API Gateway
Часто спрашивают: "Зачем мне Istio, если у меня уже есть Spring Cloud Gateway?"
• API Gateway: Управляет трафиком Север-Юг (Снаружи вовнутрь). Он стоит на границе интернета и вашей системы, принимает запросы от пользователей, проверяет JWT-токены и пускает внутрь.
• Service Mesh: Управляет трафиком Восток-Запад (Внутри системы). Он следит за тем, как микросервисы общаются между собой за закрытыми дверями.
🔥 Итог
Service Mesh (Istio) - это инструмент для крупных и сложных систем.
Если у вас 5 микросервисов - это оверкилл, используйте Spring Cloud.
Если у вас 100 микросервисов на разных языках программирования, строгие требования к безопасности (банки) и частые релизы без Service Mesh вы сойдете с ума.
#SystemDesign #ServiceMesh #Istio #Microservices #DevOps
📲 Мы в MAX
👉@BookJava
❌ Проблема: "Толстые" микросервисы
Если вы используете Spring Cloud (Netflix OSS), ваша бизнес-логика перемешана с сетевой логикой.
Вам нужно добавлять в код Java аннотации для ретраев (повторных запросов), настраивать Circuit Breaker (Предохранитель), писать логику для распределенной трассировки.
А теперь представьте, что в компанию пришла команда, которая пишет на Go или Node.js. Им придется искать аналоги всех этих библиотек для своих языков! Разве сеть это проблема программиста? Нет, это проблема инфраструктуры.
🦸♂️ Решение: Service Mesh и паттерн Sidecar
Service Mesh (Сервисная сетка) - это выделенный инфраструктурный слой для безопасного, быстрого и надежного общения микросервисов друг с другом. Самый популярный инструмент на рынке - Istio.
Вся магия строится на паттерне Sidecar (Коляска мотоцикла).
Рядом с вашим контейнером Java в том же поде (Pod) Kubernetes незаметно запускается второй маленький контейнер - Proxy-сервер (обычно это Envoy).
Теперь ваше Java-приложение вообще ничего не знает о внешнем мире.
1. Оно хочет отправить запрос в
PaymentService? Оно просто шлет HTTP-запрос на localhost.2. Sidecar-прокси перехватывает этот запрос.
3. Sidecar сам находит нужный сервис, сам шифрует трафик, сам делает ретраи, если сеть моргнула, и отправляет запрос другому Sidecar-у на стороне
PaymentService.🎛️ Как устроен Istio: Data Plane и Control Plane
• Data Plane (Плоскость данных): Это армия тех самых Sidecar-прокси (Envoy), которые стоят рядом с каждым сервисом и перекидывают байты.
• Control Plane (Плоскость управления): Это мозг (Istiod). Он раздает команды всем прокси-серверам: "Так, с сегодняшнего дня все запросы шифруем", "А теперь 5% трафика направь на новую версию сервиса".
✨ Суперспособности Service Mesh
Зачем терпеть усложнение архитектуры? Ради этих фич:
1. Управление трафиком (Traffic Routing)
Вам больше не нужно деплоить новую версию на всех сразу и молиться, чтобы она не упала.
Вы можете сказать Istio: "Пусти 99% пользователей на версию v1, и только 1% пользователей с iPhone - на версию v2 (Канареечный релиз)". Если v2 работает стабильно, плавно увеличиваем процент.
2. Нулевое доверие (Zero-Trust Security & mTLS)
Если хакер проникнет во внутреннюю сеть дата-центра, он сможет "слушать" трафик между вашими сервисами (там могут лететь пароли и токены в открытом виде).
Istio из коробки включает mTLS (Mutual TLS). Трафик между ВСЕМИ микросервисами автоматически шифруется. При этом разработчикам не нужно возиться с сертификатами в Java-коде.
3. Наблюдаемость (Observability) без кода
Помните Jaeger, Zipkin и Prometheus из прошлого сезона? Чтобы они работали, мы добавляли библиотеки в
pom.xml.С Service Mesh это не нужно! Так как все запросы проходят через Sidecar-прокси, он сам собирает метрики (сколько времени занял запрос, какие были ошибки) и сам рисует красивые графы зависимостей в Grafana и Jaeger.
4. Устойчивость к сбоям (Resilience)
Если
PaymentService "лежит", Sidecar может автоматически сделать 3 повторные попытки (Retry) с интервалом в секунду. Если сервис всё равно не отвечает, Sidecar включит Circuit Breaker (разорвет цепь) и будет сразу возвращать ошибку, чтобы не перегружать зависший сервис.⚔️ Service Mesh vs API Gateway
Часто спрашивают: "Зачем мне Istio, если у меня уже есть Spring Cloud Gateway?"
• API Gateway: Управляет трафиком Север-Юг (Снаружи вовнутрь). Он стоит на границе интернета и вашей системы, принимает запросы от пользователей, проверяет JWT-токены и пускает внутрь.
• Service Mesh: Управляет трафиком Восток-Запад (Внутри системы). Он следит за тем, как микросервисы общаются между собой за закрытыми дверями.
🔥 Итог
Service Mesh (Istio) - это инструмент для крупных и сложных систем.
Если у вас 5 микросервисов - это оверкилл, используйте Spring Cloud.
Если у вас 100 микросервисов на разных языках программирования, строгие требования к безопасности (банки) и частые релизы без Service Mesh вы сойдете с ума.
#SystemDesign #ServiceMesh #Istio #Microservices #DevOps
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤3👍2💩1