
- Главная
- Каталог
- Интернет технологии
- Библиотека Java разработчика
Статистика канала
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
👉@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 сам поднимет сервер, выполнит эти команды и пришлет вам письмо, если что-то сломалось.
🆚 Что выбрать?
Manager или Utils, который знает всё и делает всё. Нарушает SRP (Single Responsibility Principle).
2. Long Method (Длинный метод): Если метод не помещается на один экран монитора - это запах.
3. Magic Numbers (Магические числа):
• Плохо: if (status == 7) ... (Что такое 7? Счастливое число?)
• Хорошо: if (status == STATUS_ACTIVE) ...
4. Duplicated Code (Дублирование): Copy-Paste это зло. Если вы нашли ошибку в одном месте, вам придется искать её копии по всему проекту. Принцип DRY (Don't Repeat Yourself).
5. Feature Envy (Зависть к чужим данным): Метод класса А постоянно обращается к полям класса Б. Скорее всего, этот метод должен жить в классе Б.
🛠 3. Refactoring (Рефакторинг)
Это процесс изменения структуры кода без изменения его поведения.
Золотое правило Бойскаута:
"Оставь место стоянки чище, чем оно было до твоего прихода."Зашли в файл поправить баг? Поправьте заодно название переменной или вынесите метод. Маленькие улучшения каждый день спасают проект. 💻 До и После 🤢 Было (Smelly Code):
public void process(Order o) {
// Magic Number + Long Method + Feature Envy
if (o.getItems().size() > 0 && o.getStatus() == 1) {
double total = 0;
for (Item i : o.getItems()) {
total += i.getPrice() * 1.2; // Что такое 1.2? НДС? Наценка?
}
System.out.println("Total: " + total); // Hardcoded output
}
}
{}
😎 Стало (Clean Code):
private static final double TAX_RATE = 1.2;
private static final int STATUS_ACTIVE = 1;
public void printOrderTotal(Order order) {
if (isEligibleForProcessing(order)) {
double total = calculateTotal(order);
outputResult(total);
}
}
private boolean isEligibleForProcessing(Order order) {
return !order.isEmpty() && order.getStatus() == STATUS_ACTIVE;
}
private double calculateTotal(Order order) {
return order.getItems().stream()
.mapToDouble(item -> item.getPrice() * TAX_RATE)
.sum();
}
{}
Код стал читаемым, как книга.
🔥 Итог
1. Технический долг неизбежен, но его нужно гасить.
2. Запахи кода (магические числа, дубликаты) подсказывают, где рефакторить.
3. Рефакторинг делаем только при наличии Тестов (иначе вы просто ломаете рабочий код).
#Refactoring #CleanCode #TechnicalDebt #CodeSmells #Java
📲 Мы в MAX
👉@BookJavaРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576INSERT, Foreign Key, DTO), а бизнес на языке денег и процессов («Провести проводку», «Списать остаток»).
DDD (Предметно-ориентированное проектирование) - это попытка убрать переводчика.
🗣 1. Ubiquitous Language (Единый язык)
Это фундамент. Код должен звучать так же, как речь эксперта.
user.setAddress("New York"); userRepo.save(user);
user.relocateTo(new Address("New York"));
Методы должны называться глаголами бизнеса, а не сеттерами.
📦 2. Bounded Context (Ограниченный контекст)
Самая большая ошибка новичка - создать один класс Product на всё приложение.
SalesContext.Product
WarehouseContext.StockItem
Эти модели могут даже иметь разные ID и общаться друг с другом только через события (Kafka).
🏗 3. Tactical DDD (Строительные блоки)
Как писать код внутри контекста?
A. Entity (Сущность)
Объект, у которого есть Identity (ID).
Если у двух людей одинаковое имя, это все равно два разных человека (разные ID).
User, Order.
Money, Address, Color.
String email используйте класс EmailAddress. Там можно спрятать валидацию.
C. Aggregate (Агрегат)
Это кластер объектов, которые живут и умирают вместе.
Заказ (Order) + Позиции заказа (OrderItems).
Order).
OrderItem и изменить его цену напрямую. Вы должны сказать: order.changeItemPrice(...). Это гарантирует целостность данных.
🩸 Anemic vs Rich Model (Анемичная vs Богатая модель)
❌ Анемичная (Стандартный Spring):
Класс — это просто мешок с геттерами и сеттерами. Вся логика лежит в Service.
// Service
public void completeOrder(Long id) {
Order order = repo.findById(id);
if (order.getStatus() != PAID) throw ...
order.setStatus(COMPLETED); // Кто угодно может поменять статус!
repo.save(order);
}
{}
✅ Богатая (DDD):
Логика и валидация живут внутри Сущности. Сервис просто координирует работу.
// Entity
public void complete() {
if (this.status != PAID) throw new DomainException("Не оплачено!");
this.status = COMPLETED;
// Можно даже вернуть событие OrderCompletedEvent
}
// Service
public void completeOrder(Long id) {
Order order = repo.findById(id);
order.complete(); // Вся бизнес-логика внутри
repo.save(order);
}
{}
🔥 Итог
DDD - это сложно, но необходимо для больших проектов.
1. Говорите на языке бизнеса (Ubiquitous Language).
2. Разделяйте модели (Bounded Contexts).
3. Используйте Value Objects вместо примитивов.
4. Прячьте логику внутрь Rich Domain Model.
#Architecture #DDD #DomainDrivenDesign #Java #Microservices
📲 Мы в MAX
👉@BookJavaUser, Order).
User не может быть моложе 18 лет).
interface UserRepository (найти пользователя, сохранить пользователя).
PostgresUserRepository реализует интерфейс UserRepository.
RestController вызывает методы Ядра.
Service зависит от PostgresDao.
2. В чистой архитектуре: Service зависит от Интерфейса. А PostgresDao зависит от Интерфейса.
Оба зависят от абстракции. БД стала просто плагином. Вы можете выкинуть Postgres и поставить заглушку (In-Memory Map) - и бизнес-логика даже не заметит подмены!
⚖️ Когда что использовать?
1. Layered (Controller-Service-Repo)
• ✅ Простые CRUD-приложения.
• ✅ Админки, прототипы.
• ✅ Когда логики почти нет, просто перекладываем данные.
2. Hexagonal (Ports & Adapters)
• ✅ Сложная бизнес-логика (Банкинг, Финтех, Логистика).
• ✅ Приложение живет долго (5+ лет).
• ✅ Нужно писать много Unit-тестов для ядра, не поднимая контекст Spring.
🔥 Итог
Отзывы канала
всего 15 отзывов
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Библиотека Java разработчика — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 10.5K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 8.4, количество отзывов – 15, со средней оценкой 4.9.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 6993.0 ₽, а за 85 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий