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

我正在阅读以下关于Lagom的教程 .

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

回答(1)

2 years ago

让我们考虑一个示例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等

  • 我们当然在编译时依赖关系

  • 通过以下操作,我们将实现与声明的服务绑定在一起

override lazy val lagomServer:LagomServer = serverForFriendService

但请注意,我们还没有将我们的微服务与 Service Locator 相结合 .

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

所以在类 FriendApplicationLoader 中,我们在开发案例中将我们的实现与 LagomDevModeComponents 绑定在一起 . LagomDevModeComponents 使用注册表注册我们的服务 . 这就是神奇的Lagom微服务如何以简单的方式与他人交流 .