Implementing Akka Clusters and Sharding in Lagom

Classified in Computers

Written on in with a size of 2.4 KB

Akka Clusters and Sharding with Lagom

This configuration demonstrates how to set up Akka Clusters and Sharding within a Lagom microservices project using Scala.

SBT Configuration

organization in ThisBuild := "com.example"
version in ThisBuild := "1.0-SNAPSHOT"
scalaVersion in ThisBuild := "2.11.8"

val macwire = "com.softwaremill.macwire" %% "macros" % "2.2.5" % "provided"
val scalaTest = "org.scalatest" %% "scalatest" % "3.0.1" % Test

lazy val `lagom-persistent-entity-demo` = (project in file("."))
  .aggregate(`user-api`, `user-impl`)

lazy val `user-api` = (project in file("user-api"))
  .settings(
    libraryDependencies ++= Seq(
      lagomScaladslApi
    )
  )

lazy val `user-impl` = (project in file("user-impl"))
  .enablePlugins(LagomScala)
  .settings(
    libraryDependencies ++= Seq(
      lagomScaladslPersistenceCassandra,
      lagomScaladslTestKit,
      macwire,
      scalaTest
    )
  )
  .settings(lagomForkedTestSettings: _*)
  .dependsOn(`user-api`)

lagomCassandraEnabled in ThisBuild := false
lagomUnmanagedServices in ThisBuild := Map("cas_native" -> "http://localhost:9042")

User Model API

package com.knoldus.user.api

import play.api.libs.json.{Format, Json}

case class User(id: String, name: String, age: Int)

object User {
  implicit val format: Format[User] = Json.format
}

User Service Descriptor

package com.knoldus.user.api

import akka.NotUsed
import com.lightbend.lagom.scaladsl.api.transport.Method
import com.lightbend.lagom.scaladsl.api.{Descriptor, Service, ServiceCall}

trait UserService extends Service {

  def createUser(id: String, name: String, age: Int): ServiceCall[NotUsed, String]
  def getUserById(id: String): ServiceCall[NotUsed, String]
  def getUserByName(name: String): ServiceCall[NotUsed, String]
  def getUserByNameAndAge(name: String, age: Int): ServiceCall[NotUsed, String]

  override def descriptor: Descriptor = {
    import Service._

    named("user_service")
      .withCalls(
        restCall(Method.POST, "/user/create/:id/:name/:age", createUser _),
        restCall(Method.GET, "/user/details/id/:id", getUserById _),
        restCall(Method.GET, "/user/details/name/:name", getUserByName _),
        restCall(Method.GET, "/user/detailsByNameAndAge/name/:name/age/:age", getUserByNameAndAge _)
      ).withAutoAcl(true)
  }
}

Related entries: