如何在单独的Spring Boot应用程序中缓存Consul服务查找?



运行我们的spring启动应用程序需要2-3分钟来启动。大部分时间花在通过Spring Cloud Consul Discovery Client连接到不同的服务器上。

我正在寻找一种在单独的应用程序中缓存服务发现的方法,如下图所示:

+----------------------+     +----------------------+                   
|                      |     |                      |                   
|     Target Server    |     |    Consul Server     |                   
|                      |     |                      |                   
+-----------^----------+     +-----------^----------+                   
|(3)                         |(2)                           
|                            |                              
+----------------------+     +----------------------+                   
|                      |(1)  |                      |                   
|     Application      |---> | Consul Client Cache  |                   
|                      |     |                      |                   
+----------------------+     +----------------------+     
  1. 应用程序查询consul客户端缓存而不是consul服务器直接检索目标服务器的网络地址。
  2. Consul Client Cache是一个独立的应用程序,它可以在其中加载和调用缓存在领事服务器中注册的服务的IP地址。
  3. 应用程序连接到目标服务器。

在我的脑海中,我相信这是可能的:

  1. 编写consul客户端缓存的spring引导应用程序,其中缓存在consul服务器中注册的服务,并在请求时将它们提供给应用程序。
  2. 拦截应用程序的HTTP请求并重新路由到consul客户端缓存服务器。

但这似乎是一个普遍的问题,所以我希望已经有一个现成的解决方案。

有人有想法吗?

这里的Spring执行器提供了一个刷新端点,可以在运行时动态地重新加载应用程序属性。

你可以定义一个"ManagedResource"它有一个范围刷新bean。

@Component
@ConfigurationProperties(prefix = "prefix")
@RefreshScope
class DynamicConfiguration { .. }

您不需要拦截任何东西,只需使应用程序仅与Consul服务器通信。然后,领事服务器可以决定是否应该从缓存中获取某个属性。我过去使用Netflix的Eureka来管理多个spring启动应用程序的应用程序属性,但似乎HashiCorp的Consul服务器是Eureka的全功能替代品。

我没有所有的信息。但是consul的服务发现应该很快。

应用程序正在调用领事服务器以获取目标的网络地址。我相信查找将非常快,因为值将缓存在consul中(存储在RAM中)。你查过了吗?否则就违背了执政官的目的。所以写一个单独的领事缓存不会有任何改善。

我认为从consul查找网络地址不是问题。问题应该是在服务启动时与多个目标建立的多个网络连接有关。你对网络延迟进行基准测试了吗?您正在进行的HTTP调用的响应时间?这应该是事情可以改进的地方,特别是如果你的一些目标驻留在VPC之外。连接通过公共互联网。

如果上述情况成立,你目前的改进计划很可能不会奏效。

一些改进方法:

  1. 如果您不需要在启动时连接所有目标服务器,请不要这样做。等你需要的时候再说吧。如果任何类的实例化依赖于它,则惰性加载它。
  2. 假设你需要在启动时进行所有的HTTP调用。你为什么需要这个?我不知道确切的原因。但最有可能的是,你会得到一些动态的设置/配置,你需要初始化这个应用程序的对象。

    然后你需要思考,这些值改变的频率是多少?如果它们不经常更改,则可以将它们缓存一段时间。因此,一旦你获取它,你可以缓存它在现有的领事或你可以使用redis(或任何其他缓存服务器你使用)。所以下次你的服务启动时,它可以直接从缓存服务器读取它们(最好是multi-get,这样只建立一个网络连接)。

    基本上,您需要在应用程序启动时避免那么多HTTP连接。您应该缓存数据。你不需要新的应用程序来做到这一点。那太过分了。

最新更新