Java for Beginner
742 subscribers
708 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
Что выведет код?

public class Task110925 {
public static void main(String[] args) {
final int x = 10;
final int y = getValue();

System.out.println(x + y);
}

static int getValue() {
return 20;
}
}


#Tasks
👍3
Варианты ответа?:
Anonymous Quiz
3%
0
6%
10
54%
30
37%
Ошибка компиляции
👍3
Вопрос с собеседований

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

Ответ:

Charset
представляет кодировку символов (UTF-8, ISO-8859-1).

Пример:
Charset utf8 = Charset.forName("UTF-8");
byte[] bytes = "text".getBytes(utf8);

Для работы с текстом в файлах/сетях.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🗓 История IT-технологий сегодня — 12 сентября


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

Мадху Судан (Madhu Sudan; род. 12 сентября 1966, Ченнаи, Индия) — индийско-американский учёный в теории вычислений и кодировании; лауреат многих престижных наград за работы по проверке и реконструкции доказательств и сложности приближений.


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

1958 — Испытана первая интегральная схема, созданная инженером фирмы «Texas Instruments» Джеком Килби. Независимо от него в то же время этой проблемой занимался Роберт Нойс, который первым сумел создать промышленный образец. Ему же достались слава и деньги.

1959 — с космодрома Байконур осуществлён запуск советской межпланетной станции «Луна-2». Она станет первым в истории космическим аппаратом, достигшим поверхности Луны.

1994 В Атланте Марк Андриссен представил новый веб-браузер «Mosaic Netscape», который был выпущен в октябре.


#Biography #Birth_Date #Events #12Сентября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
CI/CD и финальный проект: production-ready Java-приложение с Docker

Финальный проект: архитектура и реализация


Сборка Java-приложения с Kafka и PostgreSQL
Требования к системе:
- Java 17 (сборка через Maven),
- PostgreSQL 15 (для хранения данных),
- Kafka 3.5+ (в режиме KRaft, без ZooKeeper),
- Безопасность: non-root пользователь, distroless-образы,
- Production-ready: healthcheck, лимиты ресурсов, мониторинг.


Финальный Dockerfile: multi-stage, non-root, distroless (не тестировался, возможно содержит ошибки, написан для визуализации)
# Stage 1: Сборка с Maven
FROM maven:3.8.6-openjdk-17 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline -B # Загружаем зависимости без исходников
COPY src ./src
RUN mvn package -DskipTests

# Stage 2: Минимальная JVM через jlink
FROM openjdk:17 AS jlink
ARG TARGETARCH
RUN jlink \
--add-modules java.base,java.logging,java.xml,java.management,java.naming \
--output /jlinked \
--strip-debug \
--compress 2 \
--no-header-files \
--no-man-pages

# Stage 3: Distroless-образ
FROM gcr.io/distroless/java17-debian11
COPY --from=jlink /jlinked /jlinked
COPY --from=builder /app/target/myapp.jar /app.jar

# Создаем non-root пользователя
RUN addgroup --gid 1001 appgroup && \
adduser --uid 1001 --gid 1001 --disabled-password --gecos "" appuser
USER 1001

# Настройка JVM под контейнеры
ENV JAVA_OPTS="\
-XX:+UseContainerSupport \
-XX:MaxRAMPercentage=75.0 \
-XX:+UseZGC \
-Djava.security.egd=file:/dev/./urandom"
ENTRYPOINT ["/jlinked/bin/java", "${JAVA_OPTS}", "-jar", "/app.jar"]


Объяснение

1. Multi-stage build:
- Stage 1 (builder):
- Использует официальный образ Maven для загрузки зависимостей (dependency:go-offline ускоряет сборку в CI).
- Сборка происходит в изолированном окружении — зависимости не попадут в финальный образ.


- Stage 2 (jlink):
- Создает минимальную JVM через jlink, включая только необходимые модули (анализируйте зависимости через jdeps --print-module-deps).
- --compress 2 сжимает классы (уменьшает размер на 30%).


- Stage 3 (distroless):
- Базовый образ без ОС — только JVM и приложение.
- Нет shell, curl, apt — нулевой attack surface.


2. Non-root пользователь:
- adduser --uid 1001 создает пользователя с фиксированным UID для совместимости с томами.
- Почему это важно: Если контейнер скомпрометирован, злоумышленник не получит root-доступ к хосту.


3. JVM-параметры:
- -XX:MaxRAMPercentage=75.0 — ограничивает heap 75% от лимита контейнера (оставшиеся 25% — для Metaspace и native-памяти).
- -XX:+UseZGC — низколатентный GC (макс. паузы ~1 мс).


Критические нюансы:
- В distroless нет jcmd/jstack.

Для дампов используйте:
  docker cp myapp:/tmp/heap.hprof .  # Если heap_dump настроен в JAVA_TOOL_OPTIONS


- Проверяйте лимиты памяти через:
  docker exec myapp cat /sys/fs/cgroup/memory.max



#Java #middle #Docker
👍3
Финальный 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