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), выполняется сетевой вызов, а это нежелательно.
В этом случае, я считаю, будут полезны следующие моменты для рассмотрения:
Загрузка Spring не имеет ничего общего с балансировкой нагрузки на этом уровне по умолчанию, она должна быть как-то настроена в приложении загрузки Spring.
Это также не имеет ничего общего с тем фактом, что это приложение работает в среде Kubernetes, опять же, это единственная конфигурация весенней загрузки.
Предполагая, что у вас есть
UserService
интерфейс, который, очевидно, не имеет никакой логики балансировки нагрузки, весенняя загрузка должна обернуть его в какой-то прокси, который добавляет эти возможности. Поэтому попробуйте отладить запуск приложения, поместите точку останова в метод контроллера и проверьте, какой фактический тип пользовательской службы, опять же, это должен быть какой-то проксиЕсли предположение в 3 верно, должен существовать какой-то тип постпроцессора bean (возможно, в файле spring.factories некоторой зависимости), который регистрируется в контексте приложения. Вероятно, если вы создадите какой-нибудь собственный метод, который будет печатать все компоненты (Bean Post Processor также является компонентом), вы увидите подозрительный компонент.