Java for Beginner
743 subscribers
709 photos
196 videos
12 files
1.14K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Финальный docker-compose.yaml: Java + Kafka (KRaft) + PostgreSQL (не тестировался, возможно содержит ошибки, написан для визуализации)
version: '3.8'
services:
app:
image: myapp:latest
ports:
- "8080:8080"
environment:
DB_URL: jdbc:postgresql://db:5432/mydb
DB_PASSWORD: ${DB_PASSWORD}
KAFKA_BOOTSTRAP_SERVERS: kafka:9092
depends_on:
db:
condition: service_healthy
kafka:
condition: service_healthy
networks:
- app_net
deploy:
resources:
limits:
cpus: '1.5'
memory: 512M

db:
image: postgres:15
environment:
POSTGRES_DB: mydb
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- pg_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 10
networks:
- app_net
deploy:
resources:
limits:
memory: 256M

kafka:
image: bitnami/kafka:3.5.1
container_name: kafka
ports:
- "9092:9092"
environment:
KAFKA_CFG_NODE_ID: 0
KAFKA_CFG_PROCESS_ROLES: "broker,controller"
KAFKA_CFG_LISTENERS: "PLAINTEXT://:9092,CONTROLLER://:9093"
KAFKA_CFG_ADVERTISED_LISTENERS: "PLAINTEXT://kafka:9092"
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: "PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT"
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
KAFKA_CFG_INTER_BROKER_LISTENER_NAME: "PLAINTEXT"
volumes:
- kafka_data:/bitnami/kafka
healthcheck:
test: ["CMD", "kafka-broker-api-versions.sh", "--bootstrap-server", "localhost:9092"]
interval: 10s
timeout: 10s
retries: 20
networks:
- app_net
deploy:
resources:
limits:
memory: 512M

volumes:
pg_data:
driver: local
kafka_data:
driver: local

networks:
app_net:
driver: bridge


Ключевые решения

1. KRaft вместо ZooKeeper:
- KAFKA_CFG_PROCESS_ROLES: "broker,controller" — единый процесс для метаданных (упрощает настройку).
- Важно: KAFKA_CFG_ADVERTISED_LISTENERS должен указывать на имя сервиса (kafka), а не на localhost.


2. Healthcheck для всех сервисов:
- Для PostgreSQL: pg_isready проверяет готовность принимать подключения.
- Для Kafka:
kafka-broker-api-versions.sh убеждается, что брокер принимает запросы.
- Почему это критично: depends_on без healthcheck не предотвращает race condition.


3. Лимиты ресурсов:
- deploy.resources.limits — ограничивает использование CPU/memory через cgroups.
- Без этого JVM может выделить память, превышающую лимит контейнера (падение с OutOfMemoryError).


4. Сеть:
- Все сервисы в одной сети app_net — общаются по именам (db, kafka).
- Встроенный DNS Docker резолвит имена в IP-адреса контейнеров.



#Java #middle #Docker
👍2
CI/CD pipeline: от коммита до production

Сборка образа в GitHub Actions
name: Build and Push Docker Image
on:
push:
branches: [ main ]
tags: [ 'v*' ]

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up QEMU for multi-arch
uses: docker/setup-qemu-action@v2

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: ${{ runner.os }}-buildx-

- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: myapp:latest,myapp:${{ github.sha }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new
build-args: |
BUILDKIT_INLINE_CACHE=1



Как это работает


1. Кэширование слоев:
- actions/cache сохраняет результаты сборки в /tmp/.buildx-cache.
- При следующем запуске Buildx использует кэш через cache-from, пропуская этапы с неизмененными инструкциями (например, загрузку зависимостей Maven).
- Экономия времени: Сборка с кэшем — 2 минуты вместо 10.


2. Multi-arch сборка:
- platforms: linux/amd64,linux/arm64 — собирает образы для x86 и ARM.
- Использует QEMU для эмуляции архитектур (установлен через docker/setup-qemu-action).


3. Тегирование:
- myapp:latest — для dev-окружения (не рекомендуется для production!),
- myapp:${{ github.sha }} — уникальный тег на коммит (для отката),
- При тегировании релиза (v1.0.0) — myapp:1.0.0.


Нюансы:
- Для production никогда не используйте latest — это нарушает идемпотентность.
- Вместо latest применяйте семантическое версионирование: major.minor.patch.



#Java #middle #Docker
👍4
Сканирование образа на уязвимости

Добавьте в пайплайн после сборки:
- name: Scan with Trivy
uses: aquasecurity/trivy-action@master
with:
image-ref: 'myapp:${{ github.sha }}'
format: 'table'
exit-code: '1'
ignore-unfixed: true
severity: 'CRITICAL,HIGH'


Как это работает:
- Trivy сканирует образ на наличие уязвимостей в:
- Базовом образе (distroless — минимум пакетов),
- Зависимостях Java (через анализ JAR-файлов).
- ignore-unfixed: true — игнорирует уязвимости без патчей (чтобы не блокировать сборку).
- severity: CRITICAL,HIGH — падает при критических уязвимостях.


Альтернатива: Snyk
- name: Snyk Container scan
uses: snyk/actions/container@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
image: myapp:${{ github.sha }}
args: --severity-threshold=high --fail-on=all



Организация production-ready релиза

Политики хранения образов в registry

1. Для DockerHub/приватного registry:
- Удаляйте образы старше 30 дней (кроме tagged релизов)
- Оставляйте последние 5 образов для каждого major-версии (например, v1.*).


2. Как автоматизировать:
- В GitLab CI используйте cleanup policy для registry,
- В AWS ECR — Lifecycle Policy:

     {
"rules": [
{
"rulePriority": 1,
"description": "Удалять образы старше 30 дней",
"selection": {
"tagStatus": "untagged",
"countType": "sinceImagePushed",
"countUnit": "days",
"countNumber": 30
},
"action": { "type": "expire" }
}
]
}


Multi-environment setup через override.yml

Структура проекта:

├── docker-compose.yml        # Базовая конфигурация
├── docker-compose.dev.yml # Dev-окружение
├── docker-compose.prod.yml # Production
└── .env


Пример docker-compose.prod.yml:
services:
app:
environment:
SPRING_PROFILES_ACTIVE: prod
JAVA_TOOL_OPTIONS: >-
-XX:MaxRAMPercentage=75.0
-XX:+UseZGC
deploy:
replicas: 3
update_config:
parallelism: 1
order: start-first
networks:
- monitoring_net

db:
environment:
POSTGRES_PASSWORD: ${PROD_DB_PASSWORD}
volumes:
- /mnt/prod/pg_data:/var/lib/postgresql/data


Запуск для production:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d


Ключевые отличия:
- Dev:
- Горячая перезагрузка кода через bind mounts,
- Отключенные лимиты ресурсов.

- Production:
- Фиксированные теги образов (не latest),
- Подключение к сети мониторинга (monitoring_net),
- Приватные тома на выделенном диске (/mnt/prod/pg_data).



Будущее: переход к Kubernetes/Helm

Почему Docker Compose не для production?
- Нет оркестрации на нескольких нодах,
- Отсутствует self-healing (автовосстановление упавших сервисов),
- Нет встроенного балансировщика нагрузки.


Как мигрировать
:
1. Замените `docker-compose.yml` на Helm chart:
helm create myapp


2. Настройте values.yaml:

   app:
replicaCount: 3
image:
repository: myapp
tag: "v1.0.0"
resources:
limits:
memory: 512Mi
cpu: "1.5"


3. Интегрируйте Kafka через Strimzi Operator:
   # kafka.yaml
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
spec:
kafka:
version: 3.5.0
replicas: 3
listeners:
- name: plain
port: 9092
type: internal
tls: false


Преимущества Kubernetes:
- Автомасштабирование (HPA),
- Сетевая изоляция через Network Policies,
- Управление секретами через kubectl create secret.



#Java #middle #Docker
👍3
Что выведет код?

public class Task120925 {
public static void main(String[] args) {
double a = 0.1;
double b = 0.2;
double c = 0.3;

System.out.println(a + b == c);
}
}


#Tasks
👍3
Варианты ответа:
Anonymous Quiz
47%
true
50%
false
0%
null
3%
Ошибка компиляции
👍32
Вопрос с собеседований

Что такое Instant в Java? 🤓

Ответ:

Instant
— момент времени в UTC из java.time.

Пример:
Instant now =
Instant.now();

Для timestamp без часового пояса.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Всех с днем программиста! ❤️

В соответствии с Указом Президента Российской Федерации от 11.09.2009 г. № 1034, сегодня мы отмечаем! 🥳

Всем и каждому желаю добиться невероятных успехов в программировании, знании всех известных алгоритмов и библиотек, зп в 300кк в 1 наносекунду, на удаленке с Бали и прочих плюшек о которых мечтаете! 🏝

Я верю что вместе все мы добьемся успеха!

С праздником! 🍸
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10🍾3
🗓 История IT-технологий сегодня — 13 сентября


ℹ️ Кто родился в этот день

Илья́ Валенти́нович Сегало́вич (13 сентября 1964, Горький — 27 июля 2013, Лондон) — российский программист и сооснователь Yandex, CTO; ключевая фигура в развитии поисковых технологий и архитектуры крупномасштабных поисковых систем в России.


🌐 Знаковые события

1985 — Выпущенная первая часть игры из серии Super Mario Bros. для платформы Famicom.

День программи́стапрофессиональный праздник в РФ, отмечаемый в 256-й день года. Число 256 (2⁸) выбрано потому, что это количество различных значений, которые можно выразить с помощью восьмиразрядного байта. Также это максимальная целая степень числа 2, которая не превышает количества дней в году (365 или 366).

Впервые идея празднования «Дня программиста» была обнародована главой издательского дома «Компьютерра» Дмитрием Мендрелюком 15 июля 1996 года. Днём программиста было предложено считать первую пятницу сентября, названную «Чистой пятницей». В 2002 году сотрудники веб-студии «Параллельные технологии» Валентин Балт и Михаил Червяков организовали сбор подписей под обращением к правительству РФ в поддержку признания 256-го дня года официальным праздником программистов.

24 июля 2009 года Министерством связи и массовых коммуникаций РФ подготовлен и внесён в правительство РФ проект указа президента России «О Дне программиста».

11 сентября 2009 года Президент России Дмитрий Медведев подписал Указ № 1034, подготовленный Министерством связи и массовых коммуникаций Российской Федерации, который устанавливает в России новый официальный праздник — «День программиста».



#Biography #Birth_Date #Events #13Сентября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🗓 История IT-технологий сегодня — 14 сентября


ℹ️ Кто родился в этот день

Ива́н Матве́евич Виногра́дов (2 (14) сентября 1891 — 20 марта 1983, Москва) — советский математик, академик АН СССР (1929) по Отделению физико-математических наук (математика).


🌐 Знаковые события

1959 космический аппарат Луна-2 впервые в мире достиг поверхности Луны.

2000корпорация Майкрософт выпустила операционную систему Windows Milennium Edition.

2007 — с космодрома Танэгасима запущена японская АМС Kaguya, предназначенная для исследования Луны.

2015открытие гравитационных волн.


#Biography #Birth_Date #Events #14Сентября
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Forwarded from ChatRoom (Java for Beginner) (Первожрец Java)
Когда рад уходу подписчика
🔥4
Forwarded from ChatRoom (Java for Beginner) (Первожрец Java)
Че встречаться будем сегодня?)
👍3
Ссылка на встречу у бота - @JFB_admin_bot