从1.5.1版开始,Lagom通过封装Akka DiscoveryServiceLocator与Akka Discovery进行了内置集成。这个ServiceLocator实现称为AkkaDiscoveryServiceLocator。这是专门针对Kubernetes和DC/OS(Marathon)用户的推荐生产环境实现方式。

依赖

要使用此功能,请在项目的生产环境中添加以下内容:

  1. libraryDependencies += lagomScaladslAkkaDiscovery

配置

一旦你的项目中有了它,你就可以把这个组件添加到你的LagomApplicationLoader中。

  1. import com.lightbend.lagom.scaladsl.devmode.LagomDevModeComponents
  2. import com.lightbend.lagom.scaladsl.server._
  3. import com.lightbend.lagom.scaladsl.akka.discovery.AkkaDiscoveryComponents
  4. class HelloApplicationLoader extends LagomApplicationLoader {
  5. override def load(context: LagomApplicationContext) =
  6. new HelloApplication(context) with AkkaDiscoveryComponents
  7. override def loadDevMode(context: LagomApplicationContext) =
  8. new HelloApplication(context) with LagomDevModeComponents
  9. }

默认情况下,Lagom使用多种聚合发现方法。第一个发现方法设置为配置,第二个设置为DNS。因此,服务端点的静态定义优先于DNS发现。
application.conf中配置静态服务端点信息,参考有关聚合发现方法的文档。

DNS SRV vs. DNS A/AAAA Lookups

AkkaDiscoveryServiceLocator支持DNS SRV和DNS A查找。它默认为SRV查找,因为它是Kubernetes和DC/OS(Marathon)等环境中最常见的用法。
由于Lagom的ServiceLocatorAPI不支持SRV查找中使用的port-nameprotocol,因此AkkaDiscoveryServiceLocator将使用默认值作为备用值。默认的port-namehttp(通过设置lagom.akka.discovery.defaults.port name定义),默认的protocoltcp(通过设置lagom.akka.discovery.defaults.port protocol定义)。
仅当对不符合SRV格式的字符串进行查找时,才会使用这些值。例如,当使用Lagom服务客户端寻找另一个Lagom服务时。在这种情况下,查找是使用服务名称(由其ServiceDescriptor定义)以及port-nameprotocol的默认值来完成的。
如果两个lagom.akka.discovery.defaults.port-namelagom.akka.discovery.defaults.port-protocol 都设置为null或空白字符串,则相当于以简单DNS A查找方式进行查找。

配置服务映射

可以使用service-name-mappings在每个服务基础上覆盖这些值。
您可以将服务名称映射到SRV字符串,如下所示:

  1. lagom.akka.discovery {
  2. service-name-mappings {
  3. my-service-name {
  4. # lookup is done using 'my-service-name'
  5. # but translated to SRV string _http._tcp.default.svc.cluster.local
  6. lookup = _http._tcp.default.svc.cluster.local
  7. }
  8. }
  9. }

您还可以覆盖端口名和协议以强制DNS A进行查找:

  1. lagom.akka.discovery {
  2. service-name-mappings {
  3. # lookup is done using 'my-cassandra-server'
  4. # but translated to cassandra.default.svc.cluster.local
  5. # and without port name and protocol, ie: DNS A lookup
  6. my-cassandra-server {
  7. lookup = cassandra.default.svc.cluster.local
  8. port-name = null
  9. port-protocol = null
  10. }
  11. }
  12. }

每个服务覆盖将允许在cassandra服务器上进行DNS A查找,而任何其他查找仍将使用默认值。
默认设置在参考配置中定义为:

  1. lagom.akka.discovery {
  2. # When the service lookup regex fails, the defaults are used for the port and protocol.
  3. defaults {
  4. # The default port name. Blank if no port name should be added by default.
  5. port-name = http
  6. # The default port protocol. Blank if no port protocol should be added by default.
  7. port-protocol = tcp
  8. # The default scheme to use in returned URIs if not defined in the port-name-scheme-mappings.
  9. scheme = http
  10. }
  11. # A mapping of service names to lookup information. Each mapping should define the following:
  12. #
  13. # - lookup - An alternative name for the service. This can be configured with a simple name or a SRV lookup, for example:
  14. # * my-service (simple name)
  15. # * my-service.default.svc.cluster.local (simple fully-qualified name)
  16. # * _http._tcp.my-service (SRV)
  17. # * _http._tcp.my-service.default.svc.cluster.local (fully-qualified SRV)
  18. # - port-name - The port name to use. If undefined, it will use the default lagom.akka.discovery.defaults.port-name.
  19. # Setting to null or empty string will result to a lookup without port-name (eg: DNS A records)
  20. # - port-protocol - The protocol to use. If undefined, it will use the default lagom.akka.discovery.defaults.port-protocol.
  21. # Setting to null or empty string will result to a lookup without protocol (eg: DNS A records)
  22. # - scheme - The scheme to return in the URI. If undefined, it will use the default scheme lagom.akka.discover.defaults.scheme.
  23. #
  24. # For example:
  25. # service-name-mappings {
  26. # my-service-name {
  27. # lookup = my-service.default.svc.cluster.local
  28. # port-name = http
  29. # port-protocol = tcp
  30. # scheme = http
  31. # }
  32. # }
  33. service-name-mappings {
  34. }
  35. # The timeout for a successful lookup.
  36. lookup-timeout = 5 seconds
  37. }

注:此组件以前作为独立库发布。如果你的类路径上有它,建议删除它,直接使用Lagom提供的。