2017-07-18 83 views
1

我有我的主要应用程序和管理应用程序构建为微服务,他们通过API进行通信。我想分享这两个应用程序之间的一些常量。如何在Rails微服务之间共享constans?

例如我有用户模型,可以有角色所有者或定期。在管理应用程序中,我可以搜索用户,并且在此搜索中,我使用硬编码的用户类型(所有者,常规)下拉菜单。这是可以的,但是当我改变命名(例如Regular - > Standard)时,我还必须更新我的Admin应用程序。

要避免每次我改变了一些核心的命名在我的主要的应用程序我想以某种方式分享这些常数随时间变化管理应用程序,所以在主应用程序的每一个变化都会在同一时间更改管理员。

现在我发现2个解决方案,都与利弊:

首先从主应用程序通过JSON API发送常量管理。我已经构建了一个类,它将获取所有常量并将其存储在类变量中,所以它可以从应用程序的每个部分获得。这个解决方案的好处是性能(感谢memoization它只有一个API请求),并且以后使用起来很方便。坏事是我不知道如何在这种情况下处理测试。当然,我不能让我的测试向主应用程序发出请求,并且对此请求进行存根使得整个想法变得毫无意义,因为在主应用程序中每次更改常量后,我都需要更改管理应用程序中的测试。

我想到的第二种方法是构建一个将存储所有常量的gem。这很容易实现,但这意味着我需要在每次需要更改主应用程序中的常量时更改此回购。我也和大团队一起工作,他们不会很高兴他们必须同时在2回购工作。

您对这些解决方案有何看法?第一个对我来说似乎是完美的,除了测试,所以也许你有一些想法如何将这些常量存根没有真正的价值?我还没有尝试宝石解决方案,所以如果你看到一些障碍,请让我知道。 也许有更好的解决方案来解决这个问题?

+1

我个人觉得JSON API使用的解决方案是出奇的过度设计。每个人都用宝石实现共享功能。 – mudasobwa

+0

看起来像你想要的东西类似这样的:https:// github。com/spring-cloud/spring-cloud-config一个配置服务器。但我从来没有在Ruby –

+0

中看到过这样的事情,我很好奇为什么你不仅仅拥有一个拥有'name'属性的用户对象,而是拥有一个共享数据库模式。这听起来过于庞大。 – mcfinnigan

回答

1

我不知道是否有可能在自己的服务结构方面更好的解决方案,例如这两个服务的一个人可能返回常数为其他使用API​​。

但是要回答这个问题,你可以使用引擎,或更可能用于简单共享常量,宝石。您可以使用bundle gem <GEM NAME>创建一个新宝石,然后将其添加到这两个应用程序的Gemfile中。

你要么需要有一个宝石服务器(例如,geminabox),或者干脆直接指向你的代码回购,例如

gem 'my-gem', git: '[email protected]:git/my-gem` 

个人来讲我会与API返回的常量去,因为你可能想在这种情况下,共享的宝石掉落另一种语言重写一个服务。

+0

感谢您的回答!我也不太喜欢gem的想法,但我无法找到解决方案,当使用api时,如何将这些常量提供给测试套件。在测试中对它们进行硬编码与在应用程序中的其他任何地方对其进行硬编码相同。 – Ptr

+0

在您的测试中,您可以使用Webmock或MockServer或VCR等模拟Web服务(VCR将调用并缓存来自真实Web服务的响应)。所以使用真实的数据,但是因为它被缓存,所以测试很快。 – Kris

0
  1. 写的宝石,包括它在不同的服务。
  2. 如果他们在同一台机器上运行,另一种可能性是env vars。
  3. 将它保存在DB /存储器中,即memchache/redi。在每个服务init上加载相关的常量。