Java Portal | Программирование
13.1K subscribers
981 photos
73 videos
32 files
796 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
8 концепций проектирования систем, объясненных в одной диаграмме

1. Availability with Load Balancers

Использование балансировщиков (Layer 7) для распределения трафика между несколькими экземплярами сервисов (например, Comment Service, Post Service).

Повышает отказоустойчивость и доступность.

2. Latency with CDNs

CDN кэширует контент ближе к пользователю, уменьшая задержки.

Первый запрос идёт на origin-сервер, второй — уже из кэша CDN.

3. Scalability with Replication

Данные реплицируются между несколькими узлами.

Увеличивает доступность и масштабируемость систем.

4. Durability with Transaction Logs

Система сохраняет изменения в журнал транзакций перед применением.

В случае сбоя состояние может быть восстановлено из лога.

5. Consistency with Eventual Consistency

Записи и чтения могут идти в разные источники.

Система приходит к согласованному состоянию со временем (eventually).

6. Modularity with Loose Coupling and High Cohesion

Модули имеют чёткие границы и хорошо организованы внутри.

Улучшает читаемость, повторное использование и сопровождение кода.

7. Configurability with Configuration-as-Code

Инфраструктура управляется через код (например, Terraform, Ansible).

Контроль версий, автоматизация и повторяемость.

8. Resiliency with Message Queues

Задания помещаются в очередь, откуда обрабатываются несколькими потребителями.

Улучшает отказоустойчивость и масштабируемость обработки.


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍84
Метод createNativeQuery из JPA EntityManager

Если тебе нужно выполнить сложную выборку (например, последнюю запись на дату) — не бойся использовать createNativeQuery. Нативный SQL в JPA — это мощный инструмент, особенно когда JPQL ограничен

Читать подробнее

👉 Java Portal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👀2
Виртуальные потоки с Project Loom

Традиционные потоки в Java мощный, но тяжёлый механизм, который ограничивает масштабируемость в высоконагруженных многопоточных приложениях.

С появлением Project Loom вводится концепция виртуальных потоков т.е. лёгких потоков, управляемых самой JVM, которые упрощают работу с конкурентностью и делают её более эффективной.

Виртуальные потоки позволяют запускать тысячи параллельных задач с минимальными накладными расходами, при этом сохраняя простой, блокирующий стиль написания кода без ущерба для производительности. 😇

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
8
Гайд как откатить последний коммит в Git (пошагово)

① Если ещё не делал push:

Оставить изменения в staging (индексе):

git reset --soft HEAD~1


Полностью удалить изменения:

git reset --hard HEAD~1


Отредактировать последний коммит (сообщение или содержимое):

git commit --amend -m "Исправленное сообщение"


② Если уже сделал push:

Используй git revert <хеш>, чтобы создать новый коммит, отменяющий изменения предыдущего.
(Если возникнут конфликты — их придётся разрулить вручную.)

Получи хеш нужного коммита с помощью:

git log


★ Уровень «эксперт»:

Используй git rebase -i для редактирования локального коммит-истории:
Можно менять порядок, объединять, править или удалять коммиты.

После изменений —

git push --force-with-lease


Важно: Делай rebase и push --force-with-lease только если ты один работаешь в ветке
или вся команда согласована и не против переписывания истории.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍4
Пример проекта, демонстрирующий, как использовать GraphQL вместе с Spring Boot.

В репозитории показано:

🔸как настроить GraphQL в Spring-приложении,
🔸как описывать схемы, резолверы и DTO,
🔸как работать с базой данных (MongoDB),
🔸и как совмещать GraphQL с REST-контроллерами.

Подойдёт, если ты хочешь разобраться, как устроен GraphQL в экосистеме Spring или ищешь базу для своего pet-проекта.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍3
Как выдержать нагрузку в 10 000 одновременных пользователей

1. Поставь балансировщик нагрузки (Load Balancer) спереди

- Распределяй трафик между несколькими backend-серверами.
- Инструменты: NGINX, HAProxy, AWS ELB.

2. Масштабируй горизонтально

- Один мощный сервер — нет.
- Используй несколько небольших stateless-серверов за LB.

3. Пиши stateless-сервисы

- Не храни сессии или состояние в оперативке.
- Используй Redis / Memcached или JWT для сессий и авторизации.

4. Используй connection pooling

- Базы «захлебываются» от 10 000 одновременных подключений.
- Ограничь число подключений к БД с каждого сервера через пул (например, HikariCP).

5. Активно кэшируй

Кешировать можно:

- Static files → CDN
- DB-запросы → Redis
- HTML-фрагменты → Edge cache

6. Используй read-replicas

- Разделяй чтение и запись, чтобы масштабировать чтение из базы.

7. Async и очереди (Queued Workloads)

- Переноси тяжёлые задачи (почта, видео и т.д.) в background jobs.
- Используй очереди: SQS, RabbitMQ, Kafka.

8. Включи авто-масштабирование

- Используй инфраструктуру, способную масштабироваться под нагрузку:
AWS EC2 + ASG, GCP GKE и т.д.

9. WebSocket / Реалтайм? Используй gateway-сервисы

- Запускай WebSocket-шлюзы (например, Socket.io за LB).
- Масштабируй через sticky-сессии или pub/sub (Redis, Kafka).

10. Мониторь всё

- Отслеживай CPU, память, задержки, глубину очередей.
- Инструменты: Prometheus + Grafana, Datadog, New Relic.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥7👍2👀1
Выделение памяти в Java

В Java память по умолчанию выделяется в куче с помощью new.
Это просто, управляется сборщиком мусора и подходит для большинства приложений.

Но если нужны высокая производительность или низкие задержки, можно использовать off-heap память через ByteBuffer.allocateDirect().
Такой подход выделяет память вне кучи, снижает нагрузку на GC и повышает эффективность при работе с большими или долго живущими данными.

Off-heap даёт больше контроля и производительности,
но требует аккуратного управления ресурсами,
так как такая память не очищается автоматически, в отличие от памяти в куче.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92🔥2
Вопросы на собеседование по Spring Boot

1. Как Spring Boot определяет, какие бины создавать при автоконфигурации?

2. Для чего используется аннотация @ConditionalOnProperty?

3. Как реализовать пользовательскую валидацию в Spring Boot с помощью аннотаций?

4. Как @Transactional обрабатывает вложенные транзакции?

5. В чём разница между application.properties и application.yml в Spring Boot?

6. Как вынести конфигурацию Spring Boot для разных окружений (environments)?

7. Что такое WebClient в Spring Boot и чем он отличается от RestTemplate?

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
Сохраняем себе: Jimmer

это иммутабельный ORM, заточенный под работу с графами объектов, а не отдельными сущностями.

🔹Авто-генерация DTO
🔹Без N+1 (batch fetch из коробки)
🔹Умные SQL без лишних JOIN'ов
🔹DSL с type-safety
🔹GraphQL + TypeScript-генерация
🔹Кеширование (включая Redis)
🔹Работает через APT/KSP

https://github.com/babyfish-ct/jimmer

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👀53
Объяснение 8 популярных сетевых протоколов в одной диаграмме.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
12🔥12👍1
Слышал когда-нибудь про объект, который отказывается умирать?

В Java можно «воскресить» объект во время сборки мусора с помощью метода finalize(). Но это — рискованная практика, и сам метод уже помечен как устаревший.

Этот код демонстрирует поведение метода finalize() в Java — он вызывается только один раз перед удалением объекта сборщиком мусора. В первой попытке объект «воскрешается» внутри finalize, но при повторной попытке finalize уже не вызывается, и объект действительно удаляется.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🤔53
Java API (не из Spring Boot), которые стоит знать

1. Java Streams API
🔸API для функциональной работы с коллекциями — фильтрация, преобразование, агрегация и пр.

2. Files & NIO.2 (java.nio.file)
🔸Мощное и современное API для работы с файлами и директориями.

3. java.time (Date and Time API)
🔸Новая система работы с датой и временем (введена в Java 8) — безопаснее и удобнее, чем Date/Calendar.

4. JUnit 5
Фреймворк для модульного тестирования с расширенными возможностями и гибкой архитектурой.

5. java.util.concurrent (Concurrency API)
🔸API для реализации многопоточности, синхронизации и конкурентных структур данных.

6. java.net.http (HTTP Client API)
🔸Стандартный HTTP-клиент для отправки запросов и получения ответов (введён в Java 11).

7. Process API (java.lang.ProcessHandle)
🔸Позволяет управлять и отслеживать системные процессы: получать PID, статус, время запуска и пр.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
This media is not supported in your browser
VIEW IN TELEGRAM
Если ты изучаешь Java или хочешь прокачать навыки, обрати внимание на JBook — это интерактивная книга по Java, доступная прямо на GitHub.

Что внутри:

🔸Подробное объяснение основ языка Java;
🔸Примеры кода с пояснениями;
🔸Упражнения для закрепления знаний;
🔸Поддержка Jupyter Notebook + Java (IJava kernel) — можно запускать код прямо в браузере

GitHub: https://github.com/qcha/JBook

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥114👍4
Топ 20 команд Git, которые нужно знать

1. git init — Создать новый репозиторий в текущей директории.
🔸Пример: git init my-new-project

2. git branch — Создать локальную ветку.
🔸Пример: git branch feature/login

3. git checkout — Переключиться на другую ветку.
🔸Пример: git checkout feature/login

4. git add — Добавить файлы в индекс (staging area) для коммита.
🔸Пример: git add file.js

5. git commit — Зафиксировать добавленные изменения.
🔸Пример: git commit -m "Fix navigation bug"

6. git pull — Обновить локальную ветку с удалённого репозитория.
🔸Пример: git pull origin main

7. git push — Отправить локальные коммиты в удалённый репозиторий.
🔸Пример: git push origin main

8. git status — Показать состояние файлов (изменённые, добавленные, удалённые и т.д.).
🔸Пример: git status

9. git diff — Показать разницу между версиями.
🔸Пример: git diff HEAD~1 HEAD

10. git log — Посмотреть историю коммитов.
🔸 Пример: git log --oneline --graph

11. git clone — Скопировать удалённый репозиторий локально.
🔸 Пример: git clone https://github.com/user/repo.git

12. git merge — Объединить ветки.
🔸Пример: git merge feature/login

13. git rebase — Перенести коммиты на другую базу (ветку).
🔸Пример: git rebase main

14. git stash — Временно сохранить изменения, не готовые к коммиту.
🔸Пример: git stash push -m "WIP login"

15. git fetch — Скачивать объекты из удалённого репозитория без слияния.
🔸Пример: git fetch origin

16. git reset — Переместить HEAD или убрать файлы из индекса.
🔸Пример: git reset --hard HEAD~1

17. git revert — Создать новый коммит, отменяющий предыдущие изменения.
🔸Пример: git revert 1a2b3c4

18. git cherry-pick — Применить конкретный коммит на текущую ветку.
🔸Пример: git cherry-pick 1a2b3c4

19. git remote — Управление удалёнными репозиториями.
🔸Пример: git remote add origin git@github.com:user/repo.git

20. git tag — Пометить контрольные точки релизов.
🔸Пример: git tag -a v1.0 -m "Initial release"

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
15👍8
Модель памяти в Java

Java управляет памятью в двух основных областях:

- Stack (стековая память) — хранит фреймы вызова методов и локальные переменные. Работает быстро и автоматически очищается при выходе из метода.

- Heap (куча) — используется для хранения объектов, созданных через new. Управляется сборщиком мусора (Garbage Collector), работает медленнее, но даёт больше гибкости.

➡️Объекты всегда размещаются в куче (heap).
➡️Ссылки на эти объекты (например, локальные переменные) хранятся в стеке (stack).
➡️Неправильное управление созданием объектов или удержание ссылок дольше, чем нужно, может привести к утечкам памяти (memory leaks).

public class MemoryDemo {
public static void main(String[] args) {
int x = 10; // Хранится в стеке
Person p = new Person("Alice"); // 'p' находится в стеке, объект — в куче

p.sayHello(); // Вызов метода создаёт новый стек-фрейм
}
}

class Person {
String name; // Поле хранится в куче вместе с объектом

Person(String name) {
this.name = name;
}

void sayHello() {
System.out.println("Hello, " + name);
}
}


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍2🔥2
Стратегии ветвления в Git

При управлении кодом в разработке ПО выбор правильной стратегии ветвления напрямую влияет на командную работу, интеграцию и процесс деплоя.

Вот основные стратегии ветвления в Git:

1. Feature Branching (ветки под фичи)

Создаётся отдельная ветка для каждой фичи или багфикса. Разработчики работают с этими ветками независимо, а после завершения и ревью — вливают изменения в основную ветку (обычно main или develop).

Подходит для команд, где важен строгий код-ревью и фичи разрабатываются изолированно.

2. Gitflow

Модель ветвления с чётким процессом управления релизами. Используются ветки develop, release, hotfix, feature — каждая со своей ролью в процессе разработки.

Лучше всего подходит для крупных проектов с запланированными циклами релизов.

3. GitLab Flow

Комбинирует идеи Feature Branching и Gitflow, но делает их проще. С акцентом на деплой и интеграцию с issue-трекингом и CI/CD.

Стратегия включает основную ветку (main), которая отражает продакшен-код, и при необходимости — отдельные ветки под окружения (например, staging, production и т.д.).

Подходит для команд, использующих GitLab и практики непрерывной поставки (CD).

4. GitHub Flow

Лёгкий и понятный процесс на основе веток, отлично подходит под continuous deployment. Ветка main всегда должна быть в деплойном состоянии. Фичи разрабатываются в отдельных ветках от main, изменения проходят через pull request.

Хороший выбор для небольших команд и проектов с постоянными поставками.

5. Trunk-Based Development

Все разработчики коммитят напрямую в основную ветку (trunk). Фичевые ветки либо очень короткоживущие, либо не используются вовсе.

Подходит для команд, практикующих CI/CD, и проектов, где приоритет — скорость разработки.

Если ты только начинаешь работать с Git — начни с простой стратегии вроде GitHub Flow и эволюционируй по мере роста команды и сложности проекта.

Для больших команд или сложных процессов лучше использовать более структурированные подходы, такие как Gitflow или GitLab Flow.

Независимо от выбранной стратегии ветвления, важно:

- Настроить автоматическое тестирование, чтобы быстрее ловить баги.
- Согласовать стандарты по commit-сообщениям, нейминг веток и процессам слияния.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍2🤔1
Загрузка Java-модуля во время выполнения

Можно загрузить Java-модуль во время выполнения, создав экземпляр ModuleLayer:

// /tmp/ModuleLoad.java
void main() throws Exception {
Path h2 = Path.of("/tmp/h2-2.3.232.jar");
ModuleFinder before = ModuleFinder.of(h2);
ModuleFinder after = ModuleFinder.of();
Set<String> roots = Set.of("com.h2database");

ModuleLayer parentLayer = ModuleLayer.boot();
Configuration parentConf = parentLayer.configuration();
Configuration conf = parentConf.resolve(before, after, roots);
ClassLoader scl = ClassLoader.getSystemClassLoader();
ModuleLayer layer = parentLayer.defineModulesWithOneLoader(conf, scl);

ClassLoader cl = layer.findLoader("com.h2database");
Class<?> c = cl.loadClass("org.h2.tools.Shell");
Method main = c.getMethod("main", String[].class);
Object args = new String[0];
main.invoke(null, args);
}


Один из возможных кейсов — реализация плагин-системы в приложении.
Другой кейс — запуск всего приложения через начальный загрузчик, выполняя:

java Way.java


Иными словами, файл Way.java выступает в роли скрипта, который:

🔸Загружает все необходимые JAR-файлы приложения.
🔸Загружает основной модуль приложения и запускает само приложение.

Это базовая идея, лежащая в основе Objectos Start.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
9
Вредные советы Java

Автор показывает соблазн простого распараллеливания задач на Java через Stream API и .parallel() вместо явных ExecutorService, Future, invokeAll и ручной обработки InterruptedException

Однако такой подход использует common ForkJoinPool, и его поведение не всегда предсказуемо, результаты могут отличаться между запусками, особенно при исключениях в задачах
(callsCounter может сильно варьироваться)

Если в процессе одна из задач выбрасывает Exception, выполнение остальных может продолжаться
даже после возврата ошибки.

Параллельные стримы группируют задачи по частям коллекции, и минимальной единицей
может быть блок из нескольких элементов, это может привести к «неравномерной» нагрузке и даже ухудшению производительности по сравнению с ручным управлением через ExecutorService.

Блокирующие операции внутри задач могут полностью "забить" common ForkJoinPool, что повлияет и на выполнение CompletableFuture.thenApplyAsync(), если вы не указали свой Executor

Читать подробнее<...>

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥94
Пишем асинхронный Java-код как синхронный

Разрабатываешь на Java и устал от коллбэков, .thenApply(), .handle() и всей этой цепочки с CompletableFuture?

Загляни в ea-async от Electronic Arts

ea-async — это библиотека, которая позволяет писать асинхронный код в стиле обычного синхронного Java-кода, используя await() прямо как в JavaScript/TypeScript.

Под капотом — bytecode instrumentation и CompletableFuture

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52🔥1