Java Portal | Программирование
12.3K subscribers
1.35K photos
108 videos
42 files
1.35K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Вопросы для собеседования по микросервисам с ответами

1. Каковы ключевые характеристики микросервисов?

Ответ:

> Децентрализованное управление данными
> Сервисы развёртываются независимо друг от друга
> Проектирование на основе предметной области (DDD)
> Лёгкое взаимодействие (например, REST, gRPC)
> Изоляция сбоев
> Удобны для непрерывной доставки

2. Чем микросервисы отличаются от монолитной архитектуры?

Ответ:

> Монолит: единая кодовая база, жёстко связанные компоненты, сложно масштабировать.
> Микросервисы: множество сервисов, слабо связанные, развёртываются и масштабируются независимо.

3. Каковы основные преимущества использования микросервисов?

Ответ:

> Лучшая масштабируемость
> Более быстрое выведение продукта на рынок
> Независимые развёртывания
> Лучшая устойчивость к сбоям
> Возможность использовать разные языки и технологии

4. Какие есть сложности при работе с микросервисами?

Ответ:

> Сложность управления распределёнными системами
> Задержки в сети и накладные расходы на коммуникацию
> Согласованность данных
> Отладка и мониторинг
> Развёртывание и оркестрация

5. Как микросервисы обмениваются данными?

Ответ:

> Синхронно: через REST, gRPC
> Асинхронно: через очереди сообщений (RabbitMQ, Kafka)

6. Что такое service discovery в микросервисах?

Ответ:

> Это механизм, с помощью которого сервисы находят друг друга в сети.
> Применяются инструменты вроде Consul, Eureka, DNS Kubernetes.

7. Что такое API Gateway и зачем он нужен?

Ответ:

> API Gateway — это единая точка входа в систему. Он отвечает за маршрутизацию, безопасность, ограничение частоты запросов и агрегацию ответов от разных сервисов.
> Примеры: Kong, Zuul, NGINX, Spring Cloud Gateway.

8. Как в микросервисах управляют данными?

Ответ:

> Каждый сервис использует свою отдельную базу данных (подход “одна база на сервис”).
> Для согласованности применяются событийная архитектура или паттерн саги.

9. Что такое паттерн Saga?

Ответ:

> Saga — это последовательность локальных транзакций.
> Если одна из них завершается с ошибкой, запускаются компенсирующие действия для отката изменений.

10. Какие инструменты используют для разработки микросервисов?

Ответ:

> Языки: Java (Spring Boot), Node.js, Go, Python
> Сборка: Maven, Gradle
> Контейнеризация: Docker
> Оркестрация: Kubernetes


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93
Интересное Java API в разработке: JEP 531, ленивые константы.
Идея проста: отложить инициализацию до первого использования, затем сохранять значение неизменяемым и избежать типичного самописного boilerplate-кода для ленивых полей. Небольшой пример 👇

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
7
Spring Boot: можно включить /actuator/beans, чтобы отлаживать отсутствующие бины.

Обратившись к этому endpoint, вы увидите информацию, например:

- Название бина
- Тип бина
- Scope бина
- Зависимости бина

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

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔17👍3
Java-совет: никогда не возвращайте null вместо коллекций.

Если метод возвращает null, вызывающий код вынужден делать бессмысленные проверки — а это источник багов.

Гораздо лучше всегда возвращать пустую коллекцию:

- Collections.emptyList()
- List.of()
- Set.of()

Тогда вызов становится безопасным, а код — чище.

Пример:

[плохо] (нужно проверять на null):

public List<String> findUsers() {
if (!dataAvailable()) {
return null;
}
return loadUsers();
}


[хорошо] (без лишних проверок):

public List<String> findUsers() {
if (!dataAvailable()) {
return Collections.emptyList();
}
return loadUsers();
}


Теперь вызов можно писать так:

List<String> users = findUsers();
users.forEach(System.out::println); // без null-check


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2
Java: Используйте Comparator.nullsFirst() или Comparator.nullsLast() для безопасной сортировки.

Значения null могут привести к NullPointerException, если ваш компаратор не обрабатывает их явно.

Вот код, представленный на изображении:

Без использования nullsFirst или nullsLast:

public class BadSortingExample {

static class Person {
String name;
Integer age;

Person(String name, Integer age) {
this.name = name;
this.age = age;
}

Integer getAge() {
return age;
}

@Override
public String toString() {
return name + " (" + age + ")";
}
}

public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", null), // null age
new Person("Charlie", 25)
);

// This crashes at runtime
people.sort(Comparator.comparing(Person::getAge));

people.forEach(System.out::println);
}
}


С использованием nullsFirst:

public class GoodSortingExample {

static class Person {
String name;
Integer age;

Person(String name, Integer age) {
this.name = name;
this.age = age;
}

Integer getAge() {
return age;
}

@Override
public String toString() {
return name + " (" + age + ")";
}
}

public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", null), // null age handled safely
new Person("Charlie", 25)
);

// Safe: null ages go FIRST
people.sort(
Comparator.comparing(
Person::getAge,
Comparator.nullsFirst(Integer::compareTo)
)
);

people.forEach(System.out::println);
}
}


В первом примере (BadSortingExample) код вызывает NullPointerException, так как возраст у одного из объектов null, и компаратор не обрабатывает это.

Во втором примере (GoodSortingExample) используется Comparator.nullsFirst(), что позволяет безопасно сортировать объекты, даже если одно из значений для возраста отсутствует.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍2
Бесплатный API для извлечения всей информации по IP-адресу.
Без ограничений и каких-либо платежей.

Работает с Python, Java и любым другим языком.

http://ipquery.io

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Я только что нашел 100% открытый и полностью бесплатный заменитель Postman, который работает прямо в вашем браузере без необходимости установки.

Его название — Hoppscotch.

Без лишнего веса для десктопа. Без $14/месяц с пользователя. Без сбора данных.

HTTP, GraphQL, WebSocket, тестирование в реальном времени, генерация кодовых фрагментов и миграция из Postman в один клик. Включает десктопную версию и CLI.

100% Открытый исходный код. Лицензия MIT.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
3🌚3😁1
Spring Boot: @AutoConfigureMockMvc позволяет тестировать контроллеры без запуска сервера. Он указывает Spring Boot автоматически сконфигурировать экземпляр MockMvc в тестовом контексте.

@SpringBootTest
@AutoConfigureMockMvc
class UserControllerTest {

@Autowired
private MockMvc mockMvc;

@Test
void shouldReturnUser() throws Exception {
mockMvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value(1));
}
}


1. @SpringBootTest загружает полный контекст приложения.
2. @AutoConfigureMockMvc настраивает MockMvc.
3. Нет Tomcat или других встроенных серверов
4. Запросы выполняются через DispatcherServlet Spring внутри приложения

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2
Что такое Records в Java?

Records в Java — это специальный вид классов, введённый в Java 14 (в preview) и финализированный в Java 16, чтобы уменьшить boilerplate-код при создании простых immutable data-классов.

Они отлично подходят для:

- DTO
- моделей запросов/ответов REST API
- value objects (например, координаты, имена и т.д.)

Пример:

record Book(String title, double price) {}

Book book = new Book("Cracking The java Interviews", 429.0);
System.out.println(book); // Book[title= Cracking The java Interviews, price=429.0]


Что Records дают автоматически

Если объявить:

record Person(String name, int age) {}


Java автоматически сгенерирует:

- конструктор
- геттеры (name(), age())
-equals() и hashCode()
- метод toString()

Ограничения Records:

- поля неявно final
- нельзя объявить конструктор без аргументов
- нельзя наследоваться от других классов (record неявно наследует java.lang.Record)
- нельзя изменять поля после создания объекта
- поверхностная неизменяемость: вложенные изменяемые объекты (например, List) всё ещё могут изменяться

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3
Java: Очень интересная библиотека под названием Sift заменяет криптичный, основанный на строках подход движка Java Regex на fluent API.

// ПРИМЕР БАЗОВОГО ИСПОЛЬЗОВАНИЯ: паттерн hexColor ^#[0-9a-fA-F]{6}$

// Вы можете задать вышеуказанный паттерн более выразительным способом,
// используя DSL (domain-specific language) Sift
String hexColor = Sift.fromStart()
.character('#')
.then()
.exactly(6)
.hexDigits()
.andNothingElse()
.shake();

// Если вы используете Maven, чтобы скомпилировать приведённый выше пример,
// достаточно добавить следующую зависимость:

<!-- Core engine — без внешних зависимостей -->
<dependency>
<groupId>com.mirkoddd</groupId>
<artifactId>sift-core</artifactId>
<version>6.4.0</version>
</dependency>


https://github.com/Mirkoddd/Sift

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32
Совет по Java Spring Boot: используйте @Retryable для обработки нестабильных внешних сервисов.

Если API отвечает с ошибками или падает, вам не нужно вручную писать циклы с повторными попытками.

Аннотация @Retryable позволяет:

- автоматически повторять вызовы при возникновении определённых исключений
- управлять количеством попыток
- настраивать задержку и экспоненциальный backoff
- выполнять fallback через @Recover, если всё равно не удалось

Например, на картинке:

- выполняется 3 попытки при указанных исключениях
- стартовая задержка — 2 секунды, далее она удваивается при каждой попытке
- вызывается recover(), если все попытки исчерпаны

Это удобно, читаемо и избавляет от boilerplate-кода при интеграции с внешними API.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53
Честно говоря, это самая точная диаграмма, которую я видел.

Waterfall: планируешь 18 месяцев и в итоге доставляешь именно то, что уже никому не нужно.

Agile: на каждом этапе поставляешь что-то пригодное к использованию, но CEO постоянно спрашивает: «Где машина?»

AI: ты получаешь машину в первый же день. У неё шесть колёс, двери установлены задом наперёд, и есть ракетная установка. Ты тратишь больше времени не на «разработку», а на адаптацию под себя, контроль и валидацию. Это и делают сейчас лучшие AI-разработчики. Они не строят. Они формируют и берут ответственность.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍3
Spring Boot: используйте TaskScheduler для реализации лёгких динамических задач. Для более сложных сценариев стоит рассмотреть Quartz.

Инжектим и используем:

...
@Autowired
TaskScheduler scheduler;

scheduler.schedule(
() -> System.out.println("Hello!"),
new CronTrigger("0 */5 * * * *") // каждые 5 минут
);
...


Внедрённый бин — это ThreadPoolTaskScheduler, встроенная реализация как TaskScheduler, так и ScheduledExecutorService.

При необходимости можно настроить его конфигурацию:

@Configuration
@EnableScheduling
public class SchedulerConfig {

@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(5);
scheduler.setThreadNamePrefix("my-scheduler-");
scheduler.initialize();
return scheduler;
}
}


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Полезняшка: парень сделал небольшой плагин для IntelliJ IDEA для вещи, которая раздражала многих годами:
https://github.com/saket/intellij-comment-continuation

Плагин для IntelliJ IDEA, который продолжает // комментарии на следующей строке при нажатии Enter с сохранением отступа. Повторное нажатие Enter на пустой строке комментария завершает блок комментариев и сохраняет тот же уровень отступа.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥5
Один из самых ценных паттернов в Java на продакшене: неизменяемые DTO с использованием Records + Builder.

В реальных Java-приложениях (Spring Boot API, микросервисы, event-системы) мы создаем сотни DTO.

Лучший современный паттерн в 2026 году:
Records (неизменяемые по умолчанию) + паттерн Builder для гибкой инициализации.

Преимущества:

- Неизменяемость → потокобезопасность и предсказуемость
- Нет boilerplate-кода с геттерами/сеттерами
- Builder дает удобный fluent API для опциональных полей
- Отличная интеграция с Jackson, валидацией и MapStruct

Реалистичный пример из продакшена ниже:

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Продвинутый совет по Spring

Превратите структуру вашего Spring-проекта в тестируемый контракт, который никогда не будет незаметно деградировать.

С помощью Taikai вы можете принудительно проверять архитектурные ограничения с использованием предопределённых правил ArchUnit, см. документацию.

https://github.com/enofex/taikai

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Совет по Java: избегайте накладных расходов на boxing, используя потоки примитивов.

Создание объектов Integer для каждого значения:

Stream<Integer> boxed = Stream.of(1, 2, 3, 4, 5);
int sumBoxed = boxed.reduce(0, Integer::sum);


Работа напрямую с int:

int sumPrimitive = IntStream.of(1, 2, 3, 4, 5).sum();


Другие классы потоков примитивов:

LongStream, DoubleStream


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