我让 Kubernetes 在两个节点上运行,一个应用程序部署在两个节点上(两个 pod,每个节点一个)。
这是一个 Spring Boot 应用程序。它使用 OpenFeign 来实现服务可发现性。在应用程序中,我定义了一个 RestController,它有一些 API 和一个从 API 内部调用的 @Autowired @Service。
每当我对其中一个 API 发出请求时,Kubernetes 都会使用某种负载平衡将流量路由到其中一个 pod,然后调用应用程序 RestController。这很好,我希望这是负载平衡的。
一旦调用该 API 并调用 @Autowired @Service,就会出现问题。不知何故,这也得到了负载平衡,并且对 @Service 的调用可能最终在另一个节点上。
继承人和例子:
- 我们有两个节点:node1,node2
- 我们向 node1 的 IP 地址发出请求。
- 这可能会负载平衡到 node2(这很好)
- node1 获取请求并调用@Autowired @Service
- 调用跳转到 node2(这是问题发生的地方)
在代码中:
控制器:
@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 组件的内部调用。我将如何实现这一目标?Spring Boot 的 @service 组件在 Kubernetes 集群中的运行方式是否有任何配置?我可以改变这个吗?
提前致谢。
编辑:
经过一些调试,我发现负载平衡到另一个节点的不是服务,而是初始http请求。即使请求是专门发送到 node1 的 url ... 由于我同时调试两个节点,我没有注意到这一点。