Java | Фишки и трюки
الذهاب إلى القناة على Telegram
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna
إظهار المزيد6 953
المشتركون
-324 ساعات
-27 أيام
+630 أيام
أرشيف المشاركات
6 953
🔍 Завтра тестовое собеседование с Java-разработчиком
20 июля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Сергею
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
6 953
☕️ CI/CD с Jenkins Pipelines — как Java проект летит в прод
Сборка руками? Заливка через FTP?
⛔️ Это не девелопмент, а тетрис в продакшене.
Jenkins автоматизирует всё — от сборки до деплоя, пока ты пьёшь кофе ☕️
Вот как это работает на Java 👇
⚙️ Что такое Jenkins Pipeline
Jenkinsfile — это сценарий, который описывает, что и как делать с кодом.
pipeline {
agent any
stages {
stage('Build') {
steps {
sh './gradlew build'
}
}
stage('Test') {
steps {
sh './gradlew test'
}
}
stage('Deploy') {
steps {
sh 'scp build/libs/app.jar user@server:/app/'
}
}
}
}
🟢 Всё по шагам: сначала билд, потом тесты, потом деплой
➡️ Каждый коммит триггерит этот сценарий
🔥 Плохо без CI/CD:
🟢Костыльные .bat скрипты и ручной scp 🟢Кто-то залил баг — тесты никто не запускал 🟢Ночью прод лег, никто не понял, почему✔️ Хорошо с Jenkins:
🟢git push → Jenkins билдит и пушит сам 🟢Ошибся в тестах? Не пройдёшь дальше 🟢Всё логируется, откатывается и работает одинаково везде👍 CI — это контроль. CD — это доставка без боли. Сборка Java проекта в пайплайне
stage('Build') {
steps {
sh './mvnw package -DskipTests'
}
}
➡️ Jenkins билдит .jar или .war сам
🟢 Поддерживает Gradle, Maven, Ant — что угодно
🧪 Тесты — обязательный рубеж
stage('Test') {
steps {
sh './mvnw test'
}
}
➡️Никаких «ну оно у меня работало»
🟢 Прогон JUnit и Coverage на каждый коммит
🚀 Деплой на сервер — без доступа к ssh
stage('Deploy') {
steps {
sh 'scp target/app.jar user@host:/srv/'
}
}
➡️ Jenkins сам подключается, копирует, рестартит
🟢 Или делает docker build + push → K8s deploy
🗣️ Запомни: CI/CD нужен не когда всё плохо. А чтобы плохо не стало. Jenkins спасёт от багов, усталости и вечного "вручную".6 953
👩💻 В сеть вывалилась гигантская куча курсов и книг от топовых IT‑школ
Держи сотни гигабайт свежих уроков, и каждую неделю мы подкидываем ещё!
1402 ГБ — Python
1815 ГБ — Frontend
1515 ГБ — Backend
1300 ГБ — C / C++
694 ГБ — Java
546 ГБ — SQL & БД
411 ГБ — DevOps
898 ГБ — ИБ & Хакинг
212 ГБ — JavaScript
996 ГБ — Kotlin / Swift
173 ГБ — PHP
215 ГБ — GoLang
185 ГБ — Rust
517 ГБ — Linux
115 ГБ — QA / Тестирование
419 ГБ — GameDev
319 ГБ — 1C + Лицензии
617 ГБ — Машинное обучение
687 ГБ — Аналитика Данных
998 ГБ — Дизайн
Подписывайся и не плати за то, что можно получить бесплатно
6 953
☕️Циклы и операторы в них (For, While, Do while)
Это видео посвящено циклам в языке Java — фундаментальной теме для любого разработчика. Ты научишься использовать циклы for, while и do-while, а также освоишь операторы управления потоком внутри циклов.🤩 Java Фишки и трюки || #Видео
6 953
📦 Массивы, строки и коллекции в Java: быстро, гибко, удобно
Java даёт три больших способа хранить данные: массивы (
Array), строки (String) и коллекции (ArrayList, HashMap).
Каждый из них — под свой сценарий.
🧩 Массив — фиксированный размер и быстрый доступ
int[] numbers = {1, 2, 3};
System.out.println(numbers[0]); // 1
numbers[1] = 42; // меняем элемент
➡️ Индекс — ключ, размер фиксирован, добавлять новые элементы нельзя без создания нового массива.
📜 Строки — неизменяемые последовательности символов
String text = "Hello";
String upper = text.toUpperCase();
System.out.println(text); // Hello
System.out.println(upper); // HELLO
➡️ String в Java — immutable. Любое «изменение» создаёт новую строку. Для частых правок есть StringBuilder.
📋 ArrayList — динамический список
import java.util.ArrayList;
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
System.out.println(list.get(1)); // Python
list.remove(0); // удалили "Java"
➡️ Масштабируется сам. Можно добавлять/удалять элементы без забот о размере.
🗺 HashMap — хранение по ключу
import java.util.HashMap;
HashMap<String, Integer> ages = new HashMap<>();
ages.put("Alice", 25);
ages.put("Bob", 30);
System.out.println(ages.get("Bob")); // 30
🟢 Идеально, если нужно быстро искать по ключу, а не по индексу.
🛠 Комбо: коллекции + массивы
ArrayList<int[]> matrix = new ArrayList<>();
matrix.add(new int[]{1, 2, 3});
matrix.add(new int[]{4, 5, 6});
System.out.println(matrix.get(1)[2]); // 6
➡️ Можно вкладывать одно в другое, создавая гибкие структуры данных.
🗣️ Запомни: Выбирай структуры данных по задаче — массивы для скорости и фиксированного размера, StringBuilder для частых изменений строк, ArrayList для гибких списков и HashMap для мгновенного поиска по ключу.6 953
Хотите задеплоить Spring-проект или ТГ-бота в облаке? В видео 🐳 «Деплоим Spring Boot приложение через Docker Compose в Timeweb Cloud» — всё от настройки до запуска. Смотрите и повторяйте!
〰️СМОТРЕТЬ НА YOUTUBE
〰️СМОТРЕТЬ В VK ВИДЕО
〰️СМОТРЕТЬ НА RUTUBE
#реклама
О рекламодателе
6 953
🚀 CI/CD: автоматизация сборки и доставки — и это работает
CI/CD позволяет запускать сборку, тесты и деплой без участия человека.
Но если ты подключаешь CI/CD к проекту — ты отмечаешь его как “готовый к автоматизации”.
Это и есть CI/CD — конвейер, который действует по событиям.
📛 Пример: сборка и тесты в Jenkins
pipeline {
agent any
stages {
stage('Build') { steps { sh 'mvn clean package' } }
stage('Test') { steps { sh 'mvn test' } }
}
}
push в main
➡️ Jenkins не ждёт команды — он сам собирает и проверяет проект.
🧪 Проверка — через GitHub Actions
name: CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
java-version: '17'
- run: mvn clean verify
➡️ Вот где начинается магия: код проверяется сразу при пуше.
🛠 Применение на практике
Смотри, тебе нужно различать коммиты с кодом и релизы.
Не хочешь вручную запускать тесты перед релизом? — решается одной конфигурацией.
on:
push:
tags:
- 'v*'
➡️ Любой тег с версией запустит сборку релиза.
💾 Другой кейс — автоматический деплой
- name: Deploy
run: ssh user@server 'cd /app && git pull && ./restart.sh'
➡️ Без ручного захода на сервер, без копирования файлов — просто push.
📦 Комбинации: проект — это набор этапов
- run: mvn test # тесты
- run: docker build # сборка контейнера
- run: helm upgrade # деплой в Kubernetes
➡️ Всё описано в сценарии: от проверки до выката.
📚 даже для инфраструктуры
- uses: hashicorp/setup-terraform@v2
- run: terraform apply -auto-approve
➡️ CI/CD может управлять серверами и базами так же, как кодом.
🗣️ Запомни: CI/CD — это не костыль, а чистый, системный способ доставлять код.
Оно не думает, а действует. Всё, что нужно — событие в репозитории.6 953
⚙️☝️ Вебинар: Как Solidity обеспечивает доверие и прозрачность в взаимодействии пользователей
⏰ 19 августа в 20:00 МСК мы разберемся, как технология блокчейн и смарт-контракты создают доверенную среду для всех участников. На примере реальных кейсов мы покажем, как эта технология применяется в децентрализованных финансах, голосованиях, управлении поставками и других критичных областях, где важна надежность и предсказуемость операций.
💪 Мы расскажем, как писать прозрачные и надежные системы для самых актуальных и перспективных технологий.
Запишитесь на вебинар и повышайте свою ценность на рынке. Все участникии получат индивидуальное предложение на курс «Solidity Developer».
👉 Для участия зарегистрируйтесь: https://otus.pw/VK9T/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
6 953
🧵 Structured Concurrency в Java — управление задачами в одном scope, без утечек и хаоса
Structured Concurrency — это модель, где все задачи живут в одном «контейнере».
Падает одна — падают все. Контейнер закрыт — задачи завершены.
📁 Шаг 1: проблема без структуры
Thread t1 = new Thread(() -> fetchUsers());
Thread t2 = new Thread(() -> fetchOrders());
t1.start(); t2.start();
➡️ Потоки живут сами по себе, ошибки не передаются, ресурсы не контролируются.
📁 Шаг 2: ждём задачи вручную
t1.join();
t2.join();
➡️ Мы можем подождать завершения, но всё ещё нет общей отмены при ошибке.
📁 Шаг 3: общий пул потоков
ExecutorService ex = Executors.newFixedThreadPool(2);
Future<String> f1 = ex.submit(() -> fetchUsers());
Future<String> f2 = ex.submit(() -> fetchOrders());
➡️ Теперь задачи в одном месте, можно управлять ими через Futures.
📁 Шаг 4: обработка ошибок централизованно
try {
String u = f1.get();
String o = f2.get();
} catch (Exception e) {
f1.cancel(true);
f2.cancel(true);
}
➡️ Если одна задача падает — отменяем все остальные.
📁 Шаг 5: таймауты для всех задач
List<Future<String>> results = ex.invokeAll(tasks, 1, TimeUnit.SECONDS);
➡️ Через 1 секунду все незавершённые задачи отменяются.
📁 Шаг 6: try-with-resources для пула
try (ExecutorService ex2 = Executors.newFixedThreadPool(2)) {
// запуск задач
}
➡️ При выходе из блока пул и все задачи закрываются автоматически.
📁 Шаг 7: объединение результатов
String combined = u + " | " + o;
System.out.println(combined);
➡️ Structured Concurrency упрощает сбор данных от разных задач.
📁 Шаг 8: CompletableFuture для асинхронщины
CompletableFuture<String> u = CompletableFuture.supplyAsync(() -> fetchUsers());
CompletableFuture<String> o = CompletableFuture.supplyAsync(() -> fetchOrders());
➡️ Задачи стартуют параллельно, и можно дождаться всех вместе.
📁 Шаг 9: join с обработкой ошибок
CompletableFuture.allOf(u, o).join();
➡️ Ждём обе задачи; если одна упадёт — получим исключение и сможем отменить вторую.
📁 Шаг 10: собственный scope-класс
class TaskScope implements AutoCloseable {
ExecutorService ex = Executors.newCachedThreadPool();
List<Future<?>> futures = new ArrayList<>();
<T> Future<T> fork(Callable<T> c) { var f = ex.submit(c); futures.add(f); return f; }
public void close() { futures.forEach(f -> f.cancel(true)); ex.shutdownNow(); }
}
➡️ Теперь у нас есть контейнер для задач, который сам их отменит при закрытии.
📁 Шаг 11: запуск в scope
try (TaskScope scope = new TaskScope()) {
var f1 = scope.fork(() -> fetchUsers());
var f2 = scope.fork(() -> fetchOrders());
}
➡️ Выйдя из try — все задачи будут остановлены.
📁 Шаг 12: добавляем логику таймаута внутрь scope
Future<T> forkWithTimeout(Callable<T> c, long t, TimeUnit u) {
return ex.submit(() -> ex.submit(c).get(t, u));
}
➡️ Теперь каждая задача в scope может иметь свой лимит времени.
📁 Шаг 13: завершение
System.out.println("✅ Все задачи завершены в одном месте");
➡️ Structured Concurrency даёт полный контроль над жизнью задач — от запуска до завершения.
🗣️ Запомни: Structured Concurrency — это про контроль и предсказуемость.
Все задачи в одном scope → нет висящих потоков, нет утечек, нет забытых таймаутов.6 953
Если вы работаете в айти и не хотите вылететь с рынка через 3-4 года, развивайте софт-скиллы.
Тимлиду не нужно уметь писать код – с этим лучше справляется его команда и даже нейронки, а вот грамотно менеджерить команду и выстраивать процессы – реально важный навык.
Прокачивайте не только хард-скиллы, но и «гибкие» навыки — это то, что останется востребованным даже в эпоху ИИ. А если с головой нырять в обучение лень, читайте канал Тимлид на удалёнке.
Там вся внутрянка от первого лица: как справляться с выгоранием, не терять фокус в условиях многозадачности и развить управленческие качества. С юмором, честно и без занудства.
Почитайте на досуге, много нового узнаете: @teamleadonline
6 953
👑 API Gateway: единая точка входа для всех запросов
В Java API Gateway — это слой, который принимает все запросы к микросервисам, решает, куда их направить, и что с ними сделать по пути.
Он не выполняет бизнес-логику — он управляет потоком данных и правилами доступа.
📛 Пример: простейший роутинг
public class ApiGateway {
public void handleRequest(String path) {
if (path.startsWith("/users")) {
userService();
} else if (path.startsWith("/orders")) {
orderService();
} else {
notFound();
}
}
void userService() { System.out.println("👥 Обработка пользователей"); }
void orderService() { System.out.println("📦 Обработка заказов"); }
void notFound() { System.out.println("❌ Маршрут не найден"); }
}
➡️ Один вход — разные направления. Gateway решает, куда отправить запрос.
🧪 Добавляем фильтры и валидацию
public void handleRequest(String path, String token) {
if (!isValidToken(token)) {
System.out.println("⛔️ Доступ запрещён");
return;
}
if (path.startsWith("/admin")) {
adminService();
} else {
publicService();
}
}
boolean isValidToken(String token) {
return token != null && token.equals("secret");
}
void adminService() { System.out.println("🔐 Админ-панель"); }
void publicService() { System.out.println("🌍 Публичный API"); }
➡️ Логика авторизации в одном месте, а не разбросана по сервисам.
🛠 Применение на практике
Смотри, нужно добавить кеширование без изменения кода сервисов:
import java.util.HashMap;
import java.util.Map;
public class CachingGateway {
private Map<String, String> cache = new HashMap<>();
public String handle(String path) {
if (cache.containsKey(path)) {
return "⚡️ Из кеша: " + cache.get(path);
}
String response = callService(path);
cache.put(path, response);
return response;
}
String callService(String path) {
return "Данные для " + path;
}
}
➡️ Сервисы ничего не знают о кешировании — всё делает Gateway.
💾 Другой кейс — агрегация данных
public class AggregationGateway {
public String aggregate() {
String users = getUsers();
String orders = getOrders();
return "👥 " + users + " | 📦 " + orders;
}
String getUsers() { return "5 пользователей"; }
String getOrders() { return "12 заказов"; }
}
➡️ Один запрос к Gateway — и клиент получает объединённые данные из разных сервисов.
📦 Комбинации: безопасность + логирование + роутинг
public class SecureLoggingGateway {
public void handle(String path, String token) {
log(path);
if (!isValidToken(token)) return;
route(path);
}
void log(String path) { System.out.println("📜 Лог: " + path); }
boolean isValidToken(String token) { return "secret".equals(token); }
void route(String path) { System.out.println("➡️ Роутинг к " + path); }
}
➡️ Весь контроль — в одном месте, а не в каждом сервисе.
📚 API Gateway и enum маршрутов
public enum Route {
USERS, ORDERS, STATS
}
public class EnumGateway {
public void dispatch(Route r) {
switch (r) {
case USERS -> System.out.println("👥 Пользователи");
case ORDERS -> System.out.println("📦 Заказы");
case STATS -> System.out.println("📊 Статистика");
}
}
}
➡️ Даже маршруты можно жёстко задать через enum для безопасности.
🗣️ Запомни: API Gateway — это точка, где решается всё: куда пойдёт запрос, кто его выполнит, и что будет по пути. Один слой — и порядок во всей системе.6 953
🖥 Новую версию уже ChatGPT-5 довили телеграм!
Новая версия лучше:
- пишет код
- работает с терминалом
- генерирует тексты/документы/курсовые
- распознает изображения и отвечает по ним
- преобразует ваши фото в любой стиль
И не только.
Попробуйте бесплатно: @Chatgpturbobot
6 953
☕️ Переменные и типы данных. Как хранить информацию в приложении.
В этом видео автор объясняет, что такое переменные и типы данных в Java. Разбирается, как в языке хранится информация, какие бывают типы (int, double, boolean и др.) и как правильно их использовать.🤩 Java Фишки и трюки || #Видео
6 953
⚙️🚀 Как работают децентрализованные приложения и что такое Web3?
👉 На открытом уроке 14 августа в 20:00 МСК мы разберём, почему смарт-контракты и блокчейн лежат в основе успешных децентрализованных приложений. Вы увидите реальные кейсы, узнаете, как использовать Solidity для создания безопасных и эффективных приложений, а также разберете перспективы Web3 и развития децентрализованных технологий.
💪 Этот урок откроет для вас новые горизонты в мире блокчейна и Web3. Вы получите актуальные знания, которые помогут вам в освоении Solidity и создании ваших первых dApp.
🎁 Присоединяйтесь к уроку и получите специальное предложение на курс «Solidity Developer».
👉 Для участия зарегистрируйтесь https://otus.pw/jOny/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
6 953
⚔️ Kubernetes v🆚 Docker Compose — что выбрать для деплоя Java-приложения
Оба запускают контейнеры.
Оба читают YAML.
Но у одного — кнопка "всё просто", а у второго — масштаб и продакшен.
🐳 Docker Compose: для dev и staging
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
depends_on:
- db
db:
image: postgres:16
➡️ Всё в одном файле, разворачивается за 10 секунд
🟢 Подходит для локальной разработки и тестов
🟢 Никаких ingress, сервисов, namespaces
➡️ Отлично, пока всё помещается в голову
☸️ Kubernetes: для продакшена и масштабов
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-app
spec:
replicas: 2
template:
spec:
containers:
- name: java
image: myapp:1.0
ports:
- containerPort: 8080
➡️ Управление через pod'ы и deployment'ы
🟢 Поддерживает автоскейлинг, rolling updates, отказоустойчивость
➡️ Требует kubectl, ingress, сервисов, конфигов
🟢 Не подойдёт, если ты просто хочешь “запустить и посмотреть”
📡 Сеть: как доступен сервис
Compose:
ports:
- "8080:8080"
➡️ Пробрасывает порт хоста прямо в контейнер
Kubernetes:
kind: Service
spec:
type: LoadBalancer
➡️ Отдельный объект Service, управление через балансировщик
🟢 Kubernetes — это про маршрутизацию, а не про “форвард порт”
🔐 Переменные и секреты
Compose:
env_file:
- .env
➡️ Подключение переменных из файла
Kubernetes:
envFrom:
- configMapRef:
name: app-config
➡️ConfigMap и Secret — всё разделено по объектам
🟢 В K8s конфигурация живёт отдельно от кода и образа
🔁 Обновления
Compose:
docker compose down && docker compose up -d
➡️ Всё падает и поднимается заново
Kubernetes:
strategy:
type: RollingUpdate
➡️ Плавные обновления без даунтайма
🟢 K8s сам обновляет по одному поду
🗣️ Запомни: Docker Compose — это как запускать Java через main(). Kubernetes — как запускать через продакшеновый оркестр с логами, шинами и охраной.6 953
🐳 Docker Compose для Java: запускаем всё и сразу, в один файл
Когда у тебя Spring Boot, база, очередь и ещё 2 микросервиса — руками это не запустишь.
Docker Compose — способ задеплоить всё одним махом.
Без скриптов, без флагов, без “а где тут Redis?”. Просто
up -d — и готово 👇
📦 Минимальный пример — Spring Boot + Postgres
version: '3.9'
services:
app:
build: .
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/demo
- SPRING_DATASOURCE_USERNAME=java
- SPRING_DATASOURCE_PASSWORD=secret
depends_on:
- db
db:
image: postgres:16
environment:
- POSTGRES_DB=demo
- POSTGRES_USER=java
- POSTGRES_PASSWORD=secret
➡️ Всё в одном файле: и приложение, и база
🟢 depends_on гарантирует порядок запуска
🟢 Не нужен отдельный Postgres — он стартует сам
➡️ Ты просто клонируешь проект и запускаешь — как магия
🔄 Hot reload: монтируем код
volumes:
- .:/app
➡️ Приложение пересобирается при изменениях
🟢 Удобно для разработки, особенно с Spring DevTools
🟢 Работает как live reload, но без веб-сокетов
🧪 Добавляем ещё сервис: например, Redis
redis:
image: redis:7
ports:
- "6379:6379"
➡️ В Java конфиге указываешь localhost:6379 — и всё
🟢 Redis появляется в сети как обычный контейнер
🟢 В Compose все сервисы в одной сети по умолчанию
🔐 .env для переменных окружения
SPRING_DATASOURCE_USERNAME=java
SPRING_DATASOURCE_PASSWORD=secret
env_file:
- .env
➡️ Хранишь секреты вне Compose-файла
🟢 Удобно для CI/CD
🟢 Никогда не коммить .env в репозиторий
🚫 Остановка и очистка
docker compose down -v
➡️ Останавливает и удаляет тома, сети, контейнеры
🟢 -v — чтобы не остался мусор от базы
🟢 Это не “stop” — это аннигиляция всего стенда
🗣️Запомни: Docker Compose — как мультиварка: закинул всё внутрь, нажал кнопку, через минуту обед.6 953
🌐 Kubernetes для Java-разработчика — деплой без паники
Когда Java-приложение готово, остаётся один вопрос: а как его запустить в проде?
Если тебе нужен масштаб, отказоустойчивость и автоматизация — ответ один: Kubernetes.
Показываю, как он работает с Java-приложением — без воды 👇
📦 Сборка: сначала контейнер
FROM eclipse-temurin:17
COPY target/app.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
➡️ Сборка стандартная. Главное — получить рабочий Docker image
🟢 Один и тот же образ можно запускать локально и в кластере
🟢 Неважно Spring это, Micronaut или Quarkus — всё сводится к jar + Dockerfile
🟡 Kubernetes Deployment — всё начинается отсюда
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-app
spec:
replicas: 2
selector:
matchLabels:
app: java-app
template:
metadata:
labels:
app: java-app
spec:
containers:
- name: app
image: myorg/java-app:1.0
ports:
- containerPort: 8080
➡️ Разворачивает несколько копий приложения
🟢 Контейнер запускается в поде, под управлением kubelet
🟢 Один deployment.yaml заменяет тонны bash-скриптов и ручного запуска
🌐 Сделать доступным: Service
apiVersion: v1
kind: Service
metadata:
name: java-service
spec:
selector:
app: java-app
ports:
- port: 80
targetPort: 8080
type: LoadBalancer
➡️ Прокидывает внешний трафик внутрь кластера
🟢 LoadBalancer в облаке, ClusterIP — для внутренней связи
🟢 Без Service приложение живёт, но недоступно
📡 Настройка входа — через Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: java-ingress
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: java-service
port:
number: 80
➡️ Публичный домен, HTTPS, маршрутизация — всё через Ingress
🟢 Можно добавить cert-manager для автоматических TLS
🟢 Ingress — как прокси, только встроенный и декларативный
🔁 Обновления без даунтайма
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
➡️ Kubernetes обновляет поды по очереди
🟢 Пользователи не замечают релиза
🟢 Микросервисы обожают это
🛠 ConfigMap и Secrets — без пересборки образа
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
SPRING_PROFILES_ACTIVE: prod
envFrom:
- configMapRef:
name: app-config
➡️ Конфиги выносятся из jar-файла
🟢 Смена конфигурации = обновление без пересборки
🟢 Секреты тоже выносятся отдельно — не пиши пароли в YAML
🗣️ Запомни: Kubernetes — как космический корабль. Первый запуск трудный, но потом ты просто говоришь “🚀 в прод”, и всё летит.6 953
👩💻 Всем программистам посвящается!
Вот 17 авторских обучающих IT каналов по самым востребованным областям программирования:
Выбирай своё направление:
👩💻 Java — t.me/java_ready
👩💻 Python — t.me/python_ready
🤔 InfoSec & Хакинг — t.me/hacking_ready
🖥 SQL & Базы Данных — t.me/sql_ready
🤖 Нейросети — t.me/neuro_ready
👩💻 C/C++ — https://t.me/cpp_ready
👩💻 C# & Unity — t.me/csharp_ready
👩💻 Linux — t.me/linux_ready
🖼️ DevOps — t.me/devops_ready
📖 IT Книги — t.me/books_ready
👩💻 Frontend — t.me/frontend_ready
📱 JavaScript — t.me/javascript_ready
👩💻 Backend — t.me/backend_ready
📱 GitHub & Git — t.me/github_ready
👩💻 Весь IT — t.me/it_ready
👩💻 Bash & Shell — t.me/bash_ready
🖥 Design — t.me/design_ready
📌 Гайды, шпаргалки, задачи, ресурсы и фишки для каждого языка программирования!
6 953
☕️ JSON в Java: Jackson и Gson — кто быстрее сериализует твои данные
Java не умеет JSON "из коробки", но есть два монстра: Jackson и Gson.
Оба читают и пишут JSON. Оба работают с POJO. Но подходы — разные.
Покажу, как это работает в реальных проектах 👇
🦾 Jackson — промышленный стандарт
ObjectMapper mapper = new ObjectMapper();
User user = new User("Jon", 42);
String json = mapper.writeValueAsString(user);
User copy = mapper.readValue(json, User.class);
➡️ Всё просто: writeValue и readValue.
🟢 Поддерживает аннотации, вложенные объекты, коллекции, даты и даже Map.
📛 Кастомизация через аннотации:
public class User {
@JsonProperty("username")
private String name;
@JsonIgnore
private String password;
}
➡️ Переименовал поле и спрятал пароль — без лишних движений.
🟢 Jackson — это как Spring: сначала пугает, потом спасает.
🧼 Gson — проще, но со своими приколами
Gson gson = new Gson();
User user = new User("Jon", 42);
String json = gson.toJson(user);
User copy = gson.fromJson(json, User.class);
➡️ Минимум зависимостей, минимум магии.
🟢 Легко встраивается, быстро стартует.
📛 Переименование через @SerializedName:
public class User {
@SerializedName("username")
private String name;
}
🟢 Gson не умеет автоматически сериализовать дату — готовь адаптер.
🔄 Коллекции и вложенные структуры
List<User> users = List.of(new User("Jon", 1), new User("Doe", 2));
String json = mapper.writeValueAsString(users);
➡️ Jackson всё поймёт.
Gson тоже справится, но если читаешь обратно — будь осторожен с типами:
Type type = new TypeToken<List<User>>(){}.getType();
List<User> list = gson.fromJson(json, type);
🟢 Java и дженерики — не лучшие друзья Gson.
🧪 Кастомные сериализаторы — когда всё сложно
public class UserSerializer extends JsonSerializer<User> {
@Override
public void serialize(User u, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeString(u.getName().toUpperCase());
}
}
Используешь, когда стандартная сериализация не подходит:
SimpleModule module = new SimpleModule();
module.addSerializer(User.class, new UserSerializer());
mapper.registerModule(module);
➡️ Jackson выигрывает, если нужно что-то нестандартное.
📊 Jackson vs Gson — что выбрать?
| Фича | Jackson | Gson | | -------------- | ---------- | ----------------------- | | Скорость | 🟢 Быстрее | 🟡 Средняя | | Поддержка даты | 🟢 Да | 🔴 Только через адаптер | | Кастомизация | 🟢 Гибко | 🟡 Просто | | Работа с Map | 🟢 Легко | 🟡 Можно, но осторожно | | Вес | 🟡 Большой | 🟢 Маленький |➡️ Jackson мощнее и гибче, но тяжелее. ➡️ Gson проще и легче, но ограничен. 🗣️ Запомни: Если ты в Spring Boot — бери Jackson. Он уже встроен. А Gson — как нож бабушки: лёгкий, но не режет экзотику.
6 953
💪 Хотите работать в финтехе? Освойте Solidity!
👉 Востребованное обучение для разработчиков с опытом программирования от года, которые хотят получить навыки написания кода и аудита безопасности, чтобы попасть в одну из самых перспективных и высокооплачиваемых сфер IT.
Освойте разработку децентрализованных приложений на профессиональном уровне всего за 5 месяцев на онлайн-курсе «Solidity Developer» от OTUS!
Забудьте о скучном обучении — здесь вас ждут настоящие челленджи и нестандартные практические решения. А еще крутые проекты для портфолио!
👉 Пройдите вступительные тест для оценки подходит ли вам курс: https://otus.pw/UPGQ/
🎁 Получите welcome скидку для успешное прохождение теста. Подробности уточняйте у менеджера.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
