αααα»αα ααααααΆααα’αααααΌαααααααΆααα½αα±ααα αΆααα’αΆαααααααα½ααααααΆααααααΎααΆαααΆαα½αααΆαααααααα ααΆααααααααααααααααααα ααα αΆαα ααΆαααααααα ααΆααααααααααααΌαααΆαααααΆααααααααΆααααΆααΆααΆα ααααα (Scala) αααααααΎαααααααα»ααααα·ααΆαα αααααΆαααααααααααΌαα§ααΆα αααααααΆαααααααα ααΆαααααααααααααα α αΎααα·ααΆααααΆα’αααΈαα·αααααΆαααααααααααΆαα’αα»ααααααΆαααααααα ααΆαααααααααααααΆαα ααααααα αααα»αααααΎαααΆαα’αα·ααααααααΆααααΌαα
(
ααα ααααΈααααΆα
ααΆααααΆαααααααααα ααα αΆααααα’αΆα αα»αα α·αααααΆαααΆααααααΆααααΆααααΆααα’ααααααΎααΆααααααααααΉαααααΌα ααααΎααααΆαααααααΆαα½αααααΆααααααααααα αα αα αααα·ααααΆ DevOps (terraform, ansible α¬α’αααΈαα½αααΌα ααα) ααΆααααααΆααααΌαααΆαααααΎααΎααααΈαααααΎαα―αααΆαααααααα ααΆαααααααααααααααααααααααα· (ααΆααΉαααΆααααΆααααΆαααααααΆααααααΆααααΈαα½αα)α ααΎαααα ααααααΆααααΆααααΆααααααΆααααααααΆααα’αααααα»αααααΎαα·ααΈααΆαααΌα ααααΆ (αα½αααΆααααααααΌα ααααΆ)α ααΎαα·αααΌα αααααα ααΆααα·αααααααΆααΉαααααΌαααΆααααααΎαα‘αΎααα αααα»αααααααααα ααα αΆαααααααΎαα αα αααα»ααα·αα JVM αααα·ααΆααα½ααααααααΌαααΆααααααΊααΆααααααΌα ααααΆαααααααΆααααααααΆαααΆααα·ααΈααΆαααααΌαααααααΎαα αααααααΈααααααα
α α»αααΆαααΆαααααααααααααα ααα αΆααα·α? ααΆααΆααα·αααΆαα ααΎαααααααααΆαααΆαααΆαα»ααΆααα’ααααΆαααΆαααααΎαααααα―αααΆ αα»ααααααΎααααααα ααΆαααααΎααααααααΆα ααααααα (ααΎααααΈα±ααααΎαααΌαααα»αααααααααααααα ααααααααΎαααΆα ααΎαααααααΌαααααααααα»ααααααΆαααααΌα ααααΆαα ααααΆααααΆαααΆααααα αα·ααααααααΎαααΆααααααα)
αα αααααααΎααΆαααΆαα½αααΆαααααΎααααααα½ααααα αΌα ααΆα αααΎαααααΆααααα½αααααΎ classpath ααΌα ααααΆαα αααααααΈααααααααΎααααΆααααΆααα’ααα α’αααΈαααααΎαααααΌαααααΎααΊααααΌαααααΆααααΆ classpath ααΌα ααααΆααααΌαααΆαααααΎαα αααααααΎαααΆαα (αααααααααααΆα’αΆα ααααΎαα ααΆαααΆαααααα»ααααα»αααΆαααααΎαααΆα nodes αααααααααΆααΆαα½αααΉα classpaths αααααααααΆ ααΆααααααααΆααααα»αααααΆααααααΆαααααααα ααΆαααααααααα½α αα·αααΆαααααΆαααΆαα½αααΉαααΆαααααΎαααααααΆαααααααΆα αα·αααΆααα½ααααα αΌαααααΆα) αααααΆαααααααααααααΆααααα ααααα ααΎαααααααααΆ nodes ααΆααα’ααααΉαααααΎ classpath ααΌα ααααΆα
ααΆαααααααα
ααΆαααααααααα·ααααααααΆαα½ααααααα·ααΈα ααΎαααααΎααααααΎααααΈαααααα’ααααααααΆαααααΆααααΆααααααααααΆααααΆααα·αααααααααα·ααΈα ααΆα αΆααααΈααΌα
ααΆα‘αΌααΈαααααα»αααΆααααααα’ααααααααΆααααααααααααααΆααααΆααααααα α αΎαααΆααααΆαααααααα
ααΆααααααααααααααα½αα―ααα
αααα»ααααααααααααα½ααα·αα·αααααααα ααααα·αβααΎβααΆαβααΆαβαααααβαα
ααΆααααααααβααβαα½αβαααα»αβααΆαβααα·αβααα ααΎαβα’αΆα
βααααΎβαααβααααβααΆαβαααΆαβααΆααααα ααααα·αααΎααΎαααααΎα§ααΆα αααααα·αααααα
αααΎα αααααΎαααΉαααααΌαααΆαα
αααΎααα
ααΆααΆααααααα
ααΆαααααααα αα·αααααΆαααααααααααααααΎαααα (α§ααΆα ααα αααααααΆααΆ)α αα·ααΈαααααΎαα’αΆα
ααααααααΆαα
αααΆααααΌαααΆαααααααα
ααΆαααααααααα·αααααΆααα ααααΏααααααΆααααΆαααααααα
ααΆααααααααααΈαα½ααααΆααααα½αααααααααααΌαααααΆαα
ααΉαααΆααα½ααααα
αΌαααααΆααΆααααΆααααααααΆαααααααΆαα
ααα
αΆα α
ααα ααααΆαααΆααααα
αα·ααααααααααΆαααα αααααΆαααααααααααααΆααααααΆαααα ααΎαααΉαααααααααΆααΆαααΆααΆαααα½α α αΎαααΎαα’αΆα
αααααααΆαααααααα
ααΆααααααααααΆαααααααααααΆαααααααΎαααααΈαααααααααααα
ααα»α
(1.2.3)α
αα
αααα»αααα·ααΆααΆαααααΎα α―αααΆαααααααα
ααΆααααααααααααααααΌαααΆααααααΎααααααα ααΆααΉαααΆαααα½αααΆααααΌαααΆααααααΎαααα‘α»ααααααΆαααααααΆα α αΎααα·αααααΌαααΆααααααααα (ααΌα
αααα
αα αααα»αααΆααααααΆαααα ααΎαααΉαααααααααααΈαααα·αααααΆαααααΆαα±ααααΆαααααααα ααΆαααααααααα½ααα ααΆααααα»αααααα»αα»ααΆααααααΆαα αααααα
ααΆαααααααα ααΆαααααααααααααΆαα ααααα
αααααααααααααααΌαα§ααΆα αααααααΆαααααααα ααΆαααααααααααααΆαα ααααααα·αα·ααααα ααααΆααααααΆααααα ααα½αααΈαααααΌαααΆαα’αα»αααα - ααααΆα’αααΌ αα·αα’αα·αα·ααααααΆα’αααΌα αααααα’ααααΎααααΆααααααΆααααΈαααα αααααΎαααααααααααΈαααααΌαααΆααααααΌααααα»αα αα αααα»ααααααΎααα½α ααααΆααΆααααΈαααΆαααΈααΆαααα ααΎααααΆααααΌα ααααΆ αααα»ααααααΎααα½ααααααααα - αα ααΎααααΆαααααααααααΆα
ααΆααααααΆααααααααα
ααα
αΆαααΆαααααΆααααΆα
αααΎαα α’αααα’αΆα
αααααα’ααααααααΆαααααΆαααααααααΎααααααααααααααα½αα
ααα½α 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)
αααααα Phantom
ααΎααααΈαααααα’ααααααααΆααα·ααΈααΆααα αααα ααααα ααΎαααααΎαααΆαααΆααααααααααααααααα·αααααΌαααΆαααααΎαααα»αααααΆααα ααΆααααααα α α·ααααααααΊαααααΆαααααΎααα·αααααΎ protocol instance αα αααααααΎαααΆα ααα»ααααααΎαα ααα±αα compiler αα·αα·αααααΎαααΆαααααααΆαα protocolsα ααΆααααααΆααααααΆαααα·ααΈααΆα ααΎαααΉααα·αα’αΆα αααααα»αααααΆαα·αααααααααΆααΆαααΉαααα’ααααΆαααα
αα·ααΈααΆαααΌαα αα½αααΊ REST API ααΆαα½αααΉα Json serializationα
sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]
αααααΆααααααααα RequestMessage
- ααααααααααααΎ, ResponseMessage
- ααααααααααΆαααααΎαααα
ααΆααΆααα·αααΆαα ααΎαα’αΆα
ααααΎααΆααα·αααααΆαα·ααΈααΆαααααααααααααααααααΌαααΆαααααΉαααααΌαααααΆααα·αααααΆαααααΎαααααΌαααΆαα
αααααΆαααααααααααααΆααααα ααααα ααΎαααΉαααααΎααααααΆαααααααα·ααΈααΆαα
sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]
αα ααΈαααααααΎααΊααΆααααα’ααααααααααααααα url α αΎαααΆαααααΎαααααΊααΆααααα’αααααααααΆααααα‘αααααα·ααα αααα»ααα½ααααΆαααααΎααα HTTP α
ααΆαααααααα
ααΆααααααααααααΆααααααααΌαααΆααα·αααααΆααααααααααααΆαααα α
ααα αα·αααΆαα’αΆαααααα ααΆαα»ααΆαααααα’αΆα
ααααΌαααΆαααααΆααα
αααα»α Scala ααΆααα·ααΈααΆα
αααΎα (α§ααΆα ααα HList
-s, αααααααα·αααααααα·αααα·α)α αααααΆαααααααααααααΆααααα ααααα ααΎαααΉαααααΎααααΌαα αα·αααααΆαα±αααααΌαα»ααααααααΎ trait
αα (ααααΆαααααααα·ααααααΆααΆαα»α
αΆαααΆα
ααααα·ααΈααΆααααααααααα ααΆααααΆααααααΆααΆαα’αα»αααααα½ααααα’αΆα
ααααΎαα
ααΆαα )
ααΆαα’αΆααααααααΆαααααΆααααα’αΆα
ααααΌαααΆαααααΆαααΆααΆαα·ααΈααΆαααααααααααα‘ααα
ααα 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
. ααΆαα·ααααα
αααα»ααααΆαααΈααααααα’αααΌ ααΎαααΆαααΆααα·ααΈααΆαααΌα
ααααΆα ααΌα
αααααα
αααααααΆααααααΆααΈα ααΎαα’αΆα
ααααΆααααΆα’αααΈαααΉαααααΎαααΆαααΆαααααΉαααααΌαα
ααΆαα’αα»ααααααααΆαααα
αα»αααΆααα½αααααΌαααΆαααΆαααΆαααΎααααΈα
αΆααααααΎα αα·αααααααααααΆααααα (αααααααΆααααα»αααΆαααααααααααΆααααααΊααααΆαααααααΆααααΆαααααΎαααααα) ααΆααααΈααααααα ααΆααααααΎαααΆα
αααΎααααααΆααααΆαα’αα»αααααα»αααΆααααααα (α§ααΆα ααα ααΎαα’αΆα
ααααΎααααααααααΆαααααααα’ααααΎααααααααΆαααααα)α αααααΆαααααααααααααΆααααα ααααα ααΎαααΉαααααΎααααΌαααααα ααΎαααΉαααααΆαα±ααααααΆαααααααααααΎααααΆαα 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) α αα αααα»ααααααα·ααΈαααα»αααααααΆαααΆααααα αααΎαααΆα αΆααααΌα ααΆααα’ααΆααααα»αααΆαααααΎααααΆααMonad
/ConcurrentEffect
.
αααααααΎα αααααααΆαα»αααΆαααα ααΎαα’αΆα α’αα»ααααααααΆααααααΆα αααΎαα α§ααΆα ααα ααααΆααααααααα·αααααΎα’αααΈαααα
trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
type Config <: Any
def resource(...): ResourceReader[F, Config, Unit] =
Reader(_ => Resource.pure[F, Unit](()))
}
(αααβααΈβαααβαα
ΠΈ
ααααΆααααΊααΆααααα»αααα’αΆα ααΎαααααΎαααΆαααααΆααααααΆα αααΎα (ααΆαα αΆααααααΎααααααααααααΆααααααΆαααααΌαααΆαααΆααΆαααααααΌαα)α
object SingleNodeImpl extends ZeroServiceImpl[IO]
with EchoServiceService
with EchoClientService
with FiniteDurationLifecycleServiceImpl
{
type Config = EchoConfig[String] with EchoClientConfig[String] with FiniteDurationLifecycleConfig
}
ααΌαα αααΆαααΆααΎααααα»ααααααΆααααααααααΆααααΆααααααΆαααααααα ααΆαααααααααααααααΌαααΆααααααΆααααααΆαααααα ααααα·αααΎβααΎαβααααα βαααααΆααβααααααβααΆαβαααααβαα½αβαααβαααααΌαβαααβααααΆααααβααΆααααΆααβαααβααΉαβααΆαβααα α»αβαααα»αβααΆαβα αααααα ααΌα ααααΆαααααααα ααΎαααΉααα·αα’αΆα α αΆααααααΎαααααΆααααΆααα αα»αααααΆααααΎααααααααααα»αα½αα ααα½αααααααααααααααααΆαα½αααΉααα·ααααααα αΆαααΆα αααΆααα’ααα
αααααααααΆαααααααααΆαααΈα
ααΎααααΈααααΆαααα αααΆαααΈαααΈα ααααΆα ααΎαααααΌαααΆαα’αΆααααααΆα IP αα·αααααΆααα ααΆα’αΆα αα αα½α αααα’αΆααααααΆαααΉαααααΌαααΆαααΉααα ααααααααααΆαααΆαααααααα ααΆααααααααααααα αααα ααΌα ααααβααΎαβααααΌαβααΆαβαα»αααΆαβαααβααΌαβαααβαααααΆααβααααΆααβαα βα’αΆααααααΆαα
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
.
αααααΆαα ααΎααα·α αΆαααΆαααααΎαααΈααααααΆααααααααααα ααα αΆαα
- ααΆααααααΆααααααΆααα’αααα ααΎααααΆαααα½αα
- αα·αααΆααααα ααααααΆα’αααΌ αα·ααααΆαααΈααααααα’αααΌαα ααΎααααΆααααααααααααΆα
ααΆαααααααα
ααΆαααααααααααααΆαα
ααΆαααααααα ααΆααααααααααααΆαααααα½α
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 ααααααΎαααΆα αα·αααααααααααΆαααΆααα’ααα±ααααΆαααααΉαααααΌαα )
αααα»αααΌα
ααααΆααααΆαααααααα
ααΆαααααααα αα·αααααααααααΆαα’αα»ααααα’αΆα
ααααΌαααΆαααααΎααΎααααΈαααααΎααααααααααααααΆα
ααΆαααααααα ααΆααααααααααααΆααααΈα
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"
}
ααααΆαα! ααΌαααααααααΆααααΈαααααααααααΆααααααααΌαααΆαααααΆααα ααΎααααααΆααααααΆαααααααα’αα»αααααααααααΆαααα½αααΆααΆαα’αα»αααααα·ααΈααΆαααααα’αΆαααααααααααααΆααααααααααα ααααααααΆαα’αΆαααααααααΌαααΆααα·αα·ααααααα’αααα ααααα ααΈααααα ααΆααααααααα·ααΈααΆαα αα αααααααΎαααΆα ααΆαα’αΆαααααααΉαααΆαααααααααΆααααααΆααααααα ααααΉαααααΌαα ααΌαα’ααα»αα αααααααααααΆαααααα ααΎααααααΆαααααα ααααααΆααα·αααααΆαααααααα α αΎααααααααααΌαααΆαααΆααΆααΆαααα αα ααΎα αααααααΉαααααΌαα
ααΆαα’αα»ααααααααΆααααααααααααΈα
αααααΆααααΆαααααααα ααΆααααααααααα ααΎαααααΎααΆαα’αα»ααααααααΆααααααΌα ααααΆαααααααΆαααΆαααααΆααααααΌαα ααΆααα»αααααΆαααα½ααααααΊααΆα₯α‘αΌααααααΎαααΆαααααα»ααΈααααα’αα»αααααααα»αααααΆααααααααααααααΆα
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
}
ααααΆααααΈαα½αα’αα»αααααααΆαααΈααα α αΎαααααΌαααΆαααααΆαααααααα
ααΆαααααααααααΆαααΈαααααα»αααααα ααααΆααααΈααΈαα’αα»αααααααΆαααΈαααααα αα·αααααΎααααααααααααααΆαααααααα
ααΆααααααααα ααααΆααααΆααααΈαααααααΌαααΆαααΆααααααααααααααα½αααΈαα·ααααααα ααααΆαααααΆαααΈαααααααΎαααΆααααααααΆαααααααα αΌααααααΆααααΌαααΆααααααα SIGTERM
'om α αΎαβααααΆααβαααΆαααΈααααααβααΉαβαα·αβαααααΆααααΈβαααααααα αααβααΈβαααβαα
ααααΎαααΆαα’αα·ααααααααΌαα
ααΌαααΎαααΈααααααααα·ααΈααΆαααααααααααα ααΆααααααααααααααααΆαααααααααΎαααΆαα’αα·ααααααααΆααααΌαα
ααΆαααααααα ααΆααααααααααΉαααααΌαααΆαα αααααααΆαα½αααΉαααΌαααααα ααα α αΎαααααα»αα»ααΆα (.jar) ααΉαααααΌαααΆααααααΎαα ααΆα αΆααααΌα ααΆααα ααα»αααααα»αααΆαααΆααααΆαααααααα ααΆαααααααααα αααα»αααααα»αα»ααΆαααΆα ααααα‘αααα½αα αααααΊαααααΆαααααΎαα’αΆα ααΆαααΆαααααααα ααΆααααααααα αααΎααααααα’ααααΎααΌαααΌα ααααΆα ααΆααααΈααααααα ααΆα’αΆα ααααΎαα ααΆαααΎααααΈαααααΎαααααα»αα»ααΆααααααααΌαααααΆαα ααΉαααΆααΆααααΆαααααααα ααΆααααααααααααααααααΆα ααΆαα’αΆααααααα ααΎααααααΆααααΆαααααααααΆαααααααΌαααΆααααααΆαα»ααα½αααΆαα½αααΉαααΆαααααααα ααΆαααααααα α αΎαααααααΆαααααααααΌαααΆααααααΆαα»αααΆααααα αΌααα αααααΆαααααΎααααααα α α·αααααΆαααααααΆαααααααααΆαααααααα ααΆαααααααααααα
ααΆαααααΆααααααΌαααΆαααααααα
ααΆααααααααααΆαα½ααααααα
ααΆααΆαααααΆααααααΌαααΌαα ααΌα
ααααα αΎα ααΈαα½αα
ααΆαααααΆααααααΌαααΉαααααΌαααΆααααααααααααααααααΎαααΆαααΆααΆαα»αααΆαααααααΆα
αααα»ααααα
αααα»ααααααα·ααΈααΆαααΆαααα α»α -> PR -> αα·αα·αααα‘αΎααα·α -> αααα
αΌαααΆαα½αααΆααΆααΆααααααα ->
ααΆααα½ααααα
αΌα -> ααΆαααΆαααααααΆα
αααα·ααΆαα ααααααααΆαα’αα»ααααααΆαααααααα ααΆαααααααααααααΆαα αααααααΊα
-
ααΆαααααααα ααΆααααααααααΉαααΆαααΆααααΈαααααΆααααααΆααΎααααΆααααΆααα’ααααααααααααα ααα αΆαα αααααΆαααααΆααα·ααααααΆααααΆααααΆααα’ααααα½αααΆαααΆααααααααΌα ααααΆααΈααααααααα½αα
-
ααΆααΆααααα αΆαααα»αααΆαααααΆααααααΌαααΆαααααααα αααα»αααααΆαααααα½αααα»αααααα ααΌα αααα "ααΆααααΆααααααΆαααααααα ααΆαααααααα" ααΊαα·αααααααα
-
ααΆααΆαααααα·ααΆαααααΎααΆαααααΆααααααΌαααααα·α ααααα½α α ααααααΆααααααα
-
ααΆαααααΆααααααΌαααΆαααααααα ααΆααααααααααΆαα αααΎαααΉαααΎαα‘αΎαααΆαααααααααααΎαααΆαα’αα·ααααααααΆααααΌα α αΎαααΉαααααΌααααα½ααα·αα·αααα‘αΎααα·αα
ααΎαααα»αααααΌαααΆαααααΆααααΆα ααααα‘ααααΎααααΈαααααΆαα»αααΆαααααααα ααΆααααααααααα·ααααααααα¬αα? ααΆαααααααα ααΆαααααααααααα’αΆα ααΆαααΆααααααααΆαα αα·αααααααΆααααΎααααααααααααααΎαα ααααΆααααααα·αααΆαα αΌαααααΎααααΆααα αααααα’ααααΎααα ααΆα αΆααααΌα ααΆααα ααα»αααααα»αααΆααααααΆαα»αααΆααααααα α»αααααααα αααα»αααααΆααααΆα ααααα‘αααα½αα α’αααα’αΆα αααααααΆαααααααα ααΆααααααααααΆααΈααααααβαα½αααΆαααΆαααααααα ααΆαααααααααααα’αΆα α αΌαααααΎααΆαααΆααΆααΆααα αα·ααα½αααΆαααΆααααααααααα·αα ααΆααΉαα’αα»ααααΆαα±ααα’αααα’αα·ααααααααΆαα αααΎαααΆααα·αααα·α αΌαααααΎααΆααααααααΌαα α ααΆαααααααααααΊααΆααααα½ααααα»αααΆααααααα ααΆααααααααΎααααααααααα·αααααααααααΆααααααααααΆαααΎαα
ααΆααααααααα½ααααα’αΆα ααΎαααΆα
α αΌαααΎαααααΆααΆαααααααααααΆαααααααααααΆαα αααααααΆαα½αααΉααααααΎαααΌαα αα½αα ααα½αα
- α―αααΆαα’ααααααα ααΎαααΆαααΈαααααα α
- α αΆαααααααααααΉααααααΆα (
etcd
/zookeeper
). - αααΆαααΆαα»ααααΎαααΆααααα’αΆα ααααααα ααΆααααααααα‘αΎααα·α/α αΆααααααΎαα‘αΎααα·αααααα·αα αΆαααΆα αα αΆααααααΎαααααΎαααΆαα‘αΎααα·αα
- αααα»ααααααΆαα»αααΆαααααααα ααΆαααααααααα ααΆααααα ααααα»αα»ααΆα αα·αααΆααααααααααααααα
α―αααΆαα’ααααααααααααΌαααΆααααααααααΆαααααΆαααααα»αααααααααααααΆαααααΆααααααΌαααΌα αα α’ααααααααααααααααααααα’αΆα α αΌααα αααα»αααααΆααααΈα ααααΆα ααααΎααΆαααααΆααααααΌαα―αααΆααααααα αα·αα αΆααααααΎαααααΆααααα‘αΎααα·αα αααααΆαααΆαααΆααααααααααΆαααααααααααα α ααΆααααααααααααααααα ααααΆαα·ααα½αα±ααα ααααΆαααα ααΆαααααΆααααααΌαααΆαααααΎα±αααα·αααΆαααΆααα αααα»αααααααααααααααααααα ααααΆαααααΆααααΆαααα·αα·αααααΎαααΆαααααΆααααααΌααααααα ααΆαα·ααΆααααα»αααΆααααααααΆα’αααααΆααΆα’αααααααΎααΆαααααΆααααααΌααα·αααααΆαα αα·ααααααΆααα ααα»ααα’αααΈα ααΆαααααΆααααααΌααα·αααααΌαααΆαααΆαααααααα ααααα·αααΎααααααααααααΌαααΆαα ααα αΆα αααα’ααααααααααααα’αΆα ααααα ααααΎααΆαααααΆααααααΌααααααααΌαααααΆαα ααΎααααΆααααααααααα
(αα½ααααααααΆαααααααααΆααΆαααααΎααΆαααααααα
ααΆαααααααααααααΆαα
ααααααα·ααα·αααααααΆαααααΆαααααΎααααΆααα―αααΆαα’αααααααΆαααα’ααΆααααα ααΆααΉααααααααααΆαααααα»αααΆαααααααα§αααααααα αα·ααα»ααααΆααααααα·αααααααααΌα
ααααΆαα
ααΉαααααααα Config
α αΎαα’αααα’αΆα
ααααΎα―αααΆαα’αααααα ααΆααΎαα‘αΎαααααΆααααΆααΆααααα»αααααΆααααααααααααααααΆαααΆαααααααα
ααΆααααααααα
αααααααΊαα·α
ααΆαααΆααααα»αααααΆααααααααααααααααααΎα―αααΆαα’ααααα ααΈααααα α―αααΆαα’αααααααααΌαααΆααααααΌαααααααα )
ααααΆααααααααααααΉααααααΆαααΊααΆααααααΆαααααα’αααααΆααααΆαα
ααα
αΆααααΆαααΆααααααααααΆαααααααα·ααΈαααααΆαα
ααα
αΆαα ααΎαααααΌααααααα
α
α·αααααΆααΎα’αααΈααΆαααΆαααΆααααααααααααα
ααΆαααααααα αα·αα’αααΈαααααααΆααααααΆαα·ααααααα ααΌαα±ααααΎαααΆααα»αααΆα C => A => B
αα·ααααΆαααΆαααααα C
ααααααΆαααΆαααααΆααααααΌα αα·ααα·αααααα A
- ααΆααΉαααΆααα αααα»αααααΈαααααΎαα’αΆα
αα·ααΆαααΆαα C
- αααΆαααΆααααααααααααα
ααΆαααααααα αα·α A
- αα·ααααααα ααΆαααα αΆαααΆαααΆαααΆααααααααααααα
ααΆαααααααααα»αααΈαα·αααααααααααΆααΌαα
αα½αααααααΆααααααΌαααΉαααΆαααα·α
ααΆααα·ααααααα ααΌα
ααααΆαααααααα αα·ααααααααΆααααααΆααΆαααααΈααααααα½α (ααΈα’αααααααΎααααΆαα) αα·ααααΆαααΆααααααααααααα
ααΆααααααααααΈαα½ααααααααα (ααΈα’αααααααααααααααααααα)α
ααααα·αααΎααααααααΆααααααΌααααΆαααΆααααααα αΆαααΆα αααααΌαααααΎαα αα α»ααααααααΆαααααα·αα αΆααααααΎααααααα·ααΈα‘αΎααα·α αααααΆααΏααααΆα’αΆα ααΆαα±ααααΆαααΆααααα»αααααΆααααααααα·ααΈ ααΈαααααααΎαααΉαααααΌαααΆααααααΌααααΆαααΆαααααααααα αααααΆαα»α ααα αα·ααα·αα·ααα αα·αααααΎαααΆαααααααα·αααααΉαααααΌαα ααΌα ααααααΆαααααααααααΆαααΆαααααααααΆααααα»αααααΆααααααααα·ααΈααΆααα ααα»αααααα»αααΆαααΆαααααααα ααα½ααααΆαααΆαααααααααα’αΆα ααααΆααααααΌααααα»αα’αα‘α»ααααααααα·ααααα·ααΆααααααα·ααΈ (α¬αα·αααΆαααααααΆαααΆααααααααααααααΆααααααα) α
αααααΆαααααααααααααΆααααααΆαααα ααΎαααΉααααα αααααΆααααΆαααΆαααααααα·αα·αααα αα·αααΆαααααα ααααα·αααΎαααααα·ααααΆααααααΆαααααααααΌαα±ααααααΆααααααΌααααΆαααΆααααααααα‘α»ααααααααα·ααααα·ααΆααααααααα·ααΈααα ααΎαααΉαα α αααΆαααΆααααααααααααααΆαααααα ααΎαα·αααΌα αααααααααααΎαααΊαα·αα·ααααα αΎαα’αΆα ααααΌαααΆαααααααα ααΆαααααααααααααααΎααΆαααααααα ααΆαααααααααααααΆαα αααααα αααααΆααααΆαααααααα ααΆααααααααα‘αΎααα·αααΆααααα ααΎααααα ααααΆααααΌαααΆαααααααΆαααΎααααΈα αΆααααααΎαααααααααααααα·ααΈα‘αΎααα·αααΆαα½αααΉααααΆαααΆααααααααααΈ αααααααα ααΉααααααααααααΎαααΆαααααααααααααα·ααααα·ααΆαααααΌαααΆαα αΆααααααΎαα‘αΎααα·αα (ααΆααααα·αααααααΎα αα½ααααααααΆαααΆααααααα‘αΎααα·ααααα»ααααααααΆααΆααααααα αααααααΆαααααΎαααΆααααα»αααααΆαααααααααααα ααααα·αααΎα’αΆα ααααΎααΆα ααΆααΆααΆααααααΎααααα»αααΆαααααΎααααΆαααααααααΆααααααααΆα OS αααααΆααα αΆααααααΎαααααΎαααΆαα‘αΎααα·αα )
αα·αααααΆαααααΆαααα½αααααΆαααααΎααααΆααααΆαααααααα
ααΆαααααααααα·αα·αααααααααααΎα±ααααα»ααααα·α
αΆαααΆα’αααΈααΆαααααααα
ααΆααααααααα‘αΎααα·αααΆαααααααΊααΆαααααααΆαααααΆααααΌαααΆααααααΆααααααααααααΎααααΈα
αΆααααααΎαα‘αΎααα·ααααααΆααααΈααΆαα’αΆαααααααΆαααααααα
ααΆαααααααα (αααααααΆααα
αΆα)α ααΆαααΆααα·α ααααα·αααΎααΎαααααΌαααΆαααααΎααΆαααααΆααααααΌαααΆαααααααα
ααΆαααααααααα·αα·αααα ααΎαααΉαααααΌαα
αΆααααααΎαααααααααα‘αΎααα·αααΎααααΈα±αααααααααααΈααΆαααααα·αααααΆαα αααα αΆαααααααΆααα
αΆαααΆαααΆααα»ααααααααααΆαααα»αααΆαααααααααααααααΆααααααααααααααααα αααα»αααααΈαααα α’αααα’αΆα
ααααααααα
αΆααααααΎαα‘αΎααα·ααα
ααααααααααα»αααΆααα·α
αα½α
αααα»αα ααααα·αααΎα’αααααααΌαααΆααααααααααΆαααα α’αααα’αΆα
α’αα»ααααααΆαα
α₯α‘αΌαααα α αΌαααΎααα·α αΆαααΆα’αααΈαααα αΆααααΆααααααΆαα»αααΆαααααααα ααΆααααααααααΆααααα»α α¬ααΆααααα ααααα»αα»ααΆαα ααααα·αααΎααΎααααααΆαα»αααΆαααααααα ααΆαααααααααα αααα»αααααα»αα»ααΆα ααααααΆαα αα ααΆααααΎαααΆαα±ααΆαααΎααααΈαααααααααΆααααΆαααααΉαααααΌαααααΆαααααααα ααΆααααααααααα‘α»ααααααα‘αΎαααααα»αα»ααΆαα ααααα·αααΎααΆαααααααα ααΆαααααααααα ααΆααααα ααααα»αα»ααΆααααααΆαααααααααα ααΆαα·ααΆααααα»αααΆαααΆαααΆαααΆααΎα’αααααΆααΆαααααΎααΆαααααΆααααααΌαα―αααΆαααα αα·αααΌαα ααα»α’αααΈα ααΎααΆααααΆααααα»ααααΆ? ααΆααααα·αααααααΎα αααααΆααααααααααααα·αααααααΆα αααΎα ααΆααΆαααΆααααααΆααααΆαααααα»αααΆαααααααα ααΆαααααααααααααααααααααααΆα αα·ααα»αααΆααααααα
ααααααααααα»αα»ααΆαα’αα»ααααΆαα±ααα’αααααααααα ααααααααΆααααΌαααΆααααααΎα αααααα’αααΈαααααΆααΆα αα»αααΆαα’αααΈααααααααΌαααΆαααΎα/αα·α α αΎαα’αααααΆααΆα’αααααα½ααα»αααααΌαα ααααααΆαααααΆααααααΌαααΆαα½ααα αααα»αααΆαααααααα ααΆααααααααα ααΆααΆααα·αααΆαα ααΆααααααΆαα»αααΆαααααααα αααα»αααααα»αα»ααΆααα½ααααααΌαα±ααααΆαααΆααα·αααααααΉαααααααα½αα ααα½α ααΌα ααααα’αααααααΌαααααΎααΆααααααα α α·αααααααααααααΆααααααΉαα
αα»ααααααααα·αα·ααα»ααα·ααααα·
αααα»αα ααααααα ααΎαα»ααααααααα· αα·ααα»ααα·ααααα·αααα αα αααα·ααααΆαααααΆαααααΎα‘αΎαα
αα»ααααααααα·
ααΆαααααααααααΊααΆαααααΈαααα»αααΆαααααΆαααααααΆαααααααα ααΆααααααααααααααααα ααα αΆααααααΆαα αααααα
- αα·αα·αααααΆαααααααα
ααΆαααααααααα·αα·ααααα α’αα»ααααΆαα±ααα’αααααααΆαα
ααΆααααααααΊααααΉαααααΌαα - ααΆααΆααΆαααααααα
ααΆαααααααααααααΌααααα ααΆααααααΆ αα·ααΈααΆαααααααααααα
ααΆααααααααααααααααααααΌαααΆααααααα
ααααααΆααααα½αα’αααααααα’ααααα
αααΎααααα»αα αα
αααααααΎ Scala αα»αααΆαααΆααΆααΆα
αααΎαααΆααααααΆαααααααα’ααΆαααααααα
ααΆααααααααααααα’αααα α§ααΆα αααααΎαα’αΆα
ααααΎ
αααααααααααΆαααααααααααΆαααΎα αααααααΎααααα»αα αααΆαααΆαααααααααα»α ααΎαα’αΆα ααααα ααΎαααΆαααααααΆααααααΆααααα½αααααα»ααααα (DRY) αααα»ααα·ααΆαααΆααα»ααααααα α’αααα’αΆα ααααΎα±ααααααΆααααΆαα½αααααΆαααα αααα»αααΆαααααααα ααΆαααααααα (Seq
,Map
ααααΆααααααΆαααααα½α) α - DSL Scala ααΆααααααααα·αααααΆααΆαα½αα ααα½ααααααααΎα±ααααΆααΆααααααΆααααα½ααααα»αααΆααααααΎα DSL α ααΆα’αΆα αα αα½α αααα»αααΆαααΆαααα’αααααααααααααΈαααααααα·αααααΆααααα αα·αα’αα»ααααααΆααΆααΆαααααααα ααΆαααααααααααααΆααααααΆααααα½ααααααΆαααααα»αα’αααααααΎααααΆααααααα ααΌα ααααααΆαααααααα ααΆααααααααααΊα’αΆα α’αΆαααΆααααα’αααααααΆαααααααΆαα αα ααΆααα ααΆα§ααΆα ααα α’αααα―ααααα’αΆα α αΌααα½ααααα»αααααΎαααΆααα·αα·αααααΆαααααααα ααΆααααααααα
- αα»α αα·αααΆα αα·αααααΆααααααααΆαααααΆααα αα»ααααααααα·αα½αααααΆαααΆαααΆαααααααα ααΆααααααααααααααααααα ααα αΆαααΆααααΌαααααααααΆαα»ααα α ααα»α αααα½αααΊααΆαααααααΆααα’ααααααΌαααΆααααααΆααααΆααα·αααααΆααααααα αΎααααααΆααααααααΎα‘αΎααα·ααα αααααααΈααααααααααα½αααααααΌαααΆαα ααΆαααααΎαααααα phantom ααΎααααΈαααααΆαα αααααΆααΆααΆααααΆαααααα»αααααΎαα·ααΈααΆααααααααΌαααααΆαα αααα»αααΆαααααααα ααΆααααααααααααααααααααΉαααααΌαα ααΆαααΆαααΆαα’αΆαααααααΆααΆαααααα·α αα α αααΆααααΆαααααΆαααααΆαα ααΆααΆααΆααααΆααααααΆααα’ααααααΌαααΆαααααΆααα
- ααΆαααααΆααααααΌααα»αααΆααααααα ααΆαααααΆααααααΌαααΆαααααααα ααΆαααααααααααααααΎααααΎαααΆαα’αα·ααααααααΌαα ααααΎα±ααααΆα’αΆα αααααα ααΆαααΌααααααααΆααα»αααΆαααααααααααΆααααΆαααααααα ααΆαααααααααααααα
- ααΆαααααΎαα αα α»ααααααααΆαααΆαααααααα ααΆαααααααααααα»ααααααααΆαααααΆα ααΆαααΆααα±ααααααΎααααΆαααααααααααααααααααααααααα·αααααΆααααΈααΆαααααΆααααααΌαααΆααααααααΆααΆααΆααααΆααααΆααα’ααααααΌαααΆαααααΎαα αα α»ααααααααΆαα
- ααΆαααααΎα±αααααααα·ααΈααΆααααα½αα αααααα·ααΈαα·αααααΌαααΆαααΆααα·ααΆα ααΆααααα½ααα·αα·αααααΆαααααααα ααΆαααααααα α¬ααΆααααααααααααααααα·αααααΉαααααΌαααα αααααΆαααααααααΆααααα»αααααΆααααααααα·ααΈα (ααΆααααα»αααααΆαααααΆαααααααα ααΆαααααααααα½αα ααα½ααααααΆααααααααα αααα»αα§ααΆα αααααααααΎααα·ααααααΆαα»αααααααααααΆαααααααα ααΆαααααααααααααΆαα αααααααααα ααα»ααααααααΆααααααΆααΆααααααα α α·αααααααααααααααΆαααΈααααααα»ααααααααααααΆααααΆαααα»αααΆααααααααΌααα»ααααα·ααΆαααααααααααΆααααα) ααΆααΆααααα½αααΆαααααα»αααΆααααααααα ααΆααααααααααααΆαα·α - ααααΆααααα’αα»ααααααΆαααΆααα αααααα ααΌα αααα ααΆα§ααΆα ααα α’αααα’αΆα α αΆααααααΎαααΆαα½αααΉαααΆαααααααα ααΆαααααααααααααΆαα ααααα ααααααααΆαααΆαα’αα»αααααααααααααα·αα αΆαααΆα ααα αΌααααααααααααΆαα·αααΆααααΌαααΆαα
- ααΆαααααααα ααΆαααααααααααααΆααααααααααΆααα αααααΆαααΆαααααΆααααααΌαααΆαααααααα ααΆααααααααααααΎααΆααααααΆαααΆααααααΆααααΆαααααΆααααααΌααααααααα αααααααααααΎαααα½αααΆαααΊααΆααααα»αα»ααΆααααααΆααααααααα½ααααα αααα’αα»ααααΆαα±ααααΎααααα‘αααα αααααα»αααααΆαααααααα ααΆααααααααααααα·αααΎα αΆαααΆα αα ααΎααααααΆααα’αΆα ααααΎααΆααααααααΈαα½αααααΆααα»α α αΎαααααααααααΉαααααΎαααΆαααΌα ααααΆααααα·αα ααΆαααααααα ααΆααααααααααΆααααααααΆαααααΎα’αααααααΎαα‘αΎαααΌαααΆαααααΆαααα αα·αααΆαααΏααΆααααααααααααα ααα αΆαα αααααΆαααΆαααααααα ααΆααααααααααααΌαααΆααα½ααα»ααα ααααΆααααΆαα ααααα ααΆαα·αααΆααααΆαααΆαααααα»αααΆαααααααααααααΆαα αααα»αααΆαααα·αα
- αααΌαα»αα ααααααααααααααΆαααααΎα‘αΎαααΊαααΌαα»α α αΎααααΌαα»αα’αΆα ααααΌαααΆααα½ααααα αΌαααααΆααΆααα·ααΈααααααααααΆααΎααααΈαααααΎαααααααααααααααα ααΆαα·ααα α’αααα’αΆα ααααααα ααΆααααααααααααααααα±ααααααΎαααΆαααΎααααΆαααααα½ααααα»αααααΆααα½α αα·ααα ααΎααααΆααα αααΎααααα»ααα½ααααα α’αααα’αΆα αααααΎαααΆαααααααα ααΆααααααααααΆα αααΎααααααΆααα§ααΆα αααααα·αααααααααααααααα
- ααΆαααααΎαααααα αααααΆααααα½αααααΆααααααΈαα½αααααααααα»αααααααααΆα α’αααα’αΆα ααα½αααΆαααααααΆα αααΎααααααααααααααααΆααααα½ααααααΆααααΆαααααΎαααααα
- ααΆαααααΎααααααα½ααααα αΌαα ααΆαααΆαααΆαααααααα ααΆαααααααααααα½ααααααΆααααααααααα ααα αΆαααΆααααΌαααααΎα±ααααΆα’αΆα ααααΎαααΆααααΆαααΆαα»ααΆααα’αααα αααα»αααα·ααΆααΆααααααΆααααααααααααΆαααααααααΆαααααΎααααααα½ααααα αΌαα ααΆααΆααααα½ααααα»αααΆαααααΆααααΆα α§ααΆα ααα ααααΆαααΆααααααααΆαααα½αα ααα½αα’αΆα α αΌαααααΎααΆαα
αα»ααα·ααααα· αα·ααααααααα
ααΆαααααααα ααΆαααααααααααααΆαα ααααααα»αααΈαα·ααΈααΆαααααααααααα ααΆαααααααααααααααα α αΎααααα ααααΆαα·ααααααααααααΆαααααααα·ααΈαα½αα ααα½αα ααΆαααααααααααΆαα»ααα·ααααα·αα½αα ααα½αα
- ααΆαααααααα ααΆαααααααααα·αα·ααααα αααααααα’αααααααΌααααααααΌαααΆαααααααα ααΆαααααααααααα»αααα·ααααααααΆαααΆαααα αα αααααααααααααΆαααΆαααΆαααΆααα’ααα ααΆαα½αααΉααα·ααΈααΆααααααααααΆα’αΆα αα·ααΆαααΆαα αααΆαα αα ααΆαα ααΆαα ααααα αα·αααΆαααΆααα±ααααααΎααααΆαααααααααααααααααα·ααΉααα ααααααΌαααΆαααΆαααΆαα αααααΊααΆααΆααααααααααΆααααααααααααα·ααΈααΆααααα αα·ααα»ααα·ααααα·αα αααα»αααααΈαα½αα ααα½αα
- ααΆααααααΎαααΆαααααααα ααΆααααααααα αααα»αααααΈαααα―αααΆαααααααα ααΆααααααααααααΌαααΆααααααΎααααα§αααααααααααααααααα· ααΆααα·αααααααΉααααααααααααα’αΆα ααααΌαααΆαααΆαααΆαααΎααααΈαααα αΌαααααααΈαααααΆαααΆα
- α§αααααα αα αα α»αααααα α§αααααααααΎααααΆαα αα·ααα αα ααααααααααααΌαααΆααα ααΆα‘αΎαααΎααααΈααααΎααΆαααΆαα½αααΆαααααααα ααΆααααααααααΊααα’ααααΎα―αααΆαα’αααααα αα·αααααααααα§αααααααααΎααααΆαα/αα αα αααααααααααααΉαααΆααα αααα»αααΆαααααααα ααΆαααααααααααααΆαα ααααααααααα
- αααααΌαα²ααααΆαααΆαααααΆααααααΌαα’αΆαααααα·αα·ααΆα α’αααα’αα·αααααα αα·α DevOps αααΆαααΉαα―αααΆαα’αααααα αααα·αβααβααΆαβα αααααβααΆαβαααααβαα ααΆααααααααβαααα ααβααΆβαα·αβααΉαβααααΆαβαααβαα·αβαα·αβααααααααΈ α αΎαβαααααΆαβα±ααβααΆαβααΆαβααα·αααα
- ααααΎαααΆαα’αα·αααααααααααΆααα»αααΆααααααααααΌαααΆαααΆαααΆαα ααΎααααΈααΆααααα½αααααΎααΆαααααααα ααΆαααααααααααααΆαα ααααα ααααααααααααα·ααααααααααααααααΎαααΆαααΆαααα αα·αααΆαααααααΆααααααα·ααΈ (CI/CD) ααΊα αΆαααΆα αα ααΎαα·αααΌα ααααααααΆααΉαααΆαααΆααα’αΆαααα’α½αααΆααα
α αΌαααΎαααααααα ααΎαααααααααα½αα ααα½αααα§ααΆα ααααααααΆααα·α αΆαααΆααααα·αααΆαααααα ααΉααααα·αααααΆαααααααα ααΆααααααααα ααααααα½α:
- ααααα·αααΎααΎααααααααααααΆαααΆαααααααα
ααΆααααααααααααα·αα
αΆαααΆα
αααααα·αααααΌαααΆαααααΎααααΆαααααααααΆαα αααα’αααα
αααααααΉααα·ααα½αααΎαααααΎαααΆαα’αα»αααααααααΆαααααααα αααα αΆαααα’αΆα
αααααααΆαααΆααααααΆαααααααα
ααααααΌααααα α αΎαααααΎααααααααΉαααΆαααα α§ααΆα αααα
HList
α¬αααααααα·αααααααα·αααα·α (ααααΆααααααΈ) ααΎααααΈααααΆαα±ααααΆαααααααα ααΆααααααααα - ααΆααααααΆαααα
αααα»αα―αααΆαααααααα
ααΆααααααααααααα·αααΆααααααΉαααΆαααααααα
ααΆαααααααααααα½αααΆα (
package
,import
ααα ααααΈαααααΆαααααα»;override def
's αααααΆααβαααΆαααΆααααααβαααβααΆαβαααααβααααΆαααΎα)α αααα’αΆα ααααΌαααΆααααααΆαααααααααααααα·αααΎα’αααα’αα»αααα DSL ααααΆαααααα½αααααα’αααα ααΎαααΈααα ααααααααααααααααααΆαααααααα ααΆαααααααα (α§ααΆα ααα XML) ααααΆααααααα·αααΆααααΆααααΎαα ααΆααααααααα―αααΆααααααα - αααααΆαααααααααααααΆααααα ααααα ααΎααα·ααα·α αΆαααΆααΎααΆαααααααα ααΆααααααααα‘αΎααα·αααΆαααααααα αααααααααααΆααααααααααααΆααα
ααα ααααΈααααα·ααααΆα
αα αααα»αααΆααααααΆαααα ααΎαααΆαααααααααααΈαααα·αααααΆαααααΆαα±ααααΆαααααααα ααΆαααααααααα αααα»αααΌαααααααααααααΎαααααααΆαααααα·αααααααααααααααααααααα Scala α αα·ααΈααΆααααααααα’αΆα ααααΌαααΆαααααΎαα αααα»ααααααα·ααΈααααααααΆααΆααααα½ααα·ααΈααΆαααααααααααα ααΆααααααααααααααααααΈαααααα’ααααΎα―αααΆα xml α¬α’αααααα αααααΈααΆα§ααΆα αααααααααΎαααααΌαααΆαα’αα»αααααα αααα»α Scala ααααα αααααα·αααΌα ααααΆα’αΆα ααααΌαααΆαααααααα ααΆααΆαααααΆαα ααααααααααααα (ααΌα ααΆ Kotlin, C#, Swift, ... )α α’αααα’αΆα ααΆααααααα·ααΈααΆαααααααααα αααα»ααααααααα½ααααα»αα ααααααααααααΆαααααα α αΎαααααα·αααΎααΆαα·αααααΎαααΆα ααΌααααααα α―αααΆαα’ααααααααααααααααααααααααΆααα
ααΆαααααααΆαα· ααΆαααααααα ααΆαααααααααααααΆαα αααααααΆαααΆαααααΎαααΆαα’αα·αααααααααααααααα»αααΆααααααα αα αααα»αααΆααααα‘αααααα·α αα»αααΆαααααα αα·αααΆαααΏααΆααααααΆαααααααα ααΆααααααααααααΌαααΆαααΆααΆα
αα·ααΈααΆααααααααααΆααα·α αΆαααΆα’αΆα ααααΌαααΆααααααΈα:
- α’αααα’αΆα ααααΎαααΆααααΌ ααΎααααΈαααα½ααα·αα·ααααααααααΆα αααααα
- α’αααα’αΆα α’αα»αααα DSL ααΎααααΈαααα αΆαααΆαααααααα ααΆααααααααααΆααααααααα’αΆα α αΌαααααΎααΆααααααΆααα’αααααααΎααααΆααα α»ααααααα
- α’αααα’αΆα α’αα»ααααααΆααααααααααααααΆαααΆαααααααΆαα½αααΉαααΆααααααααΌαααΆαααααααα ααΆαααααααααααααααααααααααα·α α§ααΆα ααα ααΆαααααΆααααααΌαα ααα½αααααΆαααααα»αα ααααααααααΌαα±αα (1) ααααΆααααΈαα½ααααα½αααΆαααΆαααααααα ααΆαααααααααα»αααααΆααααα·α α (2) α’ααααααααααααα αααααααΆαααα½αααααααΆαα’αααΈααααΆααααααΈα
ααΆαααΉααα»α
αααα»αααΌααααααα’ααααα»αααα Andrei Saksonov, Pavel Popov αα·α Anton Nekhaev αααααΆααααΆααα·αααααααα»ααααααααΆαααΆαααααα½αααα ααααααα ααααΈααααΆαα
ααααα: www.habr.com