Java Portal | Программирование
12K subscribers
1.43K photos
110 videos
43 files
1.46K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Spring Cloud: централизуйте конфигурацию с помощью Spring Cloud Config вместо того, чтобы копировать application.properties в каждый сервис.

Используйте Spring Cloud Config для централизованного управления конфигурацией, а не копируйте application.properties повсюду.

// — 1) Config Server: одно место, которое обслуживает конфигурацию всех сервисов —
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApp {
public static void main(String[] args) {
new SpringApplicationBuilder(ConfigServerApp.class).run(args);
}
}

// — 2) application.yml сервера (раздаёт файлы из classpath) —
// spring.profiles.active: native # локальные файлы, Git не нужен
// spring.cloud.config.server.native.search-locations: classpath:/config
// server.port: 8888

// — 3) /config/client-service.yml (конфигурация для "client-service") —
// myproperty: value

// — 4) Клиент: загружает конфигурацию с сервера при запуске —
// spring.application.name: client-service
// spring.config.import: optional:configserver:http://localhost:8888

@Component
public class GreetingClient {
@Value("${myproperty}") // значение получено с Config Server
private String myProperty;
}


#SpringBoot #JavaDev

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Шпаргалка по API-заголовкам

Заголовки API несут метаданные, обеспечивающие безопасную и эффективную коммуникацию.

- Authorization — отправка токенов доступа безопасно
- Content-Type — определение формата тела запроса
- Accept — указание ожидаемого формата ответа
- User-Agent — идентификация клиентского приложения
- Cache-Control — управление кешированием
- Origin — поддержка валидации CORS
- Cookie — отправка информации о сессии
- Accept-Language — установка языковых предпочтений

Понимание заголовков API помогает создавать более быстрые, безопасные и надёжные приложения.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Java совет : начиная с Java 14 можно использовать record для коротких неизменяемых объектов-носителей данных.

короче обычных POJO
автоматически есть equals(), hashCode(), toString()
объекты неизменяемые по умолчанию

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Как на самом деле работает Git
Большинство использует Git, не понимая, что происходит внутри.

Суть такая:
git init
создаёт папку, за которой Git начинает следить
git add
говоришь Git: «эти изменения пойдут в сохранение»
git commit
фиксирует снимок состояния проекта в этот момент
git push
отправляет эти снимки в облако (обычно GitHub)
git pull
забирает снимки, которые отправили другие
git branch
создаёт отдельную линию разработки, где можно работать изолированно
git merge
объединяет эту ветку обратно в основную

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62
Примитивные vs Ссылочные типы в Java

Это одна из самых недопонятых тем в Java.

Многие разработчики знают, что такое примитивные и ссылочные типы, но не то, как они хранятся в памяти.

Понимание этой разницы делает такие темы, как String, Arrays, Objects и Garbage Collection, гораздо более лёгкими для усвоения.

🔹 Примитивные типы
Примитивные переменные хранят фактическое значение.
Примеры:
- byte
- short
- int
- long
- float
- double
- char
- boolean

int age = 25;
double price = 99.99;
char grade = 'A';
boolean isJavaFun = true;

Представьте, что вы пишете число прямо на листе бумаги.
age → 25

🔹 Ссылочные типы
Ссылочные переменные не хранят сам объект.
Они хранят адрес памяти (ссылку) объекта.
Примеры:
- String
- Массивы
- Классы
- Интерфейсы
- Перечисления (Enums)
- Записи (Records)

String name = "Vishwanath";
int[] numbers = {1, 2, 3, 4};
Student student = new Student();

Представьте, что вы храните адрес дома, а не сам дом.
name ───► "Vishwanath"

Простой способ запомнить
- Примитив = хранит значение
- Ссылка = хранит адрес объекта

Совет для собеседования
Что произойдёт здесь?
String a = "Java";
String b = a;

b = "Spring";
Станет ли a тоже "Spring"?

Нет.
b обновляется, чтобы ссылаться на другой объект String, в то время как a всё ещё указывает на исходную строку "Java".

Понимание ссылок объясняет, почему поведение объектов отличается от примитивных значений.

Освоение этой концепции значительно облегчит понимание:
- Stack vs Heap памяти
- Объектов и Классов
- Параметров методов
- Коллекций
- Сборки мусора (Garbage Collection)

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Эволюция коммуникации между сервисами

Архитектура ПО кардинально изменилась за последние 30 лет.

Не потому, что старые подходы были неправильными..
а потому что приложения постоянно росли.
Вот как развивалась коммуникация сервисов:

🔹 1990-е → Point-to-Point (прямая связь)
Просто. Быстро. Но жёсткая связанность.

🔹 2000-е → Запрос/Ответ (RPC)
Удалённые вызовы упростили построение распределённых систем.

🔹 2010-е → Очереди сообщений (Message Queues)
Асинхронная коммуникация повысила надёжность и масштабируемость.

🔹 Середина 2010-х → Издатель/Подписчик (Pub/Sub)
Сервисам больше не нужно было знать друг о друге напрямую.

🔹 Конец 2010-х → Потоковая обработка событий (Event Streaming)
Непрерывная обработка данных в реальном времени с помощью платформ вроде Kafka.

🔹 2020-е → API Gateway + Service Mesh
Управление трафиком, безопасность, наблюдаемость и отказоустойчивость стали первоклассными гражданами.

🔹 Сегодня → AI-нативная коммуникация
Агенты не просто вызывают API — они обнаруживают инструменты, рассуждают о задачах и координируют рабочие процессы.

Главный урок?
Каждая эволюция уменьшала связанность и увеличивала масштабируемость.

Мы движемся от:
➡️ Вызова сервисов
➡️ Публикации событий
➡️ Координации интеллектуальных систем

Какой паттерн коммуникации вы используете чаще всего сегодня?
- REST
- gRPC
- Kafka
- RabbitMQ
- Event Bus
- Service Mesh

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Почему используется Event-Driven Architecture?

Представьте систему с двумя микросервисами:
1) payments
2) emails

Когда платеж подтверждён, payments вызывает emails, чтобы отправить чек.

Но приложение растёт. Теперь нужно ещё сгенерировать счёт, обновить метрики и отправить уведомление.

Чтобы это сделать, payments начинает вызывать каждый из них.

Каждая новая функциональность добавляет ещё один вызов. Со временем такой поток становится всё сложнее поддерживать.

Event-Driven Architecture предлагает другой способ коммуникации.

Когда платеж подтверждён:
1) payments публикует событие "payment confirmed".
2) emails отправляет чек.
3) billing генерирует счёт.
4) metrics обновляет дашборды.

Если завтра вы добавите ещё один микросервис, ему просто нужно реагировать на это событие. Payments не меняется.

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

Очевидно, не всё только преимущества. Система также становится сложнее. Возникают такие проблемы, как повторные попытки, дублирующиеся события, порядок обработки и наблюдаемость.

На практике обычно используется брокер (например, Kafka или RabbitMQ), который получает событие и распределяет его по подписанным микросервисам.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Самая большая слабость JWT — его гибкость. PASETO устраняет её.

Спецификация JWT позволяет токену самому указывать, какой алгоритм использовать. Это единственное дизайнерское решение стоит за большинством проблем с JWT в продакшене.

Вот что PASETO делает иначе.

1. Атака живёт в заголовке

JWT содержит поле alg, которое указывает свой же алгоритм подписи. Вы можете установить его в "none", и некоторые библиотеки пропустят проверку.

Или взять публичный RSA-ключ, использовать его как HMAC-секрет, подписать через HS256 — и сервер, доверяющий заголовку, примет поддельный токен.

Это атака RS256→HS256 confusion, и она до сих пор ломает реальные системы.

2. PASETO привязывает криптографию к версии

Токен PASETO имеет формат version.purpose.payload. Версия фиксирует набор шифров — нечего согласовывать.

v4.public — всегда Ed25519. v4.local — всегда XChaCha20 с BLAKE2b. Нет заголовка alg — нет атаки alg:none и confusion-атак.

3. Вы выбираете назначение, а не алгоритм

Локальный токен (local) зашифрован симметричным ключом. Публичный токен (public) подписан так, что любой с публичным ключом может его проверить.

Стандартный JWT только подписан — payload читается как обычный base64, и секреты утекают, когда люди забывают об этом.

4. Для сессий не нужно ни то, ни другое

JWT безопасны только как короткоживущие токены — минуты, а не недели, на которые тянется сессия. Google делает именно так: JWT используется только для передачи логина между хостами, а сессия в браузере остаётся кукой.

PASETO — лучший выбор для короткоживущего подписанного токена: SSO-переходы, межсервисные вызовы, одноразовое использование.

Для сессий проще кука, подкреплённая Postgres или Redis, а отзыв одной сессии — это удаление одной строки.

Большинство логинов хватаются за токен там, где подошла бы сессия.

https://gist.github.com/samsch/0d1f3d3b4745d778f78b230cf6061452

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4
PostgreSQL 19 добавит в SQL поддержку графовых запросов.

Можно описывать пути связей вроде:

user → likes → topic ← likes ← peer → follows → creator

Это полезно для рекомендаций, прав доступа, социальных графов, цепочек мошенничества и памяти ИИ.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Кто-то собрал Kubernetes, который полностью работает в браузере.

Это может быть самый простой способ изучить Kubernetes.
- Не нужен Docker.
- Не нужен Minikube.
- Не нужен Kind.
- Не нужен EKS.
- Не требуется установка.

Просто откройте веб-страницу и начинайте изучать Pods, Deployments, ReplicaSets, Nodes, планирование, сеть и многое другое.

Инженерная работа за этим проектом невероятна.
Kubernetes написан на Go, но вместо компиляции в браузер разработчик переписал ключевые компоненты Kubernetes на TypeScript, чтобы они работали нативно внутри браузера.
Это один из лучших примеров использования ИИ, который я видел.

ИИ помог портировать тысячи строк кода Kubernetes, пока разработчик вручную проверял всё и подтверждал обширными тестами, чтобы убедиться, что поведение соответствует реальному кластеру.

Это не для продакшн-нагрузок.

Он создан для обучения, преподавания, экспериментов и подготовки к DevOps-собеседованиям.

Представьте онбординг новых инженеров или обучение Kubernetes без необходимости тратить час на установку Docker, настройку Minikube или создание EKS-кластера.

Я искренне считаю, что такие проекты изменят то, как мы изучаем инфраструктуру.

Интерактивные лабораторные работы > Статическая документация.

Пост в блоге: https://ngrok.com/blog/i-ported-kubernetes-to-the-browser

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7
Java CompletableFuture: цепочка асинхронных шагов без блокировки потока при каждом I/O вызове.

Цепочка: supplyAsync, thenApply, thenCompose, thenAccept (получить пользователя, затем заказы)
Обрабатывайте сбои через exceptionality, не давайте асинхронным ошибкам бесшумно исчезать
Запускайте независимые вызовы параллельно, объединяйте через thenCombine когда оба завершатся

#JavaDev

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Основы системного дизайна

Теорема CAP: почему распределённые системы не могут иметь всё сразу

Представьте, что ваше приложение работает на нескольких серверах в разных городах.

Внезапно...

Сетевое соединение между серверами прерывается.

Теперь у системы есть выбор:
Продолжать принимать запросы?

Или отклонять запросы, пока всё не синхронизируется?

Именно эту проблему решает теорема CAP.

Что такое теорема CAP?

CAP означает:

C — Consistency (Согласованность)
Каждый пользователь видит одни и те же данные, независимо от того, к какому серверу подключился.

Пример: Перевод ₹1000. Каждый сервер сразу показывает обновлённый баланс.

A — Availability (Доступность)
Каждый запрос получает ответ.

Даже если один или несколько серверов недоступны.

Ответ может не содержать самых свежих данных.

P — Partition Tolerance (Устойчивость к разделению)
Система продолжает работать, даже если связь между серверами прервана.

В распределённых системах сетевые сбои неизбежны.

Главное правило. Когда происходит сетевое разделение (partition)...

Можно выбрать только одно из двух:
✔️ Согласованность (Consistency)
ИЛИ
✔️ Доступность (Availability)

Гарантировать оба одновременно нельзя.

Partition Tolerance в распределённых системах не опционален — вы обязаны считать, что это случится.

- CP-системы
Выбирают:
✔️ Согласованность
✔️ Устойчивость к разделению

Пример:
Сервер A      ✖️ Сеть ✖️      Сервер B


Если серверы не могут общаться, часть запросов отклоняется, чтобы сохранить согласованность данных.

Применение:
- Банковские системы
- Платёжные системы
- Управление запасами

Правильность важнее, чем постоянный ответ.

- AP-системы
Выбирают:
✔️ Доступность
✔️ Устойчивость к разделению

Даже если серверы теряют связь, они продолжают отвечать.
Некоторые пользователи могут временно видеть устаревшие данные.

Применение:
- Социальные сети
- Ленты новостей
- Каталоги товаров

Доступность важнее немедленной согласованности.

= Реальные примеры =

Банкинг
Неверные балансы недопустимы. Выбирают CP.

Лайки в Instagram
Видеть 1024 лайка вместо 1026 пару секунд — не проблема. Выбирают AP.

Корзина покупок
Многие системы ищут баланс.

Корзина должна оставаться доступной, а важные операции (оплата) — строго согласованными.

Главный вывод. Теорема CAP не говорит: «Выбери любые два».

Она говорит:

Когда происходит сетевое разделение, вы обязаны выбрать между Согласованностью и Доступностью.

Каждая распределённая система делает этот компромисс.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍1
Зачем нужен обратный прокси (Reverse Proxy)?

У вас есть API на Node.js.
Поначалу пользователи отправляют запросы напрямую в приложение, и всё работает отлично.
Но по мере роста проекта появляются новые задачи:

- использовать HTTPS;
- раздавать статические файлы;
- применять ограничение частоты запросов (Rate Limiting);
- масштабировать приложение.

Часть этих задач можно решить прямо в API. Но проблема в том, что тогда ему приходится выполнять две разные роли:
реализовывать бизнес-логику (пользователи, платежи, заказы и т. д.);
решать инфраструктурные задачи (HTTPS, раздача статики, Rate Limiting и т. д.).

По мере появления новых инфраструктурных задач становится логично отделить их от бизнес-логики.
Для этого между интернетом и вашим API добавляют дополнительный слой.
Этот слой называется обратным прокси (Reverse Proxy).

Он принимает входящие запросы и решает, что с ними делать: обработать их самостоятельно или перенаправить в API.
Интернет → Reverse Proxy → Ваш API

Одним из самых популярных решений для реализации обратного прокси является NGINX.
Главное преимущество такого подхода в том, что API может полностью сосредоточиться на бизнес-логике, а обратный прокси берёт на себя управление входящим трафиком до того, как он попадёт в приложение.

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

Однако по мере роста приложения такое разделение ответственности обычно значительно упрощает масштабирование и сопровождение системы.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6