åæ£ã·ã¹ãã ã®æ§æãæäœããããã®èå³æ·±ãã¡ã«ããºã ã XNUMX ã€èª¬æããããšæããŸãã æ§æã¯ãå®å šãªåã䜿çšããŠã³ã³ãã€ã«èšèª (Scala) ã§çŽæ¥è¡šçŸãããŸãã ãã®æçš¿ã§ã¯ããã®ãããªæ§æã®äŸã瀺ããã³ã³ãã€ã«ãããæ§æãéçºããã»ã¹å šäœã«å®è£ ããããŸããŸãªåŽé¢ã«ã€ããŠèª¬æããŸãã
(
å°å ¥
ä¿¡é Œæ§ã®é«ãåæ£ã·ã¹ãã ãæ§ç¯ãããšããããšã¯ããã¹ãŠã®ããŒããæ£ããæ§æã䜿çšããä»ã®ããŒããšåæããããšãæå³ããŸãã DevOps ãã¯ãããžãŒ (terraformãansible ãªã©) ã¯éåžžãæ§æãã¡ã€ã« (å€ãã®å ŽååããŒãã«åºæ) ãèªåçã«çæããããã«äœ¿çšãããŸãã ãŸãããã¹ãŠã®éä¿¡ããŒããåäžã®ãããã³ã« (åãããŒãžã§ã³ãå«ã) ã䜿çšããŠããããšã確èªããããšèããŠããŸãã ããããªããšãåæ£ã·ã¹ãã ã«éäºææ§ãçµã¿èŸŒãŸããŠããŸããŸãã JVM ã®äžçã§ã¯ããã®èŠä»¶ã® XNUMX ã€ã®çµæãšããŠããããã³ã« ã¡ãã»ãŒãžãå«ãåãããŒãžã§ã³ã®ã©ã€ãã©ãªãã©ãã§ã䜿çšããå¿ èŠããããŸãã
åæ£ã·ã¹ãã ã®ãã¹ãã«ã€ããŠã¯ã©ãã§ãããã? ãã¡ãããçµ±åãã¹ãã«é²ãåã«ããã¹ãŠã®ã³ã³ããŒãã³ãã«åäœãã¹ããããããšãåæãšããŠããŸãã (ãã¹ãçµæãå®è¡æã«æšå®ããã«ã¯ããã¹ã段éãšå®è¡æã«åäžã®ã©ã€ãã©ãªã®ã»ãããæäŸããå¿ èŠããããŸãã)
çµ±åãã¹ãã䜿çšããå Žåãå€ãã®å Žåããã¹ãŠã®ããŒãã®ã©ãã§ãåãã¯ã©ã¹ãã¹ã䜿çšããæ¹ãç°¡åã§ãã å®è¡æã«åãã¯ã©ã¹ãã¹ã䜿çšãããããã«ããã ãã§ãã (ç°ãªãã¯ã©ã¹ãã¹ã䜿çšããŠç°ãªãããŒããå®è¡ããããšã¯å®å šã«å¯èœã§ãããããã«ããå šäœã®æ§æãè€éã«ãªãããããã€ã¡ã³ãããã³çµ±åãã¹ããé£ãããªããŸãã) ãã®èšäºã§ã¯ããã¹ãŠã®ããŒããåãã¯ã©ã¹ãã¹ã䜿çšããããšãåæãšããŠããŸãã
æ§æã¯ã¢ããªã±ãŒã·ã§ã³ãšãšãã«é²åããŸãã ç§ãã¡ã¯ããŒãžã§ã³ã䜿çšããŠãããã°ã©ã é²åã®ããŸããŸãªæ®µéãèå¥ããŸãã æ§æã®ç°ãªãããŒãžã§ã³ãèå¥ããã®ã¯è«ççã ãšæãããŸãã ãããŠãèšå®èªäœãããŒãžã§ã³ç®¡çã·ã¹ãã ã«çœ®ããŸãã éçšç°å¢ã«æ§æã XNUMX ã€ãããªãå Žåã¯ãåçŽã«ããŒãžã§ã³çªå·ã䜿çšã§ããŸãã å€ãã®å®çšŒåã€ã³ã¹ã¿ã³ã¹ã䜿çšããå Žåã¯ãããã€ãã®ã€ã³ã¹ã¿ã³ã¹ãå¿
èŠã«ãªããŸãã
æ§æãã©ã³ããšãããŒãžã§ã³ã«å ããŠè¿œå ã®ã©ãã« (ãã©ã³ãã®ååãªã©)ã ãã®ããã«ããŠãæ£ç¢ºãªæ§æãæ確ã«èå¥ã§ããŸãã åæ§æèå¥åã¯ãåæ£ããŒããããŒããå€éšãªãœãŒã¹ãããã³ã©ã€ãã©ãªã®ããŒãžã§ã³ã®ç¹å®ã®çµã¿åããã«äžæã«å¯Ÿå¿ããŸãã ãã®èšäºã§ã¯ããã©ã³ãã 1.2.3 ã€ã ãããããããã§åºåããã XNUMX ã€ã®æ°å (XNUMX) ã䜿çšããŠéåžžã®æ¹æ³ã§æ§æãèå¥ã§ãããšä»®å®ããŸãã
æè¿ã®ç°å¢ã§ã¯ãæ§æãã¡ã€ã«ãæåã§äœæãããããšã¯ã»ãšãã©ãããŸããã å€ãã®å Žåããããã¯ãããã€ã¡ã³ãäžã«çæããããã®åŸã¯è§ŠããããªããªããŸã (ãã®ããã
ãã®æçš¿ã§ã¯ãã³ã³ãã€ã«ãããã¢ãŒãã£ãã¡ã¯ãå ã®æ§æãè¡šããšããã¢ã€ãã¢ãæ€èšããŸãã
ã³ã³ãã€ã«ãããæ§æ
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãéçã«ã³ã³ãã€ã«ãããæ§æã®äŸã瀺ããŸãã ãšã³ãŒ ãµãŒãã¹ãšãšã³ãŒ ãµãŒãã¹ ã¯ã©ã€ã¢ã³ããšãã XNUMX ã€ã®åçŽãªãµãŒãã¹ãå®è£ ãããŠããŸãã ãããXNUMXã€ã®ãµãŒãã¹ãããŒã¹ã«ãXNUMXã€ã®ã·ã¹ãã ãªãã·ã§ã³ãçµã¿ç«ãŠãŸãã XNUMX ã€ã®ãªãã·ã§ã³ã§ã¯ãäž¡æ¹ã®ãµãŒãã¹ãåãããŒãã«é 眮ãããå¥ã®ãªãã·ã§ã³ã§ã¯ãç°ãªãããŒãã«é 眮ãããŸãã
éåžžãåæ£ã·ã¹ãã ã«ã¯è€æ°ã®ããŒããå«ãŸããŸãã äœããã®ã¿ã€ãã®å€ã䜿çšããŠããŒããèå¥ã§ããŸã NodeId
:
sealed trait NodeId
case object Backend extends NodeId
case object Frontend extends NodeId
ãŸãã¯
case class NodeId(hostName: String)
ãããã¯
object Singleton
type NodeId = Singleton.type
ããŒãã¯ããŸããŸãªåœ¹å²ãæããããµãŒãã¹ãå®è¡ããããŒãé㧠TCP/HTTP æ¥ç¶ã確ç«ã§ããŸãã
TCP æ¥ç¶ãèšè¿°ããã«ã¯ãå°ãªããšãããŒãçªå·ãå¿ èŠã§ãã ãŸãããã®ããŒãã§ãµããŒããããŠãããããã³ã«ãåæ ããŠãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ãåããããã³ã«ã䜿çšããŠããããšã確èªããããšèããŠããŸãã 次ã®ã¯ã©ã¹ã䜿çšããŠæ¥ç¶ãèšè¿°ããŸãã
case class TcpEndPoint[Protocol](node: NodeId, port: Port[Protocol])
ã©ã Port
- åãªãæŽæ° Int
蚱容å€ã®ç¯å²ã瀺ããŸãã
type PortNumber = Refined[Int, Closed[_0, W.`65535`.T]]
æŽç·Žãããã¿ã€ã
å³æžé€šãèŠã
HTTP (REST) ãããã³ã«ã®å ŽåãããŒãçªå·ã«å ããŠããµãŒãã¹ãžã®ãã¹ãå¿ èŠã«ãªãå ŽåããããŸãã
type UrlPathPrefix = Refined[String, MatchesRegex[W.`"[a-zA-Z_0-9/]*"`.T]]
case class PortWithPrefix[Protocol](portNumber: PortNumber, pathPrefix: UrlPathPrefix)
ãã¡ã³ãã ã®çš®é¡
ã³ã³ãã€ã«æã«ãããã³ã«ãèå¥ããã«ã¯ãã¯ã©ã¹å ã§äœ¿çšãããªãåãã©ã¡ãŒã¿ãŒã䜿çšããŸãã ãã®æ±ºå®ã¯ãå®è¡æã«ãããã³ã« ã€ã³ã¹ã¿ã³ã¹ã䜿çšããªããšããäºå®ã«ãããã®ã§ãããã³ã³ãã€ã©ãŒã«ãããã³ã«ã®äºææ§ããã§ãã¯ããŠããããããšèããŠããŸãã ãããã³ã«ãæå®ããããšã§ãäžé©åãªãµãŒãã¹ãäŸåé¢ä¿ãšããŠæž¡ãããšãã§ããªããªããŸãã
äžè¬çãªãããã³ã«ã® XNUMX ã€ã¯ãJson ã·ãªã¢ã«åã䜿çšãã REST API ã§ãã
sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]
ã©ã RequestMessage
- ãªã¯ãšã¹ãã®çš®é¡ã ResponseMessage
â å¿çã¿ã€ãã
ãã¡ãããå¿
èŠãªèšè¿°ã®æ£ç¢ºããæäŸããä»ã®ãããã³ã«èšè¿°ã䜿çšããããšãã§ããŸãã
ãã®æçš¿ã§ã¯ããããã³ã«ã®ç°¡ç¥åãããããŒãžã§ã³ã䜿çšããŸãã
sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]
ããã§ããªã¯ãšã¹ã㯠URL ã«è¿œå ãããæååã§ãããã¬ã¹ãã³ã¹ã¯ HTTP ã¬ã¹ãã³ã¹ã®æ¬æã§è¿ãããæååã§ãã
ãµãŒãã¹æ§æã¯ããµãŒãã¹åãããŒããäŸåé¢ä¿ã«ãã£ãŠèšè¿°ãããŸãã ãããã®èŠçŽ ã¯ãScala ã§ã¯ããã€ãã®æ¹æ³ã§è¡šçŸã§ããŸã (ããšãã°ã HList
-sã代æ°ããŒã¿å)ã ãã®æçš¿ã§ã¯ãCake ãã¿ãŒã³ã䜿çšããã¢ãžã¥ãŒã«ã次ã®ããã«è¡šããŸãã trait
'ovã (Cake ãã¿ãŒã³ã¯ããã®ã¢ãããŒãã®å¿
é èŠçŽ ã§ã¯ãããŸãããããã¯ãåã«å¯èœãªå®è£
ã® XNUMX ã€ã§ãã)
ãµãŒãã¹éã®äŸåé¢ä¿ã¯ãããŒããè¿ãã¡ãœãããšããŠè¡šçŸã§ããŸãã EndPoint
ä»ã®ããŒãã® :
type EchoProtocol[A] = SimpleHttpGetRest[A, A]
trait EchoConfig[A] extends ServiceConfig {
def portNumber: PortNumber = 8081
def echoPort: PortWithPrefix[EchoProtocol[A]] = PortWithPrefix[EchoProtocol[A]](portNumber, "echo")
def echoService: HttpSimpleGetEndPoint[NodeId, EchoProtocol[A]] = providedSimpleService(echoPort)
}
ãšã³ãŒ ãµãŒãã¹ãäœæããããã«å¿ èŠãªã®ã¯ãããŒãçªå·ãšãããŒãããšã³ãŒ ãããã³ã«ããµããŒãããŠããããšã瀺ãããšã ãã§ãã ç¹å®ã®ããŒããæå®ããªãå ŽåããããŸããçç±ã¯æ¬¡ã®ãšããã§ãã ç¹æ§ã䜿çšãããšãå®è£ ããã«ã¡ãœããã宣èšã§ããŸã (æœè±¡ã¡ãœãã)ã ãã®å Žåãå ·äœçãªæ§æãäœæãããšãã«ãã³ã³ãã€ã©ãŒã¯æœè±¡ã¡ãœããã®å®è£ ãšããŒãçªå·ãæäŸããããšãèŠæ±ããŸãã ãã®ã¡ãœãããå®è£ ããŠãããããç¹å®ã®æ§æãäœæãããšãã«ãå¥ã®ããŒããæå®ã§ããªãå ŽåããããŸãã ããã©ã«ãå€ã䜿çšãããŸãã
ã¯ã©ã€ã¢ã³ãèšå®ã§ã¯ããšã³ãŒ ãµãŒãã¹ãžã®äŸåé¢ä¿ã宣èšããŸãã
trait EchoClientConfig[A] {
def testMessage: String = "test"
def pollInterval: FiniteDuration
def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
}
äŸåé¢ä¿ã¯ãšã¯ã¹ããŒãããããµãŒãã¹ãšåãã¿ã€ãã§ã echoService
ã ç¹ã«ããšã³ãŒ ã¯ã©ã€ã¢ã³ãã§ã¯åããããã³ã«ãå¿
èŠã§ãã ãããã£ãŠãXNUMX ã€ã®ãµãŒãã¹ãæ¥ç¶ããå Žåããã¹ãŠãæ£ããåäœããããšã確èªã§ããŸãã
ãµãŒãã¹ã®å®æœ
ãµãŒãã¹ãéå§ããã³åæ¢ããã«ã¯é¢æ°ãå¿
èŠã§ãã (ãµãŒãã¹ãåæ¢ããæ©èœã¯ãã¹ãã«ã¯éèŠã§ãã) ç¹°ãè¿ããŸããããã®ãããªæ©èœãå®è£
ããã«ã¯ããã€ãã®ãªãã·ã§ã³ããããŸã (ããšãã°ãæ§æã¿ã€ãã«åºã¥ããŠã¿ã€ã ã¯ã©ã¹ã䜿çšã§ããŸã)ã ãã®æçš¿ã§ã¯ãCake ãã¿ãŒã³ã䜿çšããŸãã ã¯ã©ã¹ã䜿çšããŠãµãŒãã¹ãè¡šçŸããŸã cats.Resource
ã ãªããªããã®ã¯ã©ã¹ã¯ãåé¡ãçºçããå Žåã«ãªãœãŒã¹ã®è§£æŸãå®å
šã«ä¿èšŒããæ段ããã§ã«æäŸããŠããŸãã ãªãœãŒã¹ãååŸããã«ã¯ãæ§æãšæ¢è£œã®ã©ã³ã¿ã€ã ã³ã³ããã¹ããæäŸããå¿
èŠããããŸãã ãµãŒãã¹èµ·åé¢æ°ã¯æ¬¡ã®ããã«ãªããŸãã
type ResourceReader[F[_], Config, A] = Reader[Config, Resource[F, A]]
trait ServiceImpl[F[_]] {
type Config
def resource(
implicit
resolver: AddressResolver[F],
timer: Timer[F],
contextShift: ContextShift[F],
ec: ExecutionContext,
applicative: Applicative[F]
): ResourceReader[F, Config, Unit]
}
ã©ã
Config
â ãã®ãµãŒãã¹ã®æ§æã¿ã€ãAddressResolver
â ä»ã®ããŒãã®ã¢ãã¬ã¹ãèŠã€ããããšãã§ããã©ã³ã¿ã€ã ãªããžã§ã¯ã (以äžãåç §)
ããã³ã©ã€ãã©ãªã®ä»ã®ã¿ã€ã cats
:
F[_]
â ãšãã§ã¯ãã®ã¿ã€ã (æãåçŽãªã±ãŒã¹ã®å Žå)F[A]
ãã ã®é¢æ°ãããããªã() => A
ã ãã®æçš¿ã§ã¯äœ¿çšããŸãcats.IO
.)Reader[A,B]
- é¢æ°ãšã»ãŒå矩A => B
cats.Resource
- ååŸããã³è§£æŸã§ãããªãœãŒã¹Timer
â ã¿ã€ã㌠(ãã°ããç ãã«èœã¡ãæéééã枬å®ã§ããŸã)ContextShift
- ã¢ããã°ExecutionContext
Applicative
â åã ã®å¹æ (ã»ãŒã¢ãã) ãçµã¿åãããããšãã§ããå¹æã¿ã€ãã®ã¯ã©ã¹ã ããè€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ã䜿çšããæ¹ãè¯ãããã§ãMonad
/ConcurrentEffect
.
ãã®é¢æ°ã·ã°ããã£ã䜿çšãããšãããã€ãã®ãµãŒãã¹ãå®è£ ã§ããŸãã ããšãã°ãäœãè¡ããªããµãŒãã¹:
trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
type Config <: Any
def resource(...): ResourceReader[F, Config, Unit] =
Reader(_ => Resource.pure[F, Unit](()))
}
ïŒCmã
О
ããŒãã¯ãããã€ãã®ãµãŒãã¹ãèµ·åã§ãããªããžã§ã¯ãã§ã (ãªãœãŒã¹ã®ãã§ãŒã³ã®èµ·å㯠Cake ãã¿ãŒã³ã«ãã£ãŠä¿èšŒãããŸã)ã
object SingleNodeImpl extends ZeroServiceImpl[IO]
with EchoServiceService
with EchoClientService
with FiniteDurationLifecycleServiceImpl
{
type Config = EchoConfig[String] with EchoClientConfig[String] with FiniteDurationLifecycleConfig
}
ãã®ããŒãã«å¿ èŠãªæ§æã®æ£ç¢ºãªã¿ã€ããæå®ããŠããããšã«æ³šæããŠãã ããã ç¹å®ã®ãµãŒãã¹ã«å¿ èŠãªæ§æã¿ã€ãã® XNUMX ã€ãæå®ããã®ãå¿ããå Žåãã³ã³ãã€ã« ãšã©ãŒãçºçããŸãã ãŸããå¿ èŠãªããŒã¿ããã¹ãŠåããé©åãªã¿ã€ãã®ãªããžã§ã¯ããæäŸããªãéããããŒããéå§ããããšã¯ã§ããŸããã
ãã¹ãå解決
ãªã¢ãŒã ãã¹ãã«æ¥ç¶ããã«ã¯ãå®éã® IP ã¢ãã¬ã¹ãå¿ èŠã§ãã ã¢ãã¬ã¹ãæ§æã®æ®ãã®éšåãããåŸã§å€æããå¯èœæ§ããããŸãã ãããã£ãŠãããŒã ID ãã¢ãã¬ã¹ã«ãããããé¢æ°ãå¿ èŠã§ãã
case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}
ãã®é¢æ°ãå®è£ ããã«ã¯ããã€ãã®æ¹æ³ããããŸãã
- ãããã€ã¡ã³ãåã«ã¢ãã¬ã¹ãããã£ãå Žåã¯ã次ã®ã³ãŒãã䜿çšã㊠Scala ã³ãŒããçæã§ããŸãã
ã¢ãã¬ã¹ãæå®ããŠãã«ããå®è¡ããŸãã ããã«ããããã¹ããã³ã³ãã€ã«ãããŠå®è¡ãããŸãã
ãã®å Žåãé¢æ°ã¯éçã«èªèããããããã³ã°ãšããŠã³ãŒãã§è¡šçŸã§ããŸããMap[NodeId, NodeAddress]
. - å Žåã«ãã£ãŠã¯ãå®éã®ã¢ãã¬ã¹ã¯ããŒããèµ·åããåŸã§ããåãããªãããšããããŸãã
ãã®å Žåãä»ã®ããŒããããåã«å®è¡ããããæ€åºãµãŒãã¹ããå®è£ ããããšãã§ãããã¹ãŠã®ããŒãããã®ãµãŒãã¹ã«ç»é²ããŠä»ã®ããŒãã®ã¢ãã¬ã¹ãèŠæ±ããŸãã - ä¿®æ£ã§ããã°
/etc/hosts
ããã®åŸãäºåå®çŸ©ããããã¹ãåã䜿çšã§ããŸãïŒããšãã°ãmy-project-main-node
Оecho-backend
ïŒãããã®ååããªã³ã¯ããã ãã§ã
å°å ¥æã« IP ã¢ãã¬ã¹ã䜿çšããŸãã
ãã®æçš¿ã§ã¯ããããã®ã±ãŒã¹ã«ã€ããŠã¯è©³ããæ€èšããŸããã ç§ãã¡ã®ããã«
ããã¡ãã®äŸã§ã¯ããã¹ãŠã®ããŒããåã IP ã¢ãã¬ã¹ãæã€ããšã«ãªããŸãã 127.0.0.1
.
次ã«ãåæ£ã·ã¹ãã ã® XNUMX ã€ã®ãªãã·ã§ã³ãæ€èšããŸãã
- ãã¹ãŠã®ãµãŒãã¹ã XNUMX ã€ã®ããŒãã«é 眮ããŸãã
- ãŸãããšã³ãŒ ãµãŒãã¹ãšãšã³ãŒ ã¯ã©ã€ã¢ã³ããå¥ã®ããŒãã§ãã¹ãããŸãã
ã®èšå®
ã·ã³ã°ã«ããŒãæ§æ
object SingleNodeConfig extends EchoConfig[String]
with EchoClientConfig[String] with FiniteDurationLifecycleConfig
{
case object Singleton // identifier of the single node
// configuration of server
type NodeId = Singleton.type
def nodeId = Singleton
/** Type safe service port specification. */
override def portNumber: PortNumber = 8088
// configuration of client
/** We'll use the service provided by the same host. */
def echoServiceDependency = echoService
override def testMessage: UrlPathElement = "hello"
def pollInterval: FiniteDuration = 1.second
// lifecycle controller configuration
def lifetime: FiniteDuration = 10500.milliseconds // additional 0.5 seconds so that there are 10 requests, not 9.
}
ãªããžã§ã¯ãã¯ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã®æ§æãå®è£
ããŸãã æå¹æéèšå®ã䜿çšããããããééãçµéãããšã lifetime
ããã°ã©ã ãçµäºããŸãã (Ctrl-C ãæŒããŠãæ©èœãããã¹ãŠã®ãªãœãŒã¹ãæ£ãã解æŸãããŸãã)
åãæ§æããã³å®è£
ç¹æ§ã®ã»ããã䜿çšããŠã以äžããæ§æãããã·ã¹ãã ãäœæã§ããŸãã
XNUMXããŒãæ§æ
object NodeServerConfig extends EchoConfig[String] with SigTermLifecycleConfig
{
type NodeId = NodeIdImpl
def nodeId = NodeServer
override def portNumber: PortNumber = 8080
}
object NodeClientConfig extends EchoClientConfig[String] with FiniteDurationLifecycleConfig
{
// NB! dependency specification
def echoServiceDependency = NodeServerConfig.echoService
def pollInterval: FiniteDuration = 1.second
def lifetime: FiniteDuration = 10500.milliseconds // additional 0.5 seconds so that there are 10 request, not 9.
def testMessage: String = "dolly"
}
éèŠïŒ ãµãŒãã¹ãã©ã®ããã«ãªã³ã¯ãããŠãããã«æ³šç®ããŠãã ããã ããããŒãã«ãã£ãŠå®è£ ããããµãŒãã¹ããå¥ã®ããŒãã®äŸåé¢ä¿ã¡ãœããã®å®è£ ãšããŠæå®ããŸãã äŸåé¢ä¿ã®çš®é¡ã¯ã³ã³ãã€ã©ã«ãã£ãŠãã§ãã¯ãããŸãã ãããã³ã«ã®çš®é¡ãå«ãŸããŸãã å®è¡ãããšãäŸåé¢ä¿ã«ã¯æ£ããã¿ãŒã²ãã ããŒã ID ãå«ãŸããŸãã ãã®ã¹ããŒã ã®ãããã§ãããŒãçªå·ã XNUMX åã ãæå®ããã ãã§ãåžžã«æ£ããããŒããåç §ããããšãä¿èšŒãããŸãã
XNUMXã€ã®ã·ã¹ãã ããŒãã®å®è£
ãã®æ§æã§ã¯ãåããµãŒãã¹å®è£ ãå€æŽããã«äœ¿çšããŸãã å¯äžã®éãã¯ãç°ãªããµãŒãã¹ã®ã»ãããå®è£ ãã XNUMX ã€ã®ãªããžã§ã¯ããããããšã§ãã
object TwoJvmNodeServerImpl extends ZeroServiceImpl[IO] with EchoServiceService with SigIntLifecycleServiceImpl {
type Config = EchoConfig[String] with SigTermLifecycleConfig
}
object TwoJvmNodeClientImpl extends ZeroServiceImpl[IO] with EchoClientService with FiniteDurationLifecycleServiceImpl {
type Config = EchoClientConfig[String] with FiniteDurationLifecycleConfig
}
æåã®ããŒãã¯ãµãŒããŒãå®è£
ããŠããããµãŒããŒã®æ§æã®ã¿ãå¿
èŠã§ãã XNUMX çªç®ã®ããŒãã¯ã¯ã©ã€ã¢ã³ããå®è£
ããæ§æã®å¥ã®éšåã䜿çšããŸãã ãŸããäž¡æ¹ã®ããŒãã§ã©ã€ãã¿ã€ã 管çãå¿
èŠã§ãã ãµãŒããŒããŒãã¯åæ¢ãããŸã§ç¡æéã«å®è¡ãããŸãã SIGTERM
ããããã°ãããããšã¯ã©ã€ã¢ã³ã ããŒããçµäºããŸãã Cmã
äžè¬çãªéçºããã»ã¹
ãã®æ§æã¢ãããŒããéçºããã»ã¹å šäœã«ã©ã®ãããªåœ±é¿ãäžããããèŠãŠã¿ãŸãããã
æ§æã¯æ®ãã®ã³ãŒããšãšãã«ã³ã³ãã€ã«ãããã¢ãŒãã£ãã¡ã¯ã (.jar) ãçæãããŸãã æ§æãå¥ã®ã¢ãŒãã£ãã¡ã¯ãã«çœ®ãã®ãçã«ããªã£ãŠããããã§ãã ããã¯ãåãã³ãŒãã«åºã¥ããŠè€æ°ã®æ§æã䜿çšã§ããããã§ãã ããã§ããããŸããŸãªæ§æãã©ã³ãã«å¯Ÿå¿ããã¢ãŒãã£ãã¡ã¯ããçæããããšãå¯èœã§ãã ã©ã€ãã©ãªã®ç¹å®ã®ããŒãžã§ã³ãžã®äŸåé¢ä¿ã¯æ§æãšãšãã«ä¿åããããã®ããŒãžã§ã³ã®æ§æã®ãããã€ã決å®ãããã³ã«ããããã®ããŒãžã§ã³ã¯æ°žä¹ ã«ä¿åãããŸãã
æ§æã®å€æŽã¯ã³ãŒãã®å€æŽã«å€ãããŸãã ãããã£ãŠããããã
ãã®å€æŽã¯éåžžã®å質ä¿èšŒããã»ã¹ã§ã«ããŒãããŸãã
ãã°ãã©ãã«ãŒã®ãã±ãã -> PR -> ã¬ãã¥ãŒ -> é¢é£ãã©ã³ããšããŒãž ->
çµ±å -> å°å
¥
ã³ã³ãã€ã«ãããæ§æãå®è£ ãããšãäž»ã«æ¬¡ã®ãããªçµæãçããŸãã
-
æ§æã¯ãåæ£ã·ã¹ãã ã®ãã¹ãŠã®ããŒãã«ããã£ãŠäžè²«æ§ããããŸãã ãã¹ãŠã®ããŒããåäžã®ãœãŒã¹ããåãæ§æãåä¿¡ããããã§ãã
-
XNUMX ã€ã®ããŒãã®ã¿ã§æ§æãå€æŽããã®ã¯åé¡ããããŸãã ãããã£ãŠããæ§æã®ããªããããçºçããå¯èœæ§ã¯ã»ãšãã©ãããŸããã
-
æ§æã«å°ããªå€æŽãå ããããšãããå°é£ã«ãªããŸãã
-
ã»ãšãã©ã®æ§æå€æŽã¯éçºããã»ã¹å šäœã®äžéšãšããŠçºçããã¬ãã¥ãŒã®å¯Ÿè±¡ãšãªããŸãã
éçšç°å¢èšå®ãä¿åããã«ã¯å¥ã®ãªããžããªãå¿ èŠã§ãã? ãã®èšå®ã«ã¯ãã¢ã¯ã»ã¹ãå¶éããããã¹ã¯ãŒãããã®ä»ã®æ©å¯æ å ±ãå«ãŸããå ŽåããããŸãã ããã«åºã¥ããŠãæçµæ§æãå¥ã®ãªããžããªã«ä¿åããããšãåççã§ãããšæãããŸãã æ§æã XNUMX ã€ã®éšåã«åå²ã§ããŸããXNUMX ã€ã¯ãããªãã¯ã«ã¢ã¯ã»ã¹å¯èœãªæ§æèšå®ãå«ã¿ããã XNUMX ã€ã¯å¶éãããèšå®ãå«ã¿ãŸãã ããã«ãããã»ãšãã©ã®éçºè ãå ±éã®èšå®ã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸãã ãã®åé¢ã¯ãããã©ã«ãå€ãå«ãäžéç¹æ§ã䜿çšããããšã§ç°¡åã«å®çŸã§ããŸãã
å¯èœãªããªãšãŒã·ã§ã³
ã³ã³ãã€ã«ãããæ§æãããã€ãã®äžè¬çãªä»£æ¿æ§æãšæ¯èŒããŠã¿ãŸãããã
- ã¿ãŒã²ãã ãã·ã³äžã®ããã¹ã ãã¡ã€ã«ã
- äžå
åãããããŒãšå€ã®ã¹ã㢠(
etcd
/zookeeper
). - ããã»ã¹ãåèµ·åããã«åæ§æ/åèµ·åã§ããããã»ã¹ ã³ã³ããŒãã³ãã
- ã¢ãŒãã£ãã¡ã¯ããšããŒãžã§ã³ç®¡çã®å€éšã«æ§æãä¿åããŸãã
ããã¹ã ãã¡ã€ã«ã¯ãå°ããªå€æŽã«é¢ããŠå€§ããªæè»æ§ãæäŸããŸãã ã·ã¹ãã 管çè ã¯ãªã¢ãŒã ããŒãã«ãã°ã€ã³ããé©åãªãã¡ã€ã«ã«å€æŽãå ããŠãµãŒãã¹ãåèµ·åã§ããŸãã ãã ãã倧èŠæš¡ã·ã¹ãã ã®å Žåããã®ãããªæè»æ§ã¯æãŸãããªãå ŽåããããŸãã å ããããå€æŽã¯ä»ã®ã·ã¹ãã ã«çè·¡ãæ®ããŸããã 誰ãå€æŽãã¬ãã¥ãŒããŸããã æ£ç¢ºã«èª°ãã©ã®ãããªçç±ã§å€æŽãè¡ã£ãã®ããå€æããããšã¯å°é£ã§ãã å€æŽã¯ãã¹ããããŸããã ã·ã¹ãã ãåæ£ãããŠããå Žåã管çè ã¯ä»ã®ããŒãã«å¯Ÿå¿ããå€æŽãå ããã®ãå¿ããå¯èœæ§ããããŸãã
(ã³ã³ãã€ã«ãããæ§æã䜿çšããŠããå°æ¥çã«ããã¹ã ãã¡ã€ã«ã䜿çšã§ããå¯èœæ§ããªããªãããã§ã¯ãªãããšã«ã泚æããŠãã ãããåºåãšåãåãçæããããŒãµãŒãšããªããŒã¿ãŒãè¿œå ããã ãã§ååã§ãã Config
ãããã¹ã ãã¡ã€ã«ã䜿çšã§ããŸãã ã³ã³ãã€ã«ãããæ§æãæã€ã·ã¹ãã ã®è€éãã¯ãããã¹ã ãã¡ã€ã«ã䜿çšããã·ã¹ãã ã®è€éããããè¥å¹²å°ãªãããšãããã«åãããŸãã ããã¹ã ãã¡ã€ã«ã«ã¯è¿œå ã®ã³ãŒããå¿
èŠã§ãã)
éäžåãããããŒãšå€ã®ã¹ãã¢ã¯ãåæ£ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¿ ãã©ã¡ãŒã¿ãŒãé
åžããããã®åªããã¡ã«ããºã ã§ãã äœãæ§æãã©ã¡ãŒã¿ã§ãããäœãåãªãããŒã¿ãªã®ããå€æããå¿
èŠããããŸãã é¢æ°ãæãããŸããã C => A => B
ãããã³ãã©ã¡ãŒã¿ C
ãã£ãã«å€æŽãããªãããŒã¿ A
- é »ç¹ã ãã®å Žåã次ã®ããã«èšããŸãã C
- èšå®ãã©ã¡ãŒã¿ãããã³ A
- ããŒã¿ã æ§æãã©ã¡ãŒã¿ã¯ãäžè¬ã«ããŒã¿ãããå€æŽé »åºŠãäœããšããç¹ã§ããŒã¿ãšã¯ç°ãªãããã§ãã ãŸããéåžžãããŒã¿ã¯ XNUMX ã€ã®ãœãŒã¹ (ãŠãŒã¶ãŒ) ããååŸãããæ§æãã©ã¡ãŒã¿ã¯å¥ã®ãœãŒã¹ (ã·ã¹ãã 管çè
) ããååŸãããŸãã
ãã£ãã«å€æŽãããªããã©ã¡ãŒã¿ãããã°ã©ã ãåèµ·åããã«æŽæ°ããå¿ èŠãããå Žåãäœããã®æ¹æ³ã§ãã©ã¡ãŒã¿ãæž¡ããä¿åã解æããã§ãã¯ããäžæ£ãªå€ãåŠçããå¿ èŠããããããããã°ã©ã ãè€éã«ãªãããšããããããŸãã ãããã£ãŠãããã°ã©ã ã®è€éãã軜æžãããšãã芳ç¹ããã¯ãããã°ã©ã ã®åäœäžã«å€æŽã§ãããã©ã¡ãŒã¿ãŒã®æ°ãæžãã (ãŸãã¯ãã®ãããªãã©ã¡ãŒã¿ãŒããŸã£ãããµããŒãããªã) ããšãåççã§ãã
ãã®èšäºã§ã¯ãéçãã©ã¡ãŒã¿ãŒãšåçãã©ã¡ãŒã¿ãŒãåºå¥ããŸãã ãµãŒãã¹ã®ããžãã¯ã§ããã°ã©ã ã®åäœäžã«ãã©ã¡ãŒã¿ãŒãå€æŽããå¿ èŠãããå Žåããã®ãããªãã©ã¡ãŒã¿ãŒãåçãšåŒã³ãŸãã ãã以å€ã®å Žåããªãã·ã§ã³ã¯éçã§ãããã³ã³ãã€ã«ãããæ§æã䜿çšããŠæ§æã§ããŸãã åçåæ§æã®å Žåããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã®ããã»ã¹ãåèµ·åãããã®ãšåãããã«ãæ°ãããã©ã¡ãŒã¿ã䜿çšããŠããã°ã©ã ã®äžéšãåèµ·åããã¡ã«ããºã ãå¿ èŠã«ãªãå ŽåããããŸãã (ç§ãã¡ã®æèŠã§ã¯ãã·ã¹ãã ã®è€éããå¢ãããããªã¢ã«ã¿ã€ã ã®åæ§æã¯é¿ããããšããå§ãããŸããå¯èœã§ããã°ãããã»ã¹ã®åèµ·åã«ã¯æšæºã® OS æ©èœã䜿çšããããšããå§ãããŸãã)
åçåæ§æãæ€èšãããéçæ§æã®äœ¿çšã«é¢ããéèŠãªåŽé¢ã® XNUMX ã€ã¯ãæ§æã®æŽæ°åŸã«ã·ã¹ãã ãåèµ·åãããŸã§ã«ãããæé (ããŠã³ã¿ã€ã ) ã§ãã å®éãéçæ§æãå€æŽããå¿
èŠãããå Žåã¯ãæ°ããå€ãæå¹ã«ããããã«ã·ã¹ãã ãåèµ·åããå¿
èŠããããŸãã ããŠã³ã¿ã€ã ã®åé¡ã¯ãã·ã¹ãã ã«ãã£ãŠé倧床ãç°ãªããŸãã å Žåã«ãã£ãŠã¯ãè² è·ãæå°éã«æãããããšãã«åèµ·åãã¹ã±ãžã¥ãŒã«ã§ããŸãã ç¶ç¶çãªãµãŒãã¹ãæäŸããå¿
èŠãããå Žåã¯ã次ã®ããã«å®è£
ã§ããŸãã
ããã§ãã¢ãŒãã£ãã¡ã¯ãã®å éšãŸãã¯å€éšã«æ§æãä¿åããåé¡ãèããŠã¿ãŸãããã æ§æãã¢ãŒãã£ãã¡ã¯ãå ã«ä¿åãããšãå°ãªããšãã¢ãŒãã£ãã¡ã¯ãã®ã¢ã»ã³ããªäžã«æ§æã®æ£ç¢ºããæ€èšŒããæ©äŒãåŸãããŸãã æ§æãå¶åŸ¡å¯Ÿè±¡ã®ææç©ã®ç¯å²å€ã«ããå Žåã誰ããã®ãã¡ã€ã«ã«å€æŽãå ããã®ãããŸããã®çç±ã远跡ããã®ã¯å°é£ã§ãã ããã¯ã©ããããéèŠã§ãã? ç§ãã¡ã®æèŠã§ã¯ãå€ãã®å®çšŒåã·ã¹ãã ã§ã¯ãå®å®ããé«å質ã®æ§æãæã€ããšãéèŠã§ãã
ã¢ãŒãã£ãã¡ã¯ãã®ããŒãžã§ã³ã«ãããã¢ãŒãã£ãã¡ã¯ãããã€äœæãããããã©ã®ãããªå€ãå«ãŸããŠããããã©ã®æ©èœãæå¹å/ç¡å¹åãããŠããããããã³æ§æã®å€æŽã®è²¬ä»»è ãå€æã§ããŸãã ãã¡ãããæ§æãã¢ãŒãã£ãã¡ã¯ãå ã«ä¿åããã«ã¯ããçšåºŠã®åŽåãå¿ èŠãªãããæ å ±ã«åºã¥ãã決å®ãäžãå¿ èŠããããŸãã
é·æãšçæ
ææ¡ãããæè¡ã®é·æãšçæã«ã€ããŠè©³ãã説æããããšæããŸãã
å©ç¹
以äžã¯ãã³ã³ãã€ã«ãããåæ£ã·ã¹ãã æ§æã®äž»ãªæ©èœã®ãªã¹ãã§ãã
- éçæ§æãã§ãã¯ã 確å®ã«ç¢ºèªã§ããããã«ãªããŸã
æ§æã¯æ£ããã§ãã - è±å¯ãªèšå®èšèªã éåžžãä»ã®æ§ææ¹æ³ã¯æ倧ã§ãæååå€æ°ã®çœ®æã«éå®ãããŸãã Scala ã䜿çšããå Žåãæ§æãæ¹åããããã«å¹
åºãèšèªæ©èœãå©çšã§ããŸãã ããšãã°ã次ã®ããã«äœ¿çšã§ããŸã
ããã©ã«ãå€ã®ç¹æ§ããªããžã§ã¯ãã䜿çšããŠãã©ã¡ãŒã¿ãã°ã«ãŒãåãããšãå€åŽã®ã¹ã³ãŒãå 㧠XNUMX åã ã宣èšããã vals (DRY) ãåç §ã§ããŸãã æ§æå ã§çŽæ¥ä»»æã®ã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åã§ããŸã (Seq
,Map
ãã«ã¹ã¿ã ã¯ã©ã¹ïŒã - DSLã Scala ã«ã¯ãDSL ã®äœæã容æã«ããèšèªæ©èœãå€æ°ãããŸãã ãããã®æ©èœãå©çšããŠãã¿ãŒã²ãã ãŠãŒã¶ãŒ ã°ã«ãŒãã«ãšã£ãŠãã䟿å©ãªæ§æèšèªãå®è£ ããŠãå°ãªããšããã¡ã€ã³ã®å°é家ãæ§æãèªã¿åããããã«ããããšãã§ããŸãã ããšãã°ãã¹ãã·ã£ãªã¹ãã¯æ§æã¬ãã¥ãŒ ããã»ã¹ã«åå ã§ããŸãã
- ããŒãéã®æŽåæ§ãšåææ§ã åæ£ã·ã¹ãã å šäœã®æ§æã XNUMX ãæã«ä¿åããå©ç¹ã® XNUMX ã€ã¯ããã¹ãŠã®å€ã XNUMX åã ã宣èšãããå¿ èŠãªãšãã«åå©çšã§ããããšã§ãã ãã¡ã³ãã ã¿ã€ãã䜿çšããŠããŒãã宣èšãããšãããŒãããã¹ãŠã®æ£ããã·ã¹ãã æ§æã§äºææ§ã®ãããããã³ã«ã䜿çšããŠããããšãä¿èšŒãããŸãã ããŒãéã«æ瀺çãªå¿ é ã®äŸåé¢ä¿ããããšããã¹ãŠã®ãµãŒãã¹ã確å®ã«æ¥ç¶ãããŸãã
- é«å質ãªå€æŽã å ±éã®éçºããã»ã¹ã䜿çšããŠæ§æãå€æŽããããšã§ãæ§æã«ã€ããŠãé«ãå質åºæºãéæããããšãã§ããŸãã
- æ§æã®åææŽæ°ã æ§æå€æŽåŸã®èªåã·ã¹ãã å±éã«ããããã¹ãŠã®ããŒãã確å®ã«æŽæ°ãããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®ç°¡çŽ åã ã¢ããªã±ãŒã·ã§ã³ã¯ã解æãæ§æãã§ãã¯ããŸãã¯äžæ£ãªå€ã®åŠçãå¿ èŠãšããŸããã ããã«ãããã¢ããªã±ãŒã·ã§ã³ã®è€éãã軜æžãããŸãã (ãã®äŸã§èŠãããæ§æã®è€éãã®äžéšã¯ãã³ã³ãã€ã«ãããæ§æã®å±æ§ã§ã¯ãªããããåªããåå®å šæ§ãæäŸããããšããèŠæã«ããæèçãªæ±ºå®ã«ãããŸããã) éåžžã®æ§æã«æ»ãã®ã¯éåžžã«ç°¡åã§ããäžè¶³ããŠãããã®ãå®è£ ããã ãã§ããéšåã ãããã£ãŠãããšãã°ãã³ã³ãã€ã«æžã¿ã®æ§æããéå§ããæ¬åœã«å¿ èŠã«ãªããŸã§äžèŠãªéšåã®å®è£ ã延æããããšãã§ããŸãã
- æ€èšŒæžã¿ã®æ§æã æ§æã®å€æŽã¯ä»ã®å€æŽã®éåžžã®éåœã«åŸããããååŸããåºåã¯äžæã®ããŒãžã§ã³ãæã€ã¢ãŒãã£ãã¡ã¯ãã«ãªããŸãã ããã«ãããããšãã°ãå¿ èŠã«å¿ããŠä»¥åã®ããŒãžã§ã³ã®æ§æã«æ»ãããšãã§ããŸãã XNUMX 幎åã®æ§æã䜿çšããããšãã§ããã·ã¹ãã ã¯ãŸã£ããåãããã«åäœããŸãã å®å®ããæ§æã«ãããåæ£ã·ã¹ãã ã®äºæž¬å¯èœæ§ãšä¿¡é Œæ§ãåäžããŸãã æ§æã¯ã³ã³ãã€ã«æ®µéã§åºå®ããããããæ¬çªç°å¢ã§ãããåœè£ ããããšã¯éåžžã«å°é£ã§ãã
- ã¢ãžã¥ãŒã«æ§ã ææ¡ããããã¬ãŒã ã¯ãŒã¯ã¯ã¢ãžã¥ãŒã«åŒã§ãããã¢ãžã¥ãŒã«ãããŸããŸãªæ¹æ³ã§çµã¿åãããŠããŸããŸãªã·ã¹ãã ãäœæã§ããŸãã ç¹ã«ãäžå®æœåœ¢æ ã§ã¯åäžããŒãã§å®è¡ããããã«ã·ã¹ãã ãæ§æããå¥ã®å®æœåœ¢æ ã§ã¯è€æ°ããŒãã§å®è¡ããããã«ã·ã¹ãã ãæ§æããããšãã§ããã ã·ã¹ãã ã®å®çšŒåã€ã³ã¹ã¿ã³ã¹çšã«ããã€ãã®æ§æãäœæã§ããŸãã
- ãã¹ãäžã åã ã®ãµãŒãã¹ãã¢ã㯠ãªããžã§ã¯ãã«çœ®ãæããããšã«ããããã¹ãã«äŸ¿å©ãªã·ã¹ãã ã®ããã€ãã®ããŒãžã§ã³ãååŸã§ããŸãã
- çµ±åãã¹ãã åæ£ã·ã¹ãã å šäœãåäžã®æ§æã«ããããšã§ãçµ±åãã¹ãã®äžç°ãšããŠãå¶åŸ¡ãããç°å¢ã§ãã¹ãŠã®ã³ã³ããŒãã³ããå®è¡ã§ããããã«ãªããŸãã ããšãã°ãäžéšã®ããŒããã¢ã¯ã»ã¹å¯èœã«ãªãç¶æ³ããšãã¥ã¬ãŒãããã®ã¯ç°¡åã§ãã
çæãšå¶é
ã³ã³ãã€ã«ãããæ§æã¯ä»ã®æ§æã¢ãããŒããšã¯ç°ãªããããäžéšã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯é©ããªãå ŽåããããŸãã 以äžã«ããã€ãã®æ¬ ç¹ã瀺ããŸãã
- éçæ§æã å Žåã«ãã£ãŠã¯ããã¹ãŠã®ä¿è·ã¡ã«ããºã ããã€ãã¹ããŠãéçšç°å¢ã®æ§æãè¿ éã«ä¿®æ£ããå¿ èŠããããŸãã ãã®ã¢ãããŒãã§ã¯ãããã«å°é£ã«ãªãå¯èœæ§ããããŸãã å°ãªããšããã³ã³ãã€ã«ãšèªåãããã€ã¡ã³ãã¯äŸç¶ãšããŠå¿ èŠã§ãã ããã¯ããã®ã¢ãããŒãã®äŸ¿å©ãªç¹åŸŽã§ãããšåæã«ãå Žåã«ãã£ãŠã¯æ¬ ç¹ã§ããããŸãã
- æ§æã®çæã æ§æãã¡ã€ã«ãèªåããŒã«ã«ãã£ãŠçæãããå Žåããã«ã ã¹ã¯ãªãããçµ±åããããã«è¿œå ã®äœæ¥ãå¿ èŠã«ãªãå ŽåããããŸãã
- ããŒã«ã çŸåšãæ§æãæäœããããã«èšèšããããŠãŒãã£ãªãã£ãšãã¯ããã¯ã¯ããã¹ã ãã¡ã€ã«ã«åºã¥ããŠããŸãã ãã®ãããªãŠãŒãã£ãªãã£/ãã¯ããã¯ã®ãã¹ãŠãã³ã³ãã€ã«ãããæ§æã§å©çšã§ããããã§ã¯ãããŸããã
- æ 床ã®å€åãå¿ èŠã§ãã éçºè ãš DevOps ã¯ããã¹ã ãã¡ã€ã«ã«æ £ããŠããŸãã æ§æãã³ã³ãã€ã«ãããšããã¢ã€ãã¢èªäœããå€å°äºæãã¬ãçãããã®ã§ãããæåŠãããå¯èœæ§ããããŸãã
- é«å質ãªéçºããã»ã¹ãå¿ èŠã§ãã ã³ã³ãã€ã«ãããæ§æãå¿«é©ã«äœ¿çšããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ãšãããã€ã®ããã»ã¹ (CI/CD) ãå®å šã«èªååããå¿ èŠããããŸãã ããããªããšããªãäžäŸ¿ã«ãªããŸãã
ã³ã³ãã€ã«ãããæ§æã®æŠå¿µãšã¯é¢ä¿ã®ãªããèæ ®ãããäŸã®ããã€ãã®å¶éã«ã€ããŠã詳ãã説æããŸãã
- ããŒãã§äœ¿çšãããªãäžèŠãªæ§ææ
å ±ãæäŸãããšãã³ã³ãã€ã©ãŒã¯æ¬ èœããŠããå®è£
ã®æ€åºã«åœ¹ç«ã¡ãŸããã ãã®åé¡ã¯ãCake ãã¿ãŒã³ãæŸæ£ããããå³å¯ãªã¿ã€ãã䜿çšããããšã§è§£æ±ºã§ããŸããããšãã°ã
HList
ãŸãã¯ãæ§æãè¡šã代æ°ããŒã¿å (ã±ãŒã¹ ã¯ã©ã¹)ã - æ§æãã¡ã€ã«å
ã«ãæ§æèªäœã«é¢ä¿ã®ãªãè¡ããããŸã: (
package
,import
,ãªããžã§ã¯ã宣èš;override def
ã¯ããã©ã«ãå€ãæã€ãã©ã¡ãŒã¿ãè¡šããŸã)ã ç¬èªã® DSL ãå®è£ ãããšããããéšåçã«åé¿ã§ããŸãã ããã«ãä»ã®ã¿ã€ãã®æ§æ (XML ãªã©) ããã¡ã€ã«æ§é ã«ç¹å®ã®å¶éã課ããŸãã - ãã®èšäºã§ã¯ãåæ§ã®ããŒããããªãã¯ã©ã¹ã¿ãŒã®åçåæ§æã«ã€ããŠã¯èæ ®ããŠããŸããã
ãŸãšã
ãã®æçš¿ã§ã¯ãScala åã·ã¹ãã ã®é«åºŠãªæ©èœã䜿çšããŠãœãŒã¹ ã³ãŒãã§æ§æãè¡šçŸãããšããã¢ã€ãã¢ãæ€èšããŸããã ãã®ã¢ãããŒãã¯ãxml ãŸãã¯ããã¹ã ãã¡ã€ã«ã«åºã¥ãåŸæ¥ã®æ§ææ¹æ³ã®ä»£ãããšããŠãããŸããŸãªã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããŸãã ãã®äŸã¯ Scala ã§å®è£ ãããŠããŸãããåãã¢ã€ãã¢ãä»ã®ã³ã³ãã€ã«èšèª (KotlinãC#ãSwift ãªã©) ã«ç§»ãããšãã§ããŸãã 次ã®ãããžã§ã¯ãã®ããããã§ãã®ã¢ãããŒããè©ŠããŠãããŸããããªãå Žåã¯ãããã¹ã ãã¡ã€ã«ã«é²ã¿ãäžè¶³ããŠããéšåãè¿œå ããŠãã ããã
åœç¶ã®ããšãªãããã³ã³ãã€ã«ãããæ§æã«ã¯é«å質ã®éçºããã»ã¹ãå¿ èŠã§ãã ãã®ä»£ããã«ãæ§æã®é«å質ãšä¿¡é Œæ§ãä¿èšŒãããŸãã
æ€èšãããã¢ãããŒãã¯æ¬¡ã®ããã«æ¡åŒµã§ããŸãã
- ãã¯ãã䜿çšããŠã³ã³ãã€ã«æã®ãã§ãã¯ãå®è¡ã§ããŸãã
- DSL ãå®è£ ãããšããšã³ã ãŠãŒã¶ãŒãã¢ã¯ã»ã¹ã§ããæ¹æ³ã§æ§æãæ瀺ã§ããŸãã
- èªåæ§æ調æŽã䜿çšããŠåçãªãªãœãŒã¹ç®¡çãå®è£ ã§ããŸãã ããšãã°ãã¯ã©ã¹ã¿ãŒå ã®ããŒãã®æ°ãå€æŽããã«ã¯ã(1) åããŒãããããã«ç°ãªãæ§æãåãåãå¿ èŠããããŸãã (2) ã¯ã©ã¹ã¿ãŒãããŒãžã£ãŒã¯æ°ããããŒãã«é¢ããæ å ±ãåãåããŸããã
æè¬
èæ¡èšäºã«å¯Ÿãã建èšçãªæ¹å€ãããŠãã ãã£ã Andrei SaksonovãPavel PopovãAnton Nekhaev ã«æè¬ããããšæããŸãã
åºæïŒ habr.com