RU | EN | DE

1. Reactive Programming (Spring WebFlux)

📌 Когда использовать:

  • очень много одновременных соединений (чат, стриминг, IoT),
  • нужен неблокирующий ввод-вывод,
  • API с высокой нагрузкой.

📄 Зависимость:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

📄 Контроллер:

@RestController
@RequestMapping("/api/reactive")
class ReactiveController {
    @GetMapping("/numbers")
    public Flux<Integer> numbers() {
        return Flux.range(1, 5).delayElements(Duration.ofSeconds(1));
    }
    @GetMapping("/user/{id}")
    public Mono<User> getUser(@PathVariable Long id) {
        return Mono.just(new User(id, "Vitaliy"));
    }
}
Mono<T> → один объект (аналог Optional)
Flux<T> → поток объектов (аналог Stream)

2. Messaging (RabbitMQ / Kafka)

RabbitMQ (AMQP)

📄 Зависимость:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

📄 Конфиг:

@Configuration
public class RabbitConfig {
    @Bean
    Queue queue() { return new Queue("demo-queue", false); }
}

📄 Продюсер:

@Service
@RequiredArgsConstructor
public class Producer {
    private final AmqpTemplate template;
    public void send(String msg) {
        template.convertAndSend("demo-queue", msg);
    }
}

📄 Консьюмер:

@Service
public class Consumer {
    @RabbitListener(queues = "demo-queue")
    public void receive(String msg) {
        System.out.println("Received: " + msg);
    }
}

Kafka

📄 Зависимость:

<dependency>
  <groupId>org.springframework.kafka</groupId>
  <artifactId>spring-kafka</artifactId>
</dependency>

📄 Продюсер:

@Service
@RequiredArgsConstructor
public class KafkaProducer {
    private final KafkaTemplate<String, String> template;
    public void send(String msg) {
        template.send("demo-topic", msg);
    }
}

📄 Консьюмер:

@Service
public class KafkaConsumer {
    @KafkaListener(topics = "demo-topic", groupId = "group1")
    public void listen(String msg) {
        System.out.println("Received: " + msg);
    }
}

📌 Kafka → для high-throughput событийных систем.
📌 RabbitMQ → для классического очередного взаимодействия.

3. GraphQL

📌 Используется для более гибких API вместо REST.

📄 Зависимость:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-graphql</artifactId>
</dependency>

📄 Schema (src/main/resources/graphql/schema.graphqls):

type Query {
  user(id: ID!): User
  users: [User]
}
 
type User {
  id: ID!
  name: String
}

📄 Контроллер:

@Controller
public class UserGraphQL {
    @QueryMapping
    public User user(@Argument Long id) {
        return new User(id, "Vitaliy");
    }
    @QueryMapping
    public List<User> users() {
        return List.of(new User(1L, "Ann"), new User(2L, "Bob"));
    }
}

📌 Тестируем через GraphiQL → http://localhost:8080/graphiql.

4. Микросервисы (Spring Cloud)

Компоненты:

  • Spring Cloud Config → конфигурации,
  • Eureka → сервис-дискавери,
  • Spring Cloud Gateway → API-шлюз,
  • Resilience4j → Circuit Breaker,
  • Sleuth + Zipkin → распределённый трейсинг.

Пример: Eureka Server

📄 Зависимость:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

📄 Запуск:

@EnableEurekaServer
@SpringBootApplication
public class EurekaServer {}

Клиент:

@EnableEurekaClient
@SpringBootApplication
public class DemoService {}

5. Keycloak / Auth0 (SSO)

📌 Для единой авторизации (OAuth2 / OpenID Connect).

Keycloak Integration

📄 application.yml:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://localhost:8080/realms/demo

📄 Контроллер:

@RestController
public class SecureController {
    @GetMapping("/secure")
    public String secure(Principal principal) {
        return "Hello, " + principal.getName();
    }
}

📌 Теперь доступ → только с JWT токеном от Keycloak.

6. Event-Driven + Saga Pattern

📌 Для сложных бизнес-транзакций в микросервисах (например, заказ → оплата → доставка). Используются:

  • Kafka/RabbitMQ для событий,
  • Orchestration (Camunda, Temporal),
  • или Choreography (каждый сервис реагирует на события).

7. Best Practices

  • ✅ Если нужна высокая нагрузка → WebFlux.
  • ✅ Если микросервисы → Spring Cloud + Eureka + Gateway.
  • ✅ Для интеграции → Kafka (потоки) или RabbitMQ (очереди).
  • ✅ Для API нового поколения → GraphQL.
  • ✅ Для безопасности в enterprise → Keycloak**/Auth****0**.
  • ✅ Для мониторинга распределённых систем → Sleuth + Zipkin**/Jaeger**.