ru
Feedback
Java | Фишки и трюки

Java | Фишки и трюки

Открыть в Telegram

Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna

Больше
6 953
Подписчики
-324 часа
-27 дней
+630 день
Архив постов
🔍 Завтра тестовое собеседование с Java-разработчиком 20 июля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседо
🔍 Завтра тестовое собеседование с Java-разработчиком 20 июля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Сергею Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot Реклама. О рекламодателе.

☕️ 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 спасёт от багов, усталости и вечного "вручную".

☕️Циклы и операторы в них (For, While, Do while)
Это видео посвящено циклам в языке Java — фундаментальной теме для любого разработчика. Ты научишься использовать циклы for, while и do-while, а также освоишь операторы управления потоком внутри циклов.
🤩 Java Фишки и трюки || #Видео

📦 Массивы, строки и коллекции в 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 для мгновенного поиска по ключу.

Хотите задеплоить Spring-проект или ТГ-бота в облаке? В видео 🐳 «Деплоим Spring Boot приложение через Docker Compose в Timeweb Cloud» — всё от настройки до запуска. Смотрите и повторяйте! 〰️СМОТРЕТЬ НА YOUTUBE 〰️СМОТРЕТЬ В VK ВИДЕО 〰️СМОТРЕТЬ НА RUTUBE #реклама О рекламодателе

🚀 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 — это не костыль, а чистый, системный способ доставлять код. Оно не думает, а действует. Всё, что нужно — событие в репозитории.

⚙️☝️ Вебинар: Как Solidity обеспечивает доверие и прозрачность в взаимодействии пользователей ⏰ 19 августа в 20:00 МСК мы раз
⚙️☝️ Вебинар: Как Solidity обеспечивает доверие и прозрачность в взаимодействии пользователей ⏰ 19 августа в 20:00 МСК мы разберемся, как технология блокчейн и смарт-контракты создают доверенную среду для всех участников. На примере реальных кейсов мы покажем, как эта технология применяется в децентрализованных финансах, голосованиях, управлении поставками и других критичных областях, где важна надежность и предсказуемость операций. 💪 Мы расскажем, как писать прозрачные и надежные системы для самых актуальных и перспективных технологий. Запишитесь на вебинар и повышайте свою ценность на рынке. Все участникии получат индивидуальное предложение на курс «Solidity Developer». 👉 Для участия зарегистрируйтесь: https://otus.pw/VK9T/ Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

🧵 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 → нет висящих потоков, нет утечек, нет забытых таймаутов.

Если вы работаете в айти и не хотите вылететь с рынка через 3-4 года, развивайте софт-скиллы. Тимлиду не нужно уметь писать к
Если вы работаете в айти и не хотите вылететь с рынка через 3-4 года, развивайте софт-скиллы. Тимлиду не нужно уметь писать код – с этим лучше справляется его команда и даже нейронки, а вот грамотно менеджерить команду и выстраивать процессы – реально важный навык. Прокачивайте не только хард-скиллы, но и «гибкие» навыки — это то, что останется востребованным даже в эпоху ИИ. А если с головой нырять в обучение лень, читайте канал Тимлид на удалёнке. Там вся внутрянка от первого лица: как справляться с выгоранием, не терять фокус в условиях многозадачности и развить управленческие качества. С юмором, честно и без занудства. Почитайте на досуге, много нового узнаете: @teamleadonline

👑 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 — это точка, где решается всё: куда пойдёт запрос, кто его выполнит, и что будет по пути. Один слой — и порядок во всей системе.

🖥 Новую версию уже ChatGPT-5 довили телеграм! Новая версия лучше: - пишет код - работает с терминалом - генерирует тексты/до
🖥 Новую версию уже ChatGPT-5 довили телеграм! Новая версия лучше: - пишет код - работает с терминалом - генерирует тексты/документы/курсовые - распознает изображения и отвечает по ним - преобразует ваши фото в любой стиль И не только. Попробуйте бесплатно: @Chatgpturbobot

☕️ Переменные и типы данных. Как хранить информацию в приложении.
В этом видео автор объясняет, что такое переменные и типы данных в Java. Разбирается, как в языке хранится информация, какие бывают типы (int, double, boolean и др.) и как правильно их использовать.
🤩 Java Фишки и трюки || #Видео

⚙️🚀 Как работают децентрализованные приложения и что такое Web3? 👉 На открытом уроке 14 августа в 20:00 МСК мы разберём, по
⚙️🚀 Как работают децентрализованные приложения и что такое Web3? 👉 На открытом уроке 14 августа в 20:00 МСК мы разберём, почему смарт-контракты и блокчейн лежат в основе успешных децентрализованных приложений. Вы увидите реальные кейсы, узнаете, как использовать Solidity для создания безопасных и эффективных приложений, а также разберете перспективы Web3 и развития децентрализованных технологий. 💪 Этот урок откроет для вас новые горизонты в мире блокчейна и Web3. Вы получите актуальные знания, которые помогут вам в освоении Solidity и создании ваших первых dApp. 🎁 Присоединяйтесь к уроку и получите специальное предложение на курс «Solidity Developer». 👉 Для участия зарегистрируйтесь https://otus.pw/jOny/ Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

⚔️ 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 — как запускать через продакшеновый оркестр с логами, шинами и охраной.

🐳 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 — как мультиварка: закинул всё внутрь, нажал кнопку, через минуту обед.

🌐 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 — как космический корабль. Первый запуск трудный, но потом ты просто говоришь “🚀 в прод”, и всё летит.

👩‍💻 Всем программистам посвящается! Вот 17 авторских обучающих IT каналов по самым востребованным областям программирования
👩‍💻 Всем программистам посвящается! Вот 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 🖼️ DevOpst.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 📌 Гайды, шпаргалки, задачи, ресурсы и фишки для каждого языка программирования!

☕️ 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 — как нож бабушки: лёгкий, но не режет экзотику.

💪 Хотите работать в финтехе? Освойте Solidity! 👉 Востребованное обучение для разработчиков с опытом программирования от год
💪 Хотите работать в финтехе? Освойте Solidity! 👉 Востребованное обучение для разработчиков с опытом программирования от года, которые хотят получить навыки написания кода и аудита безопасности, чтобы попасть в одну из самых перспективных и высокооплачиваемых сфер IT. Освойте разработку децентрализованных приложений на профессиональном уровне всего за 5 месяцев на онлайн-курсе «Solidity Developer» от OTUS! Забудьте о скучном обучении — здесь вас ждут настоящие челленджи и нестандартные практические решения. А еще крутые проекты для портфолио! 👉 Пройдите вступительные тест для оценки подходит ли вам курс: https://otus.pw/UPGQ/ 🎁 Получите welcome скидку для успешное прохождение теста. Подробности уточняйте у менеджера. Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576