首页 文章

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

提问于
浏览
1

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

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

1 回答

  • 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等

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

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

    override lazy val lagomServer:LagomServer = serverForFriendService

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

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

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

相关问题