Spring boot Kubernetes和Spring Boot@服务负载平衡

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并调用@

我在两个节点上运行Kubernetes,在两个节点上部署一个应用程序(两个pod,每个节点一个)

这是一个Spring启动应用程序。它使用OpenFeign实现服务的可发现性。在这个应用中,我定义了一个RestController,它有几个api和一个从api内部调用的@Autowired@服务

每当我在其中一个API上执行请求时,Kubernetes就会使用某种负载平衡将流量路由到其中一个POD,并调用apps RestController。这很好,我希望这是负载平衡

一旦调用该API并调用@Autowired@服务,问题就会出现。不知何故,这也实现了负载平衡,对@Service的调用可能会在另一个节点上结束

下面是一些例子:

  • 我们有两个节点:节点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)时,会发出网络调用,这是不可取的

在这种情况下,我认为以下几点考虑将是有益的:

  • SpringBoot与此级别的负载平衡无关默认情况下,它应该在SpringBoot应用程序中进行配置

  • 这也与此应用程序在Kubernetes环境中运行这一事实无关,同样,它只是一个spring引导配置

  • 假设您有一个显然没有任何负载平衡逻辑的
    UserService
    接口,spring boot必须将其包装到某种代理中,以添加这些功能。因此,尝试调试应用程序启动,在控制器方法中放置一个断点,并检查用户服务的实际类型,同样,它必须是某种代理

  • 如果3中的假设是正确的,那么一定有某种bean后处理器(可能在某个依赖项的spring.factories文件中)类在应用程序上下文中注册。如果您创建一些自定义方法来打印所有Bean(Bean后处理器也是Bean),您可能会看到可疑的Bean


  • spring引导中的依赖项绑定发生在应用程序启动时。你所说的“呼叫跳转到node2”是什么意思。您是否记录了吊舱内的控制流程,以查看发生了什么。另外,请为您的控制器添加源。是的,绑定在启动时发生。我将节点IP作为环境变量。无论何时调试,我都会在控制器和服务中设置一个断点。控制器中的ip是123.45.67.01,当我到达服务中的断点时,ip是123.45.67.02。因此,控制器代码在node1上执行,服务在node2上执行。这太奇怪了,应该会发生。。。我会在几分钟内给出一个示例代码,也许这个bean在应用程序的init中的某个地方被覆盖了。我会检查一下,调试一下后再给你回复。我发现我把平衡看错了。负载平衡的不是服务,而是初始http请求,因为我正在远程调试这两个节点,所以我没有注意到这一点。我认为请求总是发送到一个节点。事实并非如此。我接受你的回答,因为你给了我一个解决办法。现在我必须看看http请求的负载平衡方式。非常感谢。