Spring boot Kubernetes和Spring Boot@服务负载平衡
我在两个节点上运行Kubernetes,在两个节点上部署一个应用程序(两个pod,每个节点一个) 这是一个Spring启动应用程序。它使用OpenFeign实现服务的可发现性。在这个应用中,我定义了一个RestController,它有几个api和一个从api内部调用的@Autowired@服务 每当我在其中一个API上执行请求时,Kubernetes就会使用某种负载平衡将流量路由到其中一个POD,并调用apps RestController。这很好,我希望这是负载平衡 一旦调用该API并调用@Autowired@服务,问题就会出现。不知何故,这也实现了负载平衡,对@Service的调用可能会在另一个节点上结束 下面是一些例子:Spring boot Kubernetes和Spring Boot@服务负载平衡,spring-boot,kubernetes,openfeign,Spring Boot,Kubernetes,Openfeign,我在两个节点上运行Kubernetes,在两个节点上部署一个应用程序(两个pod,每个节点一个) 这是一个Spring启动应用程序。它使用OpenFeign实现服务的可发现性。在这个应用中,我定义了一个RestController,它有几个api和一个从api内部调用的@Autowired@服务 每当我在其中一个API上执行请求时,Kubernetes就会使用某种负载平衡将流量路由到其中一个POD,并调用apps RestController。这很好,我希望这是负载平衡 一旦调用该API并调用@
- 我们有两个节点:节点1,节点2
- 我们请求节点1的IP地址。
- 这可能会使node2实现负载平衡(这很好)
- 节点1获取请求并调用@Autowired@服务
- 调用跳转到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。。。由于我同时调试了这两个节点,所以我没有注意到这一点。好吧,我没有使用openfeign,但据我所知,它实际上只能对REST请求进行负载平衡 如果我没有弄错您的问题,您会说当REST控制器调用服务组件(在本例中为UserService)时,会发出网络调用,这是不可取的 在这种情况下,我认为以下几点考虑将是有益的:
UserService
接口,spring boot必须将其包装到某种代理中,以添加这些功能。因此,尝试调试应用程序启动,在控制器方法中放置一个断点,并检查用户服务的实际类型,同样,它必须是某种代理spring引导中的依赖项绑定发生在应用程序启动时。你所说的“呼叫跳转到node2”是什么意思。您是否记录了吊舱内的控制流程,以查看发生了什么。另外,请为您的控制器添加源。是的,绑定在启动时发生。我将节点IP作为环境变量。无论何时调试,我都会在控制器和服务中设置一个断点。控制器中的ip是123.45.67.01,当我到达服务中的断点时,ip是123.45.67.02。因此,控制器代码在node1上执行,服务在node2上执行。这太奇怪了,应该会发生。。。我会在几分钟内给出一个示例代码,也许这个bean在应用程序的init中的某个地方被覆盖了。我会检查一下,调试一下后再给你回复。我发现我把平衡看错了。负载平衡的不是服务,而是初始http请求,因为我正在远程调试这两个节点,所以我没有注意到这一点。我认为请求总是发送到一个节点。事实并非如此。我接受你的回答,因为你给了我一个解决办法。现在我必须看看http请求的负载平衡方式。非常感谢。