§Using Akka Discovery
As of version 1.5.1, Lagom has built-in integration with Akka Discovery throught a ServiceLocator that wraps Akka Discovery. This ServiceLocator implementation is called AkkaDiscoveryServiceLocator. This is the recommended implementation for production specially for users targeting Kubernetes and DC/OS (Marathon).
§Dependency
To use this feature add the following in your project’s build:
libraryDependencies += lagomScaladslAkkaDiscovery§Configuration
Once you have it in your project you can add the component to your LagomApplicationLoader.
import com.lightbend.lagom.scaladsl.devmode.LagomDevModeComponents
import com.lightbend.lagom.scaladsl.server._
import com.lightbend.lagom.scaladsl.akka.discovery.AkkaDiscoveryComponents
class HelloApplicationLoader extends LagomApplicationLoader {
  override def load(context: LagomApplicationContext) =
    new HelloApplication(context) with AkkaDiscoveryComponents
  override def loadDevMode(context: LagomApplicationContext) =
    new HelloApplication(context) with LagomDevModeComponents
}By default, Lagom uses Aggregate multiple discovery methods. The first discovery method is set to Configuration and the second is set to DNS. So the static definition of service endpoints has a priority over DNS discovery.
To statically configure service endpoints in your application.conf file consult the Aggregate multiple discovery methods documentation.
§DNS SRV vs. DNS A/AAAA Lookups
AkkaDiscoveryServiceLocator supports DNS SRV as well as DNS A lookups. It defaults to SRV lookups since it’s the most common usage in environments like Kubernetes and DC/OS (Marathon).
Since Lagom’s ServiceLocator API does not support port-name and protocol fields as used in SRV lookups, AkkaDiscoveryServiceLocator will use default values as fallback. The default port-name is http (as defined by setting lagom.akka.discovery.defaults.port-name) and the default protocol is tcp (as defined by setting lagom.akka.discovery.defaults.port-protocol).
Those values are only used if a lookup is done for a string that does not comply with the SRV format. For instance, when looking for another Lagom service using a Lagom service client. In such a case, the lookup is done using the service name, as defined by its ServiceDescriptor, and the defaults for port-name and protocol.
If both lagom.akka.discovery.defaults.port-name and lagom.akka.discovery.defaults.port-protocol are set to null or a blank string, the lookups are done without those values which correspond to simple a DNS A lookup.
§Confinguring Service Mappings
It’s possible to override those values on a per service base using service-name-mappings.
You may map a service name to a SRV string as in:
lagom.akka.discovery {
  service-name-mappings {
    my-service-name {
      # lookup is done using 'my-service-name'
      # but translated to SRV string _http._tcp.default.svc.cluster.local
      lookup = _http._tcp.default.svc.cluster.local
    }
  }
}You can also override the port name and protocol to force a DNS A lookup:
lagom.akka.discovery {
  service-name-mappings {
    # lookup is done using 'my-cassandra-server'
    # but translated to cassandra.default.svc.cluster.local
    # and without port name and protocol, ie: DNS A lookup
    my-cassandra-server {
      lookup = cassandra.default.svc.cluster.local
      port-name = null
      port-protocol = null
    }
  }
}This per service override will allow a DNS A lookup the cassandra server while any other lookups will still use the defaults.
The default settings are in defined in the reference configuration as:
lagom.akka.discovery {
  # When the service lookup regex fails, the defaults are used for the port and protocol.
  defaults {
    # The default port name. Blank if no port name should be added by default.
    port-name = http
    # The default port protocol. Blank if no port protocol should be added by default.
    port-protocol = tcp
    # The default scheme to use in returned URIs if not defined in the port-name-scheme-mappings.
    scheme = http
  }
  # A mapping of service names to lookup information. Each mapping should define the following:
  #
  # - lookup - An alternative name for the service. This can be configured with a simple name or a SRV lookup, for example:
  #   * my-service (simple name)
  #   * my-service.default.svc.cluster.local (simple fully-qualified name)
  #   * _http._tcp.my-service (SRV)
  #   * _http._tcp.my-service.default.svc.cluster.local (fully-qualified SRV)
  # - port-name - The port name to use. If undefined, it will use the default lagom.akka.discovery.defaults.port-name.
  #               Setting to null or empty string will result to a lookup without port-name (eg: DNS A records)
  # - port-protocol - The protocol to use. If undefined, it will use the default lagom.akka.discovery.defaults.port-protocol.
  #               Setting to null or empty string will result to a lookup without protocol (eg: DNS A records)
  # - scheme - The scheme to return in the URI. If undefined, it will use the default scheme lagom.akka.discover.defaults.scheme.
  #
  # For example:
  # service-name-mappings {
  #   my-service-name {
  #     lookup = my-service.default.svc.cluster.local
  #     port-name = http
  #     port-protocol = tcp
  #     scheme = http
  #   }
  # }
  service-name-mappings {
  }
  # The timeout for a successful lookup.
  lookup-timeout = 5 seconds
}Note: this component was previous published as an independent library. If you have it on your classpath it’s recommended to remove it and use the one being provided by Lagom directly.