Kubernetes и Spring Boot @Service балансировка нагрузки - PullRequest
0 голосов
/ 22 октября 2019

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

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

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

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

Вот и пример:

  • у нас есть два узла: узел1, узел2
  • мы делаем запрос на IP-адрес узла 1.
    • это может привести к балансировке нагрузки для узла2 (это нормально)
  • узел1 получает запрос и вызывает @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
   ...
  }
}

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

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

Редактировать:
После некоторой отладки я обнаружил, что балансировкой нагрузки для другого узла была не служба, а первоначальный запрос http,Даже если запрос был специально отправлен на URL-адрес узла 1. И так как я отлаживал оба узла одновременно, я этого не заметил.

1 Ответ

1 голос
/ 22 октября 2019

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

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

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

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

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

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

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

...