Библиотека Java разработчика
10.3K subscribers
1.05K photos
594 videos
58 files
1.42K links
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate.


По всем вопросам @evgenycarter

РКН clck.ru/3KoGeP
Download Telegram
Media is too big
VIEW IN TELEGRAM
Хранилище файлов. Java + WebDav

Java + WebDav - загружаем файл на webdav через Rest запрос.

00:00 Приветствие
00:34 Spring Init
00:55 Docker Hub
01:54 docker-compose
04:25 webdav.conf
06:00 application.yaml
06:50 Sardine
07:36 WebDavConfig
09:15 WebConfig
11:40 FileService
14:09 Controller
17:22 Docker Fix
17:47 Postman
18:16 что не так?
20:46 Подписывайтесь

источник

👉@BookJava
👍5
📦 От Кода к Продакшену: JAR и Docker

В старые времена (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
👍74👎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 Контейнер с вашим 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
👍63🔥2