在Lagom中创建Application和Loader的目的是什么?

时间:2017-08-07 09:44:36

标签: lagom

我正在阅读关于Lagom的教程。

我理解DI,但该部分还讨论了Application和Loader。我无法理解创建Application和Loader类的目的。到目前为止,我已经能够在不创建Application和loader类的情况下运行基本服务(例如,hello,来自GettingStarted的世界服务)。

1 个答案:

答案 0 :(得分:2)

让我们考虑一个示例ApplicationLoader(这不是唯一的方法,只是为了问题而做一个例子)

abstract class FriendModule (context: LagomApplicationContext)
  extends LagomApplication(context)
    with AhcWSComponents
    with CassandraPersistenceComponents
{

  persistentEntityRegistry.register(wire[FriendEntity])    
  override def jsonSerializerRegistry = FriendSerializerRegistry

  override lazy val lagomServer: LagomServer = serverFor[FriendService](wire[FriendServiceImpl])
}

class FriendApplicationLoader extends LagomApplicationLoader {

  override def load(context: LagomApplicationContext): LagomApplication =
    new FriendModule(context) with ConductRApplicationComponents

  override def loadDevMode(context: LagomApplicationContext): LagomApplication =
    new FriendModule(context) with LagomDevModeComponents

  override def describeService = Some(readDescriptor[FriendService])
}

首先,我们创建一个扩展`LagomApplication的类FriendModule的原因是混合我们所有的依赖项。他们可能是:

  • 如果应用程序依赖于cassandra和persistence api,那么我们就混合它。如果应用程序需要进行HTTP调用,那么我们为它提供WSClient等
  • 我们当然在编译时依赖
  • 通过以下操作,我们将实现与声明的服务绑定

    覆盖lazy val lagomServer:LagomServer = serverForFriendService

但是请注意,我们还没有将我们的微服务与服务定位器结合起来。

服务定位器的作用是提供发现应用程序服务并与之通信的能力。例如:如果应用程序有五个不同的微服务运行,那么每个应用程序都需要知道每个其他地址才能进行通信。 服务定位器负责保存相关微服务的地址信息。如果没有这个服务定位器,我们需要配置每个微服务的URL并使其可用于每个微服务(可能通过属性文件?)。

因此,在类FriendApplicationLoader中,我们将我们的实现与开发案例中的LagomDevModeComponents绑定。 LagomDevModeComponents在注册表中注册我们的服务。这就是神奇的Lagom微服务如何以简单的方式与他人沟通。