在从命令行创建并运行Hello World之后,您无疑会感激Lagom框架为您所做的一切。您无需决定需要什么基础架构,然后安装并配置它。该模板消除了建立项目或构建结构的必要性。当您创建自己的服务时,Lagom会检测更改并执行热加载。Lagom让您专注于满足您的业务需求。

Hello World中的关于关注点分离、服务描述符和注册表的介绍,将帮助您开发自己的微服务:

  • 服务接口
  • 服务实现

    服务接口

    服务接口属于api项目。例如,hello服务的服务接口存在于hello-api项目中(查找HelloService.scala源文件)。 ```scala import akka.Done import akka.NotUsed import com.lightbend.lagom.scaladsl.api. import play.api.libs.json.

trait HelloService extends Service { def hello(id: String): ServiceCall[NotUsed, String]

def useGreeting(id: String): ServiceCall[GreetingMessage, Done]

final override def descriptor = { import Service. named(“hello”) .withCalls( pathCall(“/api/hello/:id”, hello ), pathCall(“/api/hello/:id”, useGreeting _) ) .withAutoAcl(true) } }

case class GreetingMessage(message: String)

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

  1. 注意:
  2. - 服务接口继承自 [**`Service`**](https://www.lagomframework.com/documentation/latest/scala/api/com/lightbend/lagom/scaladsl/api/Service.html) ,并提供了**service .descriptor**方法的实现。
  3. - **Service.descriptor**实现返回一个**`[Descriptor](https://www.lagomframework.com/documentation/latest/scala/api/com/lightbend/lagom/scaladsl/api/Descriptor.html)`**。`HelloService`描述符定义了服务名称和它提供的REST端点。对于每个端点,在服务接口中声明一个抽象方法,如`HelloService`中所示。有关更多信息,请参见服务描述符。
  4. <a name="tsWL2"></a>
  5. # 服务实现
  6. `impl`项目中,`helo-impl`提供了服务抽象方法的实现。例如,HelloServiceImpl.scala源文件包含`HelloService.hello`服务中`hello`方法的服务实现。服务实现使用[**sharded**](https://doc.akka.io/docs/akka/2.6/typed/cluster-sharding.html#introduction)、[**persistent**](https://doc.akka.io/docs/akka/2.6/typed/persistence.html#introduction)、typed actor 提供数据持久化,使用事件溯源和读写分离技术架构。
  7. ```scala
  8. import akka.actor.typed.ActorRef
  9. import akka.actor.typed.Behavior
  10. import com.lightbend.lagom.scaladsl.api.ServiceCall
  11. import akka.cluster.sharding.typed.scaladsl.ClusterSharding
  12. import akka.cluster.sharding.typed.scaladsl.EntityRef
  13. import scala.concurrent.ExecutionContext
  14. import scala.concurrent.duration._
  15. import akka.util.Timeout
  16. import com.lightbend.lagom.scaladsl.api.transport.BadRequest
  17. class HelloServiceImpl(clusterSharding: ClusterSharding)(implicit ec: ExecutionContext) extends HelloService {
  18. implicit val timeout = Timeout(5.seconds)
  19. override def hello(id: String): ServiceCall[NotUsed, String] = ServiceCall { _ =>
  20. entityRef(id)
  21. .ask[Greeting](replyTo => Hello(id, replyTo))
  22. .map(greeting => greeting.message)
  23. }
  24. override def useGreeting(id: String) = ServiceCall { request =>
  25. entityRef(id)
  26. .ask[Confirmation](replyTo => UseGreetingMessage(request.message, replyTo))
  27. .map {
  28. case Accepted => Done
  29. case _ => throw BadRequest("Can't upgrade the greeting message.")
  30. }
  31. }
  32. private def entityRef(id: String): EntityRef[HelloWorldCommand] =
  33. clusterSharding.entityRefFor(HelloWorldState.typeKey, id)
  34. }