Lagom with Scala 해주세요! 【그 2:최소 서비스의 작성】

15505 단어 lagomScala
Gaku입니다.
Lagom with Scala 해주세요! 【그 1:환경 구축】
전회까지로, 환경 구축은 끝났으므로, 이번은 새롭게 서비스를 작성합니다.
제공되고 있는 Hello World는 여러가지 것이 기재되어 있어 이해가 어려웠으므로, 한층 더 코드를 깎아내어, 최저한 움직이는 서비스(Get 메소드로 String를 취득하는 것만)를 만듭니다.

이번에 만든 코드



여기에 있습니다.
htps : // 기주 b. 이 m / 가쿠 3601 / s dy-o m / t Ree / s는 p2

api와 impl 폴더 만들기



PJ 루트에 my-study-lagom-api와 my-study-lagom-impl 폴더를 만듭니다. 이 상태라면 아직 module로 인식되지 않은 상태군요.


모듈 추가



study-lagom/build.sbt를 다음과 같이 수정합니다.

study-lagom/build.sbt
organization in ThisBuild := "com.example"
version in ThisBuild := "1.0-SNAPSHOT"

// the Scala version that will be used for cross-compiled libraries
scalaVersion in ThisBuild := "2.13.0"

val macwire = "com.softwaremill.macwire" %% "macros" % "2.3.3" % "provided"
val scalaTest = "org.scalatest" %% "scalatest" % "3.1.1" % Test

// 追記
lazy val `study-lagom` = (project in file("."))
  .aggregate(`my-study-lagom-api`, `my-study-lagom-impl`, `study-lagom-api`, `study-lagom-impl`, `study-lagom-stream-api`, `study-lagom-stream-impl`)

// 追加
lazy val `my-study-lagom-api` = (project in file("my-study-lagom-api"))
  .settings(
    libraryDependencies ++= Seq(
      lagomScaladslApi
    )
  )

// 追加
lazy val `my-study-lagom-impl` = (project in file("my-study-lagom-impl"))
  .enablePlugins(LagomScala)
  .settings(
    libraryDependencies ++= Seq(
      macwire,
    )
  )
  .dependsOn(`my-study-lagom-api`)

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

lazy val `study-lagom-impl` = (project in file("study-lagom-impl"))
  .enablePlugins(LagomScala)
  .settings(
    libraryDependencies ++= Seq(
      lagomScaladslPersistenceCassandra,
      lagomScaladslKafkaBroker,
      lagomScaladslTestKit,
      macwire,
      scalaTest
    )
  )
  .settings(lagomForkedTestSettings)
  .dependsOn(`study-lagom-api`)

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

lazy val `study-lagom-stream-impl` = (project in file("study-lagom-stream-impl"))
  .enablePlugins(LagomScala)
  .settings(
    libraryDependencies ++= Seq(
      lagomScaladslTestKit,
      macwire,
      scalaTest
    )
  )
  .dependsOn(`study-lagom-stream-api`, `study-lagom-api`)


이제 모듈로 인식되어야합니다.


구현



우선, 이해하고 있는 부분에는 코멘트를 기재했습니다. 이해할 수 없는 곳은 푹신한 코멘트를 기재하고 있습니다만, 스루 주시면 다행입니다. (자신의 각서용으로. 이해할 수 있으면 갱신합니다.

api 구현



다음과 같이 계층 구조를 만들고 서비스 파일을 만듭니다.


그래서 이런 식으로 구현.

MyStudyLagomService.scala
package com.example.mystudylagom.api

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

trait MyStudyLagomService extends Service {

  /**
    * Example: curl http://localhost:9000/api/hello2/Alice
    * id: stringには/api/hello2/:idのidが入ってくる
    * ServiceCall[NotUsed, String]のNotUsed部分にはrequest bodyが、Stringはresponseの肩
    *  今回、request bodyはNotUsedで使わないことを宣言している→つまり取得処理
    *  lagomはServiceCall[NotUsed, String]自動的にGetメソッドと判断する
    */
  def hello(id: String): ServiceCall[NotUsed, String]

  override final def descriptor: Descriptor = {
    import Service._
    named("my-study-lagom")
      .withCalls(
        pathCall("/api/hello2/:id", hello _), // APIルーティングを定義
      )
      .withAutoAcl(true) // これはつけとかないと動かない。
  }
}

ServiceImpl 만들기



계층은 이런 느낌.


에서 MyStudyLagomServiceImpl.scala

MyStudyLagomServiceImpl.scala
package com.example.mystudylagom.impl

import akka.NotUsed
import com.example.mystudylagom.api.MyStudyLagomService
import com.lightbend.lagom.scaladsl.api.ServiceCall

import scala.concurrent.Future

class MyStudyLagomServiceImpl() extends MyStudyLagomService {
  // apiの実装の中身。「_ =>」の_にはpostの場合、request bodyが入ってくるみたい。
  override def hello(id: String): ServiceCall[NotUsed, String] = ServiceCall { _ =>
    // なんでもかんでもFutureで返せばOKっぽい?
    Future.successful("test")
  }
}

이제 시작하면 움직이는 것 같지만 오류가 발생합니다. 살짝 조사한 느낌 DI를 하기 위한 Loader가 필요하다는 것.
이런 식으로 구현

MyStudyLagomLoader.scala
package com.example.mystudylagom.impl

import com.example.mystudylagom.api.MyStudyLagomService
import com.lightbend.lagom.scaladsl.api.ServiceLocator
import com.lightbend.lagom.scaladsl.api.ServiceLocator.NoServiceLocator
import com.lightbend.lagom.scaladsl.server._
import com.lightbend.lagom.scaladsl.devmode.LagomDevModeComponents
import play.api.libs.ws.ahc.AhcWSComponents
import com.softwaremill.macwire._

/*
 * これはDIの仕組みを行うために必要?
 * このfileを作らないと動かない
 * とりあえず、いらないものを削ぎ落として、最低限動くようにしたもの
 * akkaとかcassandraの読み込みもここで行うようなので、また別の機会でほそぼそ試す。
 */
class MyStudyLagomLoader extends LagomApplicationLoader {

  // loadとloadDevModeで、おそらく、本番・開発環境で使う依存を管理する感じかな?
  override def load(context: LagomApplicationContext): LagomApplication =
    new MyStudyLagomApplication(context) {
      override def serviceLocator: ServiceLocator = NoServiceLocator
    }

  // このメソッド、消しても動く?と思って消してみたらエラー出た。
  override def loadDevMode(context: LagomApplicationContext): LagomApplication =
    new MyStudyLagomApplication(context) with LagomDevModeComponents
}

abstract class MyStudyLagomApplication(context: LagomApplicationContext)
  extends LagomApplication(context)
    with AhcWSComponents {

  // こんな感じでバインドするみたい
  override lazy val lagomServer: LagomServer = serverFor[MyStudyLagomService](wire[MyStudyLagomServiceImpl])
}

그리고, 이 Loader를 conf로 지정해 준다.

application.conf
# Loaderの読み込みでこの一行は必要
play.application.loader = com.example.mystudylagom.impl.MyStudyLagomLoader

시작



여기까지 할 수 있으면 기동해 본다. 에서 만든 API에 curl 던지면
gakumbp:study-lagom gaku$ curl http://localhost:9000/api/hello2/Alice
test

뭔가 돌아온다!
그리고 다른 서비스의 study-lagom API에 curl 던지면
gakumbp:study-lagom gaku$ curl http://localhost:9000/api/hello/Alice
Hello, Alice!

이쪽도 뭔가 돌아온다🥳



무려 ~ 쿠. 알고는 오고 있지만, 여기에서 어떻게 서비스간에 제휴하는 것인가, 어떻게 영속화를 할 것인가.
CQRS는 어때? 집계 루트 어떻게 쓰나요?
같은 곳이 산적이므로, 여가 시간에 몰래 가고 싶다.

좋은 웹페이지 즐겨찾기