У меня 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. И так как я отлаживал оба узла одновременно, я этого не заметил.