ืื ื ืจืืฆื ืืกืคืจ ืืื ืื ืื ืื ืืขื ืืื ืืื ืืขืืืื ืขื ืชืฆืืจื ืฉื ืืขืจืืช ืืืืืจืช. ืืชืฆืืจื ืืืืฆืืช ืืฉืืจืืช ืืฉืคื ืืืืืจืช (Scala) ืืืืฆืขืืช ืกืืืื ืืืืืื. ืคืืกื ืื ืืกืคืง ืืืืื ืืชืฆืืจื ืืื ืืื ืืืืืืื ืฉืื ืื ืฉื ืืืฉืื ืชืฆืืจื ืืืืืจืช ืืชืืืื ืืคืืชืื ืืืืื.
ืืืื
ืื ืืืช ืืขืจืืช ืืืืืจืช ืืืื ื ืคืืจืืฉื ืฉืื ืืฆืืชืื ืืฉืชืืฉืื ืืชืฆืืจื ืื ืืื ื, ืืืกืื ืืจื ืช ืขื ืฆืืชืื ืืืจืื. ืืื ืืืืืืืช DevOps (terraform, ansible ืื ืืฉืื ืืื) ืืฉืืฉืืช ืืืจื ืืื ืืืฆืืจืช ืงืืฆื ืชืฆืืจื ืืืืืืืืช (ืืขืืชืื ืงืจืืืืช ืกืคืฆืืคืืื ืืื ืฆืืืช). ืื ื ืื ืจืืฆืื ืืืืืช ืืืืืื ืฉืื ืืฆืืชืื ืืืชืงืฉืจืื ืืฉืชืืฉืื ืืคืจืืืืงืืืื ืืืื (ืืืื ืืืชื ืืจืกื). ืืืจืช, ืื ืชืืืืืช ืชืืื ืืืื ืืช ืืืขืจืืช ืืืืืืจืช ืฉืื ื. ืืขืืื JVM, ืืืช ืืืฉืืืืช ืฉื ืืจืืฉื ืื ืืื ืฉืืฉ ืืืฉืชืืฉ ืืืืชื ืืจืกื ืฉื ืืกืคืจืืื ืืืืืื ืืช ืืืืขืืช ืืคืจืืืืงืื ืืื ืืงืื.
ืื ืืืื ืืืืงืช ืืขืจืืช ืืืืืจืช? ืืืืื, ืื ื ืื ืืืื ืฉืืื ืืจืืืืื ืืฉ ืืืืงืืช ืืืืื ืืคื ื ืฉืื ื ืขืืืจืื ืืืืืงืืช ืืื ืืืจืฆืื. (ืืื ืฉื ืืื ืืืฆืข ืืงืกืืจืคืืืฆืื ืฉื ืชืืฆืืืช ืืืืงื ืืืื ืจืืฆื, ืขืืื ื ืืกืคืง ืื ืงืืืฆื ืืื ืฉื ืกืคืจืืืช ืืฉืื ืืืืืงื ืืืืื ืืจืืฆื.)
ืืฉืขืืืืื ืขื ืืืื ื ืืื ืืืจืฆืื, ืืจืื ืงื ืืืชืจ ืืืฉืชืืฉ ืืืืชื ื ืชืื ืืืืงื ืืื ืืงืื ืืื ืืฆืืชืื. ืื ืฉืขืืื ื ืืขืฉืืช ืืื ืืืืื ืฉืืฉืชืืฉืื ืืืืชื ื ืชืื ืืืืงื ืืืื ืจืืฆื. (ืืื ื ืื ืืคืฉืจื ืืืืืืื ืืืคืขืื ืฆืืชืื ืฉืื ืื ืขื ื ืชืืืื ืฉืื ืื, ืืื ืื ืืืกืืฃ ืืืจืืืืช ืืชืฆืืจื ืืืืืืช ืืืงืฉืืื ืขื ืืืืงืืช ืคืจืืกื ืืืื ืืืจืฆืื.) ืืืืจืืช ืคืืกื ืื, ืื ื ืื ืืืื ืฉืื ืืฆืืชืื ืืฉืชืืฉื ืืืืชื 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)
ืกืืื ืคืื ืืื
ืืื ืืืืืช ืืช ืืคืจืืืืงืื ืืืื ืืงืืืคืืืฆืื, ืื ื ืืฉืชืืฉืื ืืคืจืืืจ type ืฉืืื ื ืืฉืืืืฉ ืืชืื ืืืืืงื. ืืืืื ืื ื ืืืขืช ืืืขืืืื ืฉืื ื ืื ืืฉืชืืฉืื ืืืืคืข ืคืจืืืืงืื ืืืื ืจืืฆื, ืื ื ืจืฆื ืฉืืืืืจ ืืืืืง ืชืืืืืช ืืคืจืืืืงืื. ืขื ืืื ืฆืืื ืืคืจืืืืงืื, ืื ื ืืื ืืืขืืืจ ืฉืืจืืช ืื ืืืื ืืชืืืช.
ืืื ืืคืจืืืืงืืืื ืื ืคืืฆืื ืืื ื-REST API ืขื ืืกืืจืช Json:
sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]
ืืืคื RequestMessage
- ืกืื ืืงืฉื, ResponseMessage
- ืกืื ืชืืืื.
ืืืืื, ืื ื ืืืืืื ืืืฉืชืืฉ ืืชืืืืจื ืคืจืืืืงืื ืืืจืื ืืืกืคืงืื ืืช ืืืืง ืืชืืืืจ ืฉืื ื ืืืจืฉืื.
ืืืืจืืช ืคืืกื ืื, ื ืฉืชืืฉ ืืืจืกื ืคืฉืืื ืฉื โโืืคืจืืืืงืื:
sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]
ืืื ืืืงืฉื ืืื ืืืจืืืช ืืืฆืืจืคืช ืืืชืืืช ื-URL ืืืชืืืื ืืื ืืืืจืืืช ืืืืืืจืช ืืืืฃ ืชืืืืช ื-HTTP.
ืชืฆืืจืช ืืฉืืจืืช ืืชืืืจืช ืืคื ืฉื ืืฉืืจืืช, ืืืฆืืืืช ืืืชืืืช. ืืืื ืืื ืืื ืืืืืื ืืืืืช ืืืืฆืืื ืืกืงืืื ืืืื ืืจืืื (ืืืืืื, 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
. ืืคืจื, ื-echo client ืื ื ืืืจืฉืื ืืช ืืืชื ืคืจืืืืงืื. ืืื, ืืืฉืจ ืืืืจืื ืฉื ื ืฉืืจืืชืื, ืื ื ืืืืืื ืืืืืช ืืืืืื ืฉืืื ืืขืืื ืืื ืฉืฆืจืื.
ืืืืขืช ืฉืืจืืชืื
ื ืืจืฉืช ืคืื ืงืฆืื ืืื ืืืคืขืื ืืืืคืกืืง ืืช ืืฉืืจืืช. (ืืืืืืช ืืขืฆืืจ ืฉืืจืืช ืืื ืงืจืืืืช ืืืืืงื.) ืฉืื, ืืฉื ื ืืกืคืจ ืืคืฉืจืืืืช ืืืืฉืื ืชืืื ื ืืื (ืืืืืื, ื ืืื ืืืฉืชืืฉ ืืืืืงืืช ืกืื ืืืืืกืกืืช ืขื ืกืื ืืชืฆืืจื). ืืืืจืืช ืคืืกื ืื ื ืฉืชืืฉ ืืชืื ืืช ืืขืืื. ื ืฆืื ืืช ืืฉืืจืืช ืืืืฆืขืืช ืืืืงื 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](()))
}
(ืก"ื.
ะธ
ืฆืืืช ืืื ืืืืืืงื ืฉืืืื ืืืคืขืื ืืกืคืจ ืฉืืจืืชืื (ืืฉืงื ืฉื ืฉืจืฉืจืช ืืฉืืืื ืืืืืืช ืขื ืืื ืชืื ืืช ืืขืืื):
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 ืขื
ืืชืืืืช ืืืืืจ ืืื ืืคืขื ืืช ื-build. ืื ืืงืืคื ืืืคืขืื ืืืืงืืช.
ืืืงืจื ืื, ืืคืื ืงืฆืื ืชืืื ืืืืขื ืืืืคื ืกืืื ืื ืืชื ืืืืฆื ืืืชื ืืงืื ืืืืคืื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
ืืื, ืืฆืืืช ืืืงืื ืืกืชืืื ืืืืจ ืืื ืื. ืก"ื.
ืชืืืื ืคืืชืื ืืืื
ืืืื ื ืจืื ืืืฆื ืืืฉืช ืืชืฆืืจื ืืื ืืฉืคืืขื ืขื ืชืืืื ืืคืืชืื ืืืืื.
ืืชืฆืืจื ืชืงืืืคื ืืื ืขื ืฉืืจ ืืงืื ืืืืืืฆืจ ืืคืฅ (.jar). ื ืจืื ืืืืื ื ืืฉืื ืืช ืืชืฆืืจื ืืืคืฅ ื ืคืจื. ืืกืืื ืืื ืืื ืฉืืืืืืช ืืืืืช ืื ื ืืกืคืจ ืชืฆืืจืืช ืืืืืกืกืืช ืขื ืืืชื ืงืื. ืฉืื, ื ืืชื ืืืฆืืจ ืืคืฆืื ืืชืืืืื ืืขื ืคื ืชืฆืืจื ืฉืื ืื. ืืชืืืช ืืืจืกืืืช ืกืคืฆืืคืืืช ืฉื ืกืคืจืืืช ื ืฉืืจืืช ืืื ืขื ืืชืฆืืจื, ืืืจืกืืืช ืืื ื ืฉืืจืืช ืื ืฆื ืืื ืคืขื ืฉืื ื ืืืืืืื ืืคืจืืก ืืช ืืืจืกื ืืื ืฉื ืืชืฆืืจื.
ืื ืฉืื ืื ืชืฆืืจื ืืืคื ืืฉืื ืื ืงืื. ืืืื, ืื ืืื
ืืฉืื ืื ืืืืกื ืืชืืืื ืืืืืช ืืืืืืช ืืจืืื:
ืืจืืืก ืืืขืงื ืืืจ ืืืืื -> ืืืกื ืฆืืืืจ -> ืกืงืืจื -> ืืืืื ืขื ืกื ืืคืื ืจืืืื ืืืื ->
ืืื ืืืจืฆืื -> ืคืจืืกื
ืืืฉืืืืช ืืขืืงืจืืืช ืฉื ืืืฉืื ืชืฆืืจื ืืืืืจืช ืื:
-
ืืชืฆืืจื ืชืืื ืขืงืืืช ืืื ืืฆืืชืื ืฉื ืืืขืจืืช ืืืืืืจืช. ืืฉื ืืขืืืื ืฉืื ืืฆืืชืื ืืงืืืื ืืช ืืืชื ืชืฆืืจื ืืืงืืจ ืืืื.
-
ืื ืืขืืืชื ืืฉื ืืช ืืช ืืชืฆืืจื ืจืง ืืืื ืืืฆืืชืื. ืืื, "ืกืืฃ ืชืฆืืจื" ืืื ื ืกืืืจ.
-
ืื ืืืคื ืืืืืช ืงืฉื ืืืชืจ ืืืฆืข ืฉืื ืืืื ืงืื ืื ืืชืฆืืจื.
-
ืจืื ืฉืื ืืื ืืชืฆืืจื ืืชืจืืฉื ืืืืง ืืชืืืื ืืคืืชืื ืืืืื ืืืืื ืืคืืคืื ืืืืืงื.
ืืื ืื ื ืฆืจืื ืืืืจ ื ืคืจื ืืื ืืืืกื ืืช ืชืฆืืจืช ืืืืฆืืจ? ืชืฆืืจื ืื ืขืฉืืื ืืืืื ืกืืกืืืืช ืืืืืข ืจืืืฉ ืืืจ ืืืืื ื ืจืฆื ืืืืืื ืืช ืืืืฉื. ืืืชืืกืก ืขื ืื, ื ืจืื ืืืืื ื ืืืืกื ืืช ืืชืฆืืจื ืืกืืคืืช ืืืืืจ ื ืคืจื. ืืชื ืืืื ืืคืฆื ืืช ืืชืฆืืจื ืืฉื ื ืืืงืื - ืืื ืืืืื ืืืืจืืช ืชืฆืืจื ื ืืืฉืืช ืืฆืืืืจ ืืืื ืืืืื ืืืืจืืช ืืืืืืืช. ืื ืืืคืฉืจ ืืจืื ืืืคืชืืื ืืงืื ืืืฉื ืืืืืจืืช ื ืคืืฆืืช. ืืคืจืื ืื ืงืื ืืืฉืื ืืืืฆืขืืช ืชืืื ืืช ืืื ืืื ืืืืืืืช ืขืจืื ืืจืืจืช ืืืื.
ืืจืืืฆืืืช ืืคืฉืจืืืช
ืืื ื ื ืกื ืืืฉืืืช ืืช ืืชืฆืืจื ืืืืจืืืช ืขื ืืื ืืืืคืืช ื ืคืืฆืืช:
- ืงืืืฅ ืืงืกื ืืืืฉื ืืืขื.
- ืื ืืช ืืคืชื-ืขืจื ืืจืืืืช (
etcd
/zookeeper
). - ืจืืืื ืชืืืื ืฉื ืืชื ืืืืืืจ/ืืืคืขืื ืืืืฉ ืืืื ืืืคืขืื ืืืืฉ ืืช ืืชืืืื.
- ืืืกืื ืชืฆืืจื ืืืืฅ ืืืคืฆืื ืืืงืจืช ืืจืกืืืช.
ืงืืฆื ืืงืกื ืืกืคืงืื ืืืืฉืืช ืืฉืืขืืชืืช ืืืืื ืช ืฉืื ืืืื ืงืื ืื. ืื ืื ืืืขืจืืช ืืืื ืืืืื ืก ืืฆืืืช ืืืจืืืง, ืืืฆืข ืฉืื ืืืื ืืงืืฆืื ืืืชืืืืื ืืืืคืขืื ืืืืฉ ืืช ืืฉืืจืืช. ืขื ืืืช, ืขืืืจ ืืขืจืืืช ืืืืืืช, ืืืืฉืืช ืืื ืขืฉืืื ืฉืื ืืืืืช ืจืฆืืื. ืืฉืื ืืืื ืฉืืืฆืขื ืืื ื ืืฉืืืจืื ืขืงืืืช ืืืขืจืืืช ืืืจืืช. ืืฃ ืืื ืื ืกืืงืจ ืืช ืืฉืื ืืืื. ืงืฉื ืืงืืืข ืื ืืืืืง ืืืฆืข ืืช ืืฉืื ืืืื ืืืืืื ืกืืื. ืฉืื ืืืื ืืื ื ื ืืืงืื. ืื ืืืขืจืืช ืืืคืฆืช, ืืื ืื ืขืฉืื ืืฉืืื ืืืฆืข ืืช ืืฉืื ืื ืืืชืืื ืืฆืืชืื ืืืจืื.
(ืืฉ ืืฆืืื ืื ืฉืฉืืืืฉ ืืชืฆืืจื ืืืืืจืช ืื ืกืืืจ ืืช ืืืคืฉืจืืช ืืืฉืชืืฉ ืืงืืฆื ืืงืกื ืืขืชืื. ืืกืคืืง ืืืืกืืฃ ืื ืชื ืืืืืช ืฉืืืืฆืจ ืืช ืืืชื ืืกืื ืืื ืคืื Config
, ืืืชื ืืืื ืืืฉืชืืฉ ืืงืืฆื ืืงืกื. ืืื ื ืืืข ืฉืืืืจืืืืช ืฉื ืืขืจืืช ืขื ืชืฆืืจืช ืงืืืคืืืฆืื ืงืื ื ืืืขื ืืืืืจืืืืช ืฉื ืืขืจืืช ืืืฉืชืืฉืช ืืงืืฆื ืืงืกื, ืืืืืื ืงืืืฆื ืืงืกื ืืืจืฉืื ืงืื ื ืืกืฃ.)
ืืืืจ ืืคืชื-ืขืจื ืืจืืื ืืื ืื ืื ืื ืืื ืืืคืฆืช ืืื ืคืจืืืจืื ืฉื ืืืฉืื ืืืืืจ. ืื ืื ื ืฆืจืืืื ืืืืืื ืื ืื ืคืจืืืจื ืชืฆืืจื ืืื ืื ืจืง ื ืชืื ืื. ืชื ื ืื ื ืคืื ืงืฆืื C => A => B
, ืืืคืจืืืจืื C
ืืฉืชื ื ืืขืชืื ืจืืืงืืช, ืื ืชืื ืื A
- ืืขืชืื ืงืจืืืืช. ืืืงืจื ืืื ืืคืฉืจ ืืืืื ืืช ืื C
- ืคืจืืืจื ืชืฆืืจื, ื A
- ื ืชืื ืื. ื ืจืื ืื ืคืจืืืจื ืชืฆืืจื ืฉืื ืื ืืื ืชืื ืื ืืื ืฉืื ืืืจื ืืื ืืฉืชื ืื ืืชืืืจืืช ื ืืืื ืืืชืจ ืืืฉืจ ื ืชืื ืื. ืืื ืื, ื ืชืื ืื ืืืจื ืืื ืืืืขืื ืืืงืืจ ืืื (ืืืืฉืชืืฉ), ืืคืจืืืจื ืชืฆืืจื ืืืงืืจ ืืืจ (ืืื ืื ืืืขืจืืช).
ืื ืืขืชืื ื ืืืจืืช ืืฉ ืืขืืื ืคืจืืืจืื ืืืฉืชื ืื ืืืื ืืืคืขืื ืืืืฉ ืืช ืืชืืื ืืช, ืื ืื ืืืื ืืืืืื ืืขืชืื ืงืจืืืืช ืืกืืืื ืฉื ืืชืืื ืืช, ืืืืืื ืฉื ืฆืืจื ืืืืฉืื ืืกืคืง ืคืจืืืจืื, ืืืืกื, ืื ืชื ืืืืืืง ืืืขืื ืขืจืืื ืฉืืืืื. ืืื, ืื ืงืืืช ืืืื ืฉื ืืคืืชืช ืืืืจืืืืช ืฉื ืืชืืื ืืช, ืืืืื ื ืืฆืืฆื ืืช ืืกืคืจ ืืคืจืืืจืื ืฉืืืืืื ืืืฉืชื ืืช ืืืืื ืคืขืืืช ืืชืืื ืืช (ืื ืื ืืชืืื ืืคืจืืืจืื ืืืื ืืืื).
ืืฆืืจื ืืคืืกื ืืื, ื ืืืื ืืื ืคืจืืืจืื ืกืืืืื ืืืื ืืืืื. ืื ืืืืืืื ืฉื ืืฉืืจืืช ืืืจืฉ ืฉืื ืื ืคืจืืืจืื ืืืืื ืคืขืืืช ืืชืืื ืืช, ืืื ื ืงืจื ืืคืจืืืจืื ืืืื ืืื ืืืื. ืืืจืช ืืืคืฉืจืืืืช ืื ืกืืืืืช ืื ืืชื ืืืืืืจ ืืืชื ืืืืฆืขืืช ืืชืฆืืจื ืืงืืืคืืืืืช. ืขืืืจ ืืืืจื ืืืืฉ ืืื ืืืช, ืืืชืื ืฉื ืฆืืจื ืื ืื ืื ืืืคืขืื ืืืืฉ ืฉื ืืืงืื ืืืชืืื ืืช ืขื ืคืจืืืจืื ืืืฉืื, ืืืืื ืืืืคื ืฉืื ืชืืืืื ืืขืจืืช ืืืคืขืื ืืืคืขืืื ืืืืฉ. (ืืืขืชื ื, ืจืฆืื ืืืืื ืข ืืืืืจื ืืืืฉ ืืืื ืืืช, ืฉืื ืืืืจ ืืืืื ืืช ืืืจืืืืช ืืืขืจืืช. ืืืืืช ืืืคืฉืจ, ืขืืืฃ ืืืฉืชืืฉ ืืืืืืืช ืืขืจืืช ืืืคืขืื ืืกืื ืืจืืืืช ืืฆืืจื ืืคืขืื ืืืืฉ ืฉื ืชืืืืืื).
ืืืื ืืฉืื ืืื ืฉื ืฉืืืืฉ ืืชืฆืืจื ืกืืืืช ืฉืืืจื ืืื ืฉืื ืืฉืงืื ืชืฆืืจื ืืืืฉ ืืื ืืืช ืืื ืืืื ืฉืืืงื ืืืขืจืืช ืืืชืื ืืืืฉ ืืืืจ ืขืืืื ืชืฆืืจื (ืืฉืืชื). ืืืขืฉื, ืื ื ืฆืืจื ืืืฆืข ืฉืื ืืืื ืืชืฆืืจื ืืกืืืืช, ื ืฆืืจื ืืืคืขืื ืืืืฉ ืืช ืืืขืจืืช ืืื ืฉืืขืจืืื ืืืืฉืื ืืืื ืกื ืืชืืงืฃ. ืืขืืืช ืืื ืืืฉืืชื ืืฉืชื ื ืืืืืจืชื ืขืืืจ ืืขืจืืืช ืฉืื ืืช. ืืืงืจืื ืืกืืืืื, ืืชื ืืืื ืืชืืื ืืชืืื ืืืืฉ ืืืื ืฉืื ืืขืืืก ืืื ืืืื. ืื ืืชื ืฆืจืื ืืกืคืง ืฉืืจืืช ืจืฆืืฃ, ืืชื ืืืื ืืืืฉื
ืืื ื ืืื ืืขืช ืืช ืื ืืฉื ืฉื ืืืกืื ืืชืฆืืจื ืืชืื ืื ืืืืฆื ืื ืืืคืฅ. ืื ื ืืืกื ืืช ืืชืฆืืจื ืืชืื ืืคืฅ, ืื ืืคืืืช ืืืืชื ืื ื ืืืืื ืืช ืืืืช ืืช ื ืืื ืืช ืืชืฆืืจื ืืืืื ืืืจืืื ืฉื ืืืคืฅ. ืื ืืชืฆืืจื ื ืืฆืืช ืืืืฅ ืืืจืืืคืงื ืื ืฉืื, ืงืฉื ืืขืงืื ืืืจ ืื ืืืฆืข ืฉืื ืืืื ืืงืืืฅ ืืื ืืืืืข. ืืื ืื ืืฉืื? ืืืขืชื ื, ืขืืืจ ืืขืจืืืช ืืืฆืืจ ืจืืืช ืืฉืื ืฉืชืืื ืชืฆืืจื ืืฆืืื ืืืืืืชืืช.
ืืืจืกื ืฉื ืืคืฅ ืืืคืฉืจืช ืื ืืงืืืข ืืชื ืืื ื ืืฆืจ, ืืืื ืขืจืืื ืืื ืืืื, ืืืื ืคืื ืงืฆืืืช ืืืคืขืืืช/ืืืฉืืชืืช ืืื ืืืจืื ืืื ืฉืื ืื ืืชืฆืืจื. ืืืืื, ืืืกืื ืืชืฆืืจื ืืชืื ืืคืฅ ืืืจืฉ ืงืฆืช ืืืืฅ, ืื ืืชื ืฆืจืื ืืงืื ืืืืื ืืืฉืืืช.
ืืืชืจืื ืืช ืืืืกืจืื ืืช
ืื ื ืจืืฆื ืืืชืขืื ืขื ืืืชืจืื ืืช ืืืืกืจืื ืืช ืฉื ืืืื ืืืืืื ืืืืฆืขืช.
ืืชืจืื ืืช
ืืืื ืจืฉืืื ืฉื ืืชืืื ืืช ืืขืืงืจืืืช ืฉื ืชืฆืืจืช ืืขืจืืช ืืืืืจืช ืืืืืจืช:
- ืืืืงืช ืชืฆืืจื ืกืืืืช. ืืืคืฉืจ ืื ืืืืืช ืืืื ืืื
ืืชืฆืืจื ื ืืื ื. - ืฉืคืช ืชืฆืืจื ืขืฉืืจื. ืืืจื ืืื, ืฉืืืืช ืชืฆืืจื ืืืจืืช ืืืืืืืช ืืืืืคืช ืืฉืชื ื ืืืจืืืช ืืื ืืืืชืจ. ืืขืช ืฉืืืืฉ ื-Scala, ืืืืื ืจืื ืฉื ืชืืื ืืช ืฉืคื ืืืื ืืช ืืื ืืฉืคืจ ืืช ืืชืฆืืจื ืฉืื. ืืืฉื ืื ืื ื ืืืืืื ืืืฉืชืืฉ
ืชืืื ืืช ืขืืืจ ืขืจืื ืืจืืจืช ืืืื, ืืืืฆืขืืช ืืืืืืงืืื ืืงืืฅ ืคืจืืืจืื, ืื ื ืืืืืื ืืืชืืืืก ื-vals ืฉืืืืจืื ืจืง ืคืขื ืืืช (DRY) ืืืืงืฃ ืืืงืืฃ. ืืชื ืืืื ืืืคืขืื ืื ืฉืืขืืจ ืืฉืืจืืช ืืชืื ืืชืฆืืจื (Seq
,Map
, ืฉืืขืืจืื ืืืชืืืื ืืืฉืืช). - DSL. ื-Scala ืืฉ ืืกืคืจ ืชืืื ืืช ืฉืคื ืืืงืืืช ืขื ืืฆืืจืช DSL. ืืคืฉืจ ืื ืฆื ืืช ืืชืืื ืืช ืืืื ืืืืืืืข ืฉืคืช ืงืื ืคืืืืจืฆืื ืื ืืื ืืืชืจ ืืงืืืฆืช ืืืขื ืฉื ืืืฉืชืืฉืื, ืื ืฉืืงืื ืคืืืืจืฆืื ืชืืื ื ืืชื ืช ืืงืจืืื ืืคืืืช ืขื ืืื ืืืืื ืชืืื. ืืืืืื ืืืืืื, ืืืฉื, ืืืฉืชืชืฃ ืืชืืืื ืกืงืืจืช ืืชืฆืืจื.
- ืฉืืืืช ืืกื ืืจืื ืืื ืฆืืชืื. ืืื ืืืชืจืื ืืช ืฉื ืืชืฆืืจื ืฉื ืืขืจืืช ืืืืืจืช ืฉืืื ืืืืืกื ืช ืื ืงืืื ืืืช ืืื ืฉืื ืืขืจืืื ืืืฆืืจืื ืืืืืง ืคืขื ืืืช ืืื ื ืขืฉื ืืื ืฉืืืืฉ ืืืืจ ืืื ืืงืื ืื ืื ื ืืจืฉืื. ืฉืืืืฉ ืืกืืื ืคื ืืื ืืืืจืื ืขื ืืฆืืืืช ืืืืื ืฉืืฆืืชืื ืืฉืชืืฉืื ืืคืจืืืืงืืืื ืชืืืืื ืืื ืชืฆืืจืืช ืืืขืจืืช ืื ืืื ืืช. ืชืืืช ืืืื ืืคืืจืฉืช ืืื ืฆืืชืื ืืืืืื ืฉืื ืืฉืืจืืชืื ืืืืืจืื.
- ืฉืื ืืืื ืืืืืืช ืืืืื. ืืืฆืืข ืฉืื ืืืื ืืชืฆืืจื ืืืืฆืขืืช ืชืืืื ืคืืชืื ืืฉืืชืฃ ืืืคืฉืจ ืืืืืข ืืชืงื ื ืืืืืช ืืืืืื ืื ืืชืฆืืจื.
- ืขืืืื ืชืฆืืจื ืื ืืื ืืช. ืคืจืืกืช ืืขืจืืช ืืืืืืืืช ืืืืจ ืฉืื ืืื ืชืฆืืจื ืืืืืื ืฉืื ืืฆืืชืื ืืขืืืื ืื.
- ืคืืฉืื ืืืืฉืื. ืืืืฉืื ืืื ื ืืงืืง ืื ืืชืื, ืืืืงืช ืชืฆืืจื ืื ืืืคืื ืืขืจืืื ืฉืืืืื. ืื ืืงืืื ืืช ืืืจืืืืช ืืืืฉืื. (ืืืง ืืืืจืืืืช ืืชืฆืืจื ืฉื ืฆืคืชื ืืืืืื ืฉืื ื ืืื ืื ืชืืื ื ืฉื ืืชืฆืืจื ืืืืืืจืช, ืืื ืจืง ืืืืื ืืืืขืช ืืืื ืขืช ืืืจืฆืื ืืกืคืง ืืืืืืช ืืืคืืกืืช ืืืืื ืืืชืจ.) ืื ืงื ืืืืืจ ืืชืฆืืจื ืืจืืืื - ืคืฉืื ืืืฉื ืืช ืืืกืจ ืืืงืื. ืืื, ืืชื ืืืื, ืืืฉื, ืืืชืืื ืขื ืชืฆืืจื ืืืืืจืช, ืืืืืช ืืช ืืืืฉืื ืฉื ืืืงืื ืืืืชืจืื ืขื ืืืืขื ืฉืื ืื ืืืืช ื ืืืฅ.
- ืชืฆืืจื ืืืืืชืช. ืืืืืื ืฉืฉืื ืืื ืชืฆืืจื ืขืืงืืื ืืืจ ืืืืจื ืืจืืื ืฉื ืื ืฉืื ืื ืืืจ, ืืคืื ืฉืื ื ืืงืืืื ืืื ืืคืฅ ืขื ืืจืกื ืืืืืืืช. ืื ืืืคืฉืจ ืื ื, ืืืฉื, ืืืืืจ ืืืจืกื ืงืืืืช ืฉื ืืชืฆืืจื ืืืืืช ืืฆืืจื. ืื ืื ื ืืืืืื ืืคืืื ืืืฉืชืืฉ ืืชืฆืืจื ืืืคื ื ืฉื ื ืืืืขืจืืช ืชืขืืื ืืืืืง ืืืชื ืืืืจ. ืชืฆืืจื ืืฆืืื ืืฉืคืจืช ืืช ืื ืืืื ืืืืืื ืืช ืฉื ืืขืจืืช ืืืืืจืช. ืืืืืื ืฉืืชืฆืืจื ืงืืืขื ืืฉืื ืืืืืืจ, ืื ืงืฉื ืืืืืฃ ืืืชื ืืืืฆืืจ.
- ืืืืืืจืืืช. ืืืกืืจืช ืืืืฆืขืช ืืื ืืืืืืจืืช ืื ืืชื ืืฉืื ืืช ืืืืืืืื ืืืจืืื ืฉืื ืืช ืืืฆืืจืช ืืขืจืืืช ืฉืื ืืช. ืืคืจื, ืืชื ืืืื ืืืืืืจ ืืช ืืืขืจืืช ืืคืขืื ืขื ืฆืืืช ืืืื ืืืชืืืืืช ืืืช, ืืขื ืืกืคืจ ืฆืืชืื ืืืืจ. ื ืืชื ืืืฆืืจ ืืกืคืจ ืชืฆืืจืืช ืขืืืจ ืืืคืขื ืืืฆืืจ ืฉื ืืืขืจืืช.
- ืืืืงื. ืขื ืืื ืืืืคืช ืฉืืจืืชืื ืืืืืื ืืืืืืืงืืื ืืืืืื, ื ืืชื ืืงืื ืืกืคืจ ืืจืกืืืช ืฉื ืืืขืจืืช ืฉื ืืืืช ืืืืืงื.
- ืืืืงืช ืืื ืืืจืฆืื. ืงืืื ืชืฆืืจื ืืืช ืืื ืืืขืจืืช ืืืืืืจืช ืืืคืฉืจืช ืืืคืขืื ืืช ืื ืืจืืืืื ืืกืืืื ืืืืงืจืช ืืืืง ืืืืืงืืช ืืื ืืืจืฆืื. ืงื ืืืงืืช, ืืืฉื, ืืฆื ืฉืื ืฆืืชืื ืืกืืืืื ืืืคืืื ื ืืืฉืื.
ืืกืจืื ืืช ืืืืืืืช
ืชืฆืืจื ืืืืืจืช ืฉืื ื ืืืืฉืืช ืชืฆืืจื ืืืจืืช ืืืืชืื ืฉืื ืชืชืืื ืืืืฉืืืื ืืกืืืืื. ืืืื ืืื ืืกืจืื ืืช:
- ืชืฆืืจื ืกืืืืช. ืืคืขืืื ืืชื ืฆืจืื ืืชืงื ืืืืืจืืช ืืช ืืชืฆืืจื ืืืืฆืืจ, ืืขืงืืฃ ืืช ืื ืื ืื ืื ื ืืืื ื. ืขื ืืืฉื ืื ืื ืืืื ืืืืืช ืงืฉื ืืืชืจ. ืืื ืืคืืืช, ืขืืืื ืืืืจืฉื ืงืืืคืืืฆืื ืืคืจืืกื ืืืืืืืืช. ืื ืื ืชืืื ื ืฉืืืืฉืืช ืฉื ืืืืฉื ืืื ืืืกืจืื ืืืงืจืื ืืกืืืืื.
- ืืฆืืจืช ืชืฆืืจื. ืืืงืจื ืฉืงืืืฅ ืืชืฆืืจื ื ืืฆืจ ืขื ืืื ืืื ืืืืืืื, ืืืชืื ืฉืืืืจืฉื ืืืืฆืื ื ืืกืคืื ืืื ืืฉืื ืืช ืกืงืจืืคื ื-build.
- ืืืื. ื ืืื ืืขืืฉืื, ืืื ืขืืจ ืืืื ืืงืืช ืฉื ืืขืื ืืขืืื ืขื ืชืฆืืจื ืืืืกืกืื ืขื ืงืืฆื ืืงืกื. ืื ืื ืืื ืืฉืืจืืช/ืืื ืืงืืช ืืืื ืืืื ืืืื ืื ืืชืฆืืจื ืืืืืจืช.
- ื ืืจืฉ ืฉืื ืื ืขืืืืช. ืืคืชืืื ื-DevOps ืจืืืืื ืืงืืฆื ืืงืกื. ืขืฆื ืืจืขืืื ืฉื ืืืืืจ ืฉื ืชืฆืืจื ืขืฉืื ืืืืืช ืืขื ืืืชื ืฆืคืื ืืืจืื ืืืืจืื ืืืืืื.
- ื ืืจืฉ ืชืืืื ืคืืชืื ืืืืืืช ืืืืื. ืขื ืื ืช ืืืฉืชืืฉ ืื ืืืืช ืืชืฆืืจืช ืืงืืืคืืืฆืื, ืืฉ ืฆืืจื ืืืืืืืฆืื ืืืื ืฉื ืชืืืื ืืื ืืื ืืืคืจืืกื ืฉื ืืืคืืืงืฆืื (CI/CD). ืืืจืช ืื ืืืื ืื ืื ื ืื.
ืืื ื ืชืขืื ืื ืขื ืืกืคืจ ืืืืืืช ืฉื ืืืืืื ืื ืืฉืืช ืฉืืื ื ืงืฉืืจืืช ืืจืขืืื ืฉื ืชืฆืืจื ืืืืืจืช:
- ืื ื ืกืคืง ืืืืข ืชืฆืืจื ืืืืชืจ ืฉืืื ื ืืฉืืืืฉ ืขื ืืื ืืฆืืืช, ืื ืืืืืจ ืื ืืขืืืจ ืื ื ืืืืืช ืืช ืืืืืืฉ ืืืกืจ. ื ืืชื ืืคืชืืจ ืืขืื ืื ืขื ืืื ื ืืืฉืช ืืคืืก ืืขืืื ืืฉืืืืฉ ืืกืืืื ื ืืงืฉืื ืืืชืจ, ืืืฉื,
HList
ืื ืกืืื ื ืชืื ืื ืืืืืจืืื (ืืืืงืืช ืืงืจื) ืืืืฆื ืชืฆืืจื. - ืืฉื ื ืฉืืจืืช ืืงืืืฅ ืืชืฆืืจื ืฉืืื ื ืงืฉืืจืืช ืืชืฆืืจื ืขืฆืื: (
package
,import
,ืืฆืืจืืช ืืคืฆืื;override def
ืขืืืจ ืคืจืืืจืื ืฉืืฉ ืืื ืขืจืื ืืจืืจืช ืืืื). ืื ืืืื ืืืืื ืข ืืืงืืช ืื ืืชื ืืืืฉื DSL ืืฉืื. ืื ืืกืฃ, ืกืืืื ืืืจืื ืฉื ืชืฆืืจื (ืืืืืื, XML) ืืืืืื ืื ืืืืืืช ืืกืืืืืช ืขื ืืื ื ืืงืืืฅ. - ืืืืจืืช ืคืืกื ืื, ืืื ื ื ืฉืืงืืื ืืืืจื ืืืืฉ ืืื ืืืช ืฉื ืืฉืืื ืฉื ืฆืืชืื ืืืืื.
ืืกืงื ื
ืืคืืกื ืื, ืืืงื ื ืืช ืืจืขืืื ืฉื ืืืฆืื ืชืฆืืจื ืืงืื ืืืงืืจ ืืืืฆืขืืช ืืืืืืืช ืืืชืงืืืืช ืฉื ืืืขืจืืช ืืกืื Scala. ืืืฉื ืื ืืืืื ืืฉืืฉ ืืืืฉืืืื ืฉืื ืื ืืชืืืืฃ ืืฉืืืืช ืชืฆืืจื ืืกืืจืชืืืช ืืืืืกืกืืช ืขื ืงืืฆื xml ืื ืืงืกื. ืืืจืืช ืฉืืืืืื ืฉืื ื ืืืืฉืืช ื-Scala, ื ืืชื ืืืขืืืจ ืืช ืืืชื ืจืขืืื ืืช ืืฉืคืืช ืงืืืคืืืฆืื ืืืจืืช (ืืืื Kotlin, C#, Swift, ...). ืืชื ืืืื ืื ืกืืช ืืืฉื ืื ืืืื ืืืคืจืืืงืืื ืืืืื, ืืื ืื ืื ืขืืื, ืืขืืืจ ืืงืืืฅ ืืืงืกื, ืืืืกืืฃ ืืช ืืืืงืื ืืืกืจืื.
ืืืืคื ืืืขื, ืชืฆืืจื ืืืืืจืช ืืืจืฉืช ืชืืืื ืคืืชืื ืืืืืืช ืืืืื. ืืชืืืจื, ืืืืืช ืืืืื ืืืืื ืืช ืฉื ืชืฆืืจืืช ืืืืืืช.
ื ืืชื ืืืจืืื ืืช ืืืืฉื ืื ืืฉืืช:
- ืืชื ืืืื ืืืฉืชืืฉ ืืคืงืืืืช ืืืงืจื ืืื ืืืฆืข ืืืืงืืช ืืื ืงืืืคืืืฆืื.
- ืืชื ืืืื ืืืืฉื DSL ืืื ืืืฆืื ืืช ืืชืฆืืจื ืืฆืืจื ื ืืืฉื ืืืฉืชืืฉื ืืงืฆื.
- ืืชื ืืืื ืืืืฉื ื ืืืื ืืฉืืืื ืืื ืื ืขื ืืชืืืช ืชืฆืืจื ืืืืืืืืช. ืืืืืื, ืฉืื ืื ืืกืคืจ ืืฆืืชืื ืืืฉืืื ืืืืื (1) ืื ืฆืืืช ืืงืื ืชืฆืืจื ืืขื ืฉืื ื; (2) ืื ืื ืืืฉืืื ืงืืื ืืืืข ืขื ืฆืืชืื ืืืฉืื.
ืชืืืืช
ืื ื ืจืืฆื ืืืืืืช ืืื ืืจืื ืกืงืกืื ืื, ืคืืื ืคืืคืื ืืื ืืื ื ืงืืื ืขื ืืืืงืืจืช ืืืื ื ืฉืืื ืขื ืืืืืช ืืืืืจ.
ืืงืืจ: www.habr.com