Java Разработка | Spring Boot Backend & Architecture. Программирование на Джава для Developer. IT Собеседования, Алгоритмы и Coding задачи. Уроки и курсы для роста в Tech.
@bookjava
Фото 🧩 Микросервисы: Укрощение хаоса (Spring Cloud) Когда у вас один сервис, всё просто. Но когда их становится 10, 20 или 50, возникают вопросы: 1. Как сервису А узнать IP-адрес сервиса Б? (А если он меняется динамически?) 2. Как не писать тонны кода для HTTP-запросов? 3. Как клиенту (фронтенду) обращаться ко всей этой куче сервисов? Для этого есть три главных инструмента. 1️⃣ Eureka: Телефонная книга (Service Discovery) В облаке сервисы постоянно перезапускаются, меняют IP-адреса и порты. Хардкодить http://localhost:8081 в коде - самоубийство. Eureka Server - это реестр. 🔴 Когда сервис (например, OrderService) запускается, он звонит в Eureka: "Привет, я OrderService, мой IP такой-то". 🔴 Когда UserService хочет найти заказы, он спрашивает Eureka: "Где сейчас живет OrderService?". В коде: Вам нужно просто добавить аннотацию @EnableDiscoveryClient, и магия произойдет сама. Сервисы будут находить друг друга по имени, а не по IP. 2️⃣ OpenFeign: Магия общения Окей, адрес мы нашли. Теперь нужно отправить запрос. Раньше мы использовали RestTemplate - это было громоздко и некрасиво. Feign позволяет вызывать удаленный REST-сервис так, будто это обычный метод интерфейса в вашем коде. Было (RestTemplate): String url = "http://order-service/orders/" + userId; List<Order> orders = restTemplate.getForObject(url, List.class); // Фу, нетипизированно Стало (FeignClient): Вы просто пишете интерфейс, а реализацию Spring сгенерирует сам! @FeignClient(name = "order-service") // Имя сервиса в Eureka public interface OrderClient { @GetMapping("/orders/{userId}") List<Order> getUserOrders(@PathVariable Long userId); } // Использование в сервисе: // List<Order> orders = orderClient.getUserOrders(123L); Это называется Декларативный REST-клиент. Чисто, красиво, типизировано. 3️⃣ API Gateway: Единая точка входа Представьте, что у вас 50 микросервисов. Фронтенд не должен знать адреса каждого из них (api.com:8081, api.com:8082...). Это небезопасно и сложно (CORS error, привет 👋). Spring Cloud Gateway - это вахтер на входе. Весь внешний мир стучится только в него (например, на порт 8080), а он уже сам разруливает, куда отправить запрос. Что он делает: 1. Маршрутизация: /users/** -> лети в UserService, /orders/** -> лети в OrderService. 2. Безопасность: Проверяет JWT токен один раз на входе. 3. Rate Limiting: "Не больше 10 запросов в секунду от этого юзера". Пример конфига (application.yaml): spring: cloud: gateway: routes: - id: user-service uri: lb://USER-SERVICE # lb = Load Balancer (через Eureka) predicates: - Path=/users/** ⚡ Итог: Как это работает вместе? 1. Сервисы просыпаются и регистрируются в Eureka. 2. Фронтенд шлет запрос на Gateway. 3. Gateway спрашивает у Eureka адрес нужного сервиса и пересылает запрос. 4. Если сервисам нужно пообщаться между собой, они используют Feign. #Java #Microservices #SpringCloud #Eureka #Feign 👉 @BookJava
Если у вас установлено приложение,
вы можете сразу перейти в канал