Kubernetes и Spring Boot @Service балансировка нагрузки

У меня Kubernetes работает на двух узлах, а одно приложение развернуто на двух узлах (два модуля, по одному на узел).

Это приложение Spring Boot. Он использует OpenFeign для обнаружения сервисов. В приложении у меня определен RestController, у него есть несколько API и @Autowired @Service, который вызывается изнутри API.

Каждый раз, когда я делаю запрос к одному из API, Kubernetes использует какую-то балансировку нагрузки для маршрутизации трафика к одному из модулей, и вызывается RestController приложения. Это нормально, и я хочу, чтобы нагрузка была сбалансирована.

Проблема возникает, когда этот API вызывается, и он вызывает @Autowired @Service. Каким-то образом это тоже балансируется по нагрузке, и вызов @Service может оказаться на другом узле.

Вот и пример:

  • у нас есть два узла: node1, node2
  • мы делаем запрос на IP-адрес node1.
    • это может привести к балансировке нагрузки на node2 (это нормально)
  • node1 получает запрос и вызывает @Autowired @Service
  • вызов переходит на узел 2 (здесь и возникает проблема)

И в коде:
Контроллер:

 @Autowired
 private lateinit var userService: UserService
 @PostMapping("/getUser")
   fun uploadNewPC(@RequestParam("userId") userId: String): User {
       println(System.getEnv("hostIP")) //123.45.67.01
       return userService.getUser(userId)
   }

Обслуживание:

@Service
class UserService {
  fun getUser(userId: String) : User {
   println(System.getEnv("hostIP")) //123.45.67.02
   ...
  }
}

Я хочу, чтобы балансировка нагрузки происходила только для запросов REST, а не для внутренних вызовов приложения его компонентам @Service. Как мне этого добиться? Есть ли какая-либо конфигурация работы компонентов @service Spring Boot в кластерах Kubernetes? Могу я это изменить?

Заранее спасибо.

Изменить:
после некоторой отладки я обнаружил, что это была не служба, которая балансировала нагрузку на другой узел, а исходный HTTP-запрос. Несмотря на то, что запрос специально отправляется на URL-адрес node1... И поскольку я отлаживал оба узла одновременно, я этого не заметил.

1 ответ

Решение

Ну, я не использовал openfeign, но, насколько я понимаю, он действительно может балансировать только запросы REST.

Если я правильно понял ваш вопрос, вы говорите, что когда контроллер REST вызывает компонент службы (в данном случае UserService), выполняется сетевой вызов, а это нежелательно.

В этом случае, я считаю, будут полезны следующие моменты для рассмотрения:

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

  2. Это также не имеет ничего общего с тем фактом, что это приложение работает в среде Kubernetes, опять же, это единственная конфигурация весенней загрузки.

  3. Предполагая, что у вас есть UserServiceинтерфейс, который, очевидно, не имеет никакой логики балансировки нагрузки, весенняя загрузка должна обернуть его в какой-то прокси, который добавляет эти возможности. Поэтому попробуйте отладить запуск приложения, поместите точку останова в метод контроллера и проверьте, какой фактический тип пользовательской службы, опять же, это должен быть какой-то прокси

  4. Если предположение в 3 верно, должен существовать какой-то тип постпроцессора bean (возможно, в файле spring.factories некоторой зависимости), который регистрируется в контексте приложения. Вероятно, если вы создадите какой-нибудь собственный метод, который будет печатать все компоненты (Bean Post Processor также является компонентом), вы увидите подозрительный компонент.

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