ืืคืืกื ืื ืืจืฆืื ื ื ืืฉืชืฃ ืืจื ืืขื ืืื ืช ืืืชืืืื ืขื ืชืฆืืจื ืฉื ืืขืจืืช ืืืืืจืช.
ืืชืฆืืจื ืืืืฆืืช ืืฉืืจืืช ืืฉืคืช Scala ืืฆืืจื ืืืืื. ืืืฉืื ืืืืื ืืชืืืจ ืืคืืจืื. ืืืืืื ืฉืื ืื ืฉื ืืืฆืขื ื ืืื ืื, ืืืื ืืฉืคืขื ืขื ืชืืืื ืืคืืชืื ืืืืื.
ืืืื
ืื ืืืช ืืขืจืืืช ืืืืืจืืช ืืืงืืช ืืืจืฉืช ืฉืืืืฉ ืืชืฆืืจื ื ืืื ื ืืงืืืจื ืืืช ืืื ืืฆืืชืื. ืคืชืจืื ืืืคืืกื ืืื ืฉืืืืฉ ืืชืืืืจ ืคืจืืกื ืืงืกืืืืืืช (terraform, ansible ืื ืืฉืื ืืืื) ืืืงืืฆื ืชืฆืืจื ืฉื ืืฆืจื ืืืืืืืืช (ืืขืืชืื ืงืจืืืืช - ืืืขืืืืื ืืื ืฆืืืช/ืชืคืงืื). ื ืจืฆื ืื ืืืฉืชืืฉ ืืืืชื ืคืจืืืืงืืืื ืฉื ืืืชื ืืจืกืืืช ืืื ืฆืืชืื ืืชืงืฉืจืื (ืืืจืช ื ืืืื ืืขืืืช ืฉื ืื ืชืืืืืช). ืืขืืื JVM ืื ืืืืจ ืฉืืคืืืช ืกืคืจืืืช ืืืืืขืืช ืฆืจืืื ืืืืืช ืืืืชื ืืจืกื ืืื ืืฆืืชืื ืืืชืงืฉืจืื.
ืื ืืืื ืืืืงืช ืืืขืจืืช? ืืืืื ืฉืขืืื ื ืืืฆืข ืืืืงืืช ืืืืื ืืื ืืจืืืืื ืืคื ื ืฉื ืืืข ืืืืื ื ืืื ืืืจืฆืื. ืืื ืืืืืช ืืกืืืืื ืืืืฆืื ืชืืฆืืืช ืืืืงื ืืืื ืจืืฆื, ืขืืื ื ืืืืื ืฉืืืืจืกืืืช ืฉื ืื ืืกืคืจืืืช ื ืฉืืจืืช ืืืืช ืื ืืกืืืืืช ืืื ืจืืฆื ืืื ืืกืืืืืช ืืืืงื.
ืืขืช ืืคืขืืช ืืืื ื ืืื ืืืจืฆืื, ืืขืชืื ืงืจืืืืช ืืจืื ืืืชืจ ืงื ืืงืื ืืช ืืืชื ื ืชืื ืืืืงื ืืื ืืฆืืชืื. ืื ืื ื ืจืง ืฆืจืืืื ืืืืื ืฉืืืชื classpath ืืฉืืฉ ืืคืจืืกื. (ื ืืชื ืืืฉืชืืฉ ื-classpaths ืฉืื ืื ืืฆืืชืื ืฉืื ืื, ืืื ืงืฉื ืืืชืจ ืืืืฆื ืืช ืืชืฆืืจื ืืื ืืืคืจืืก ืืืชื ืืฆืืจื ื ืืื ื.) ืื ืืื ืืฉืืืจ ืขื ืืคืฉืืืช, ื ืฉืงืื ืจืง ื ืชืืืื ืืืื ืืื ืืฆืืชืื.
ืืชืฆืืจื ื ืืื ืืืชืคืชื ืืื ืขื ืืชืืื ื. ืืืจื ืืื ืื ื ืืฉืชืืฉืื ืืืจืกืืืช ืืื ืืืืืช ืฉืื ืืช
ืฉืืื ืืชืคืชืืืช ืืชืืื ื. ืื ื ืจืื ืืืืื ื ืืืกืืช ืืช ืืชืฆืืจื ืื ืืืื ืืจืกืืืช ืืืืืืช ืชืฆืืจืืช ืฉืื ืืช ืขื ืืื ืชืืืืืช. ืื ืืฉ ืจืง ืชืฆืืจื ืืืช ืืืืฆืืจ, ืื ื ืขืฉืืืื ืืืฉืชืืฉ ืืืจืกื ืืืืืช ืืืืื. ืืคืขืืื ืขืฉืืืืช ืืืืืช ืื ื ืกืืืืืช ืืืฆืืจ ืืจืืืืช. ืืืื ืกืืืื ืืืชืื ืฉื ืฆืืจื ืขื ืฃ ื ืคืจื ืฉื ืชืฆืืจื. ืื ืชืฆืืจืืช ืขืฉืืืืช ืืืืืช ืืกืืื ืืช ืขื ืขื ืฃ ืืืจืกื ืืื ืืืืืช ืืืืคื ืืืืืื ืชืฆืืจืืช ืฉืื ืืช. ืื ืชืืืืช ืกื ืืฃ ืืืจืกื ืชืืืืืช ืืฉืืืื ืืืื ืฉื ืฆืืชืื ืืืืืจืื, ืืฆืืืืช, ืืฉืืืื ืืืฆืื ืืื, ืืจืกืืืช ืกืคืจืืืช ื ืชืื ืืืืงืืช ืืื ืฆืืืช. ืืื ื ืกืงืืจ ืจืง ืืช ืืขื ืฃ ืืืืื ืื ืืื ืชืฆืืจืืช ืืคื ืืจืกื ืขืฉืจืื ืืช ืฉื ืฉืืืฉื ืจืืืืื (1.2.3), ืืืืชื ืืืคื ืืื ืืคืฆืื ืืืจืื.
ืืกืืืืืช ืืืืจื ืืืช ืงืืฆื ืชืฆืืจื ืืื ื ืืฉืชื ืื ืืืชืจ ืืืืคื ืืื ื. ืืืจื ืืื ืื ืื ื ืืืืฆืจืื
ืงืืฆื ืชืฆืืจื ืืืื ืืคืจืืกื ื
ืืคืืกื ืื ื ืืื ืืช ืืจืขืืื ืฉื ืฉืืืจืช ืืชืฆืืจื ืืืคืฅ ืืงืืืคืืื.
ืชืฆืืจื ื ืืชื ืช ืืงืืืคืืืฆืื
ืืืืง ืื ื ืืื ืืืืืื ืฉื ืชืฆืืจื ืกืืืืช. ืฉื ื ืฉืืจืืชืื ืคืฉืืืื - ืฉืืจืืช ืื ืืืืงืื ืฉื ืฉืืจืืช ืื ื ืืฆืืื ืืืืืจ ืืืืฉืื. ืืืืจ ืืื ืืืคืขืืืช ืฉืชื ืืขืจืืืช ืืืืืจืืช ืฉืื ืืช ืขื ืฉื ื ืืฉืืจืืชืื. ืืื ืืื ืขืืืจ ืชืฆืืจืช ืฆืืืช ืืืื ืืืื ืืืจ ืขืืืจ ืชืฆืืจืช ืฉื ื ืฆืืชืื.
ืืขืจืืช ืืืืืจืช ืืืคืืกืืช ืืืจืืืช ืืืื ืฆืืชืื. ื ืืชื ืืืืืช ืืช ืืฆืืชืื ืืืืฆืขืืช ืกืื ืืืฉืื:
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]]
ืืืคืืกืื ืืขืืื ืื
ืึดืจึฐืืึนืช Int
ืืืชืจ ืืืืืืง ืจืง ืขืจืื 16 ืกืืืืืช ืฉืืืืืื ืืืืฆื ืืช ืืกืคืจ ืืืฆืืื. ืืื ืืจืืฉื ืืืฉืชืืฉ ืืกืคืจืืื ืื ืขืืืจ ืืืฉืช ืชืฆืืจื ืื. ืื ืคืฉืื ื ืจืื ืืชืืื ืืืื.
ืขืืืจ HTTP (REST) โโืืืื ื ืฆืืจื ืื ื ืชืื ืฉื ืืฉืืจืืช:
type UrlPathPrefix = Refined[String, MatchesRegex[W.`"[a-zA-Z_0-9/]*"`.T]]
case class PortWithPrefix[Protocol](portNumber: PortNumber, pathPrefix: UrlPathPrefix)
ืกืื ืคื ืืื
ืขื ืื ืช ืืืืืช ืคืจืืืืงืื ืืืืื ืืงืืืคืืืฆืื ืื ื ืืฉืชืืฉืื ืืชืืื ืช Scala ืฉื ืืฆืืจืช ืืจืืืื ื ืกืื Protocol
ืฉืื ื ืขืฉื ืื ืฉืืืืฉ ืืืืชื. ืื ืื ืฉื ืงืจื ืกืื ืคื ืืื. ืืืื ืจืืฆื ืจืง ืืขืชืื ื ืืืจืืช ืื ื ืืงืืงืื ืืืืคืข ืฉื ืืืื ืคืจืืืืงืื, ืืื ืืกืืื ืฉืืื ื ื ืืืืกื ืื ืืืชื. ืืืืื ืืืืืจ ืกืื ืืคื ืืื ืืื ืืขื ืืง ืืืืืืช ืกืื ื ืืกืคืช. ืื ืื ื ืื ืืืืืื ืืืขืืืจ ืคืืจื ืขื ืคืจืืืืงืื ืฉืืื.
ืืื ืืคืจืืืืงืืืื ืื ืคืืฆืื ืืืืชืจ ืืื REST API ืขื Json serialization:
sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]
ืืืคื RequestMessage
ืืื ืกืื ืืืืืขืืช ืืืกืืกื ืฉืืืงืื ืืืื ืืฉืืื ืืฉืจืช ื ResponseMessage
ืืื ืืืืขืช ืืชืืืื ืืืฉืจืช. ืืืืื, ืื ื ืขืฉืืืื ืืืฆืืจ ืชืืืืจื ืคืจืืืืงืื ืืืจืื ืืืฆืืื ืื ืืช ืคืจืืืืงืื ืืชืงืฉืืจืช ืืืืืง ืืจืฆืื.
ืืืืจืืช ืคืืกื ืื ื ืฉืชืืฉ ืืืจืกื ืคืฉืืื ืืืชืจ ืฉื ืืคืจืืืืงืื:
sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]
ืืคืจืืืืงืื ืื ืืฆืืจืคืช ืืืืขืช ืืงืฉื ืืืชืืืช ืืืชืจ ืืืืืขืช ืชืืืื ืืืืืจืช ืืืืจืืืช ืจืืืื.
ื ืืชื ืืชืืจ ืชืฆืืจืช ืฉืืจืืช ืืคื ืฉื ืืฉืืจืืช, ืืืกืฃ ืฉื ืืฆืืืืช ืืืืง ืืืชืืืช. ืืฉื ื ืืื ืืจืืื ืืคืฉืจืืืช ืืืืฆื ืืช ืื ืืืืื ืืื ืืืื ืืกืงืืื (ืืืฉื, HList
, ืกืืื ื ืชืื ืื ืืืืืจืืื). ืืืืจืืช ืืคืืกื ืืื ื ืฉืชืืฉ ื- Cake Pattern ืื ืฆืื ืืืงืื (ืืืืืืื) ืื ืืชื ืื ืืฉืืืื ืืชืืื ืืช. (ืืคืืก ืขืืื ืืื ื ืืจืืฉื ืขืืืจ ืืืฉืช ืชืฆืืจื ื ืืชื ืช ืืืืืืจ ืื. ืื ืจืง ืืืฉืื ืืคืฉืจื ืืื ืฉื ืืจืขืืื.)
ื ืืชื ืืืืฆื ืชืืืช ืืืืฆืขืืช ืืคืืก ืืขืืื ืื ืงืืืืช ืงืฆื ืฉื ืฆืืชืื ืืืจืื:
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)
}
ืฉืืจืืช Echo ืฆืจืื ืจืง ืืฆืืื ืืืืืจืช. ืืื ืื ื ืืฆืืืจืื ืฉืืืฆืืื ืืื ืชืืืืช ืืคืจืืืืงืื ืื. ืฉืืื ืื ืฉืื ืื ื ืื ืฆืจืืืื ืืฆืืื ืืฆืืื ืืกืืืืช ืืจืืข ืื, ืืืืืื ืฉ-trait's ืืืคืฉืจ ืืฆืืจืืช ืฉื ืฉืืืืช ืืืคืฉืืืช. ืื ื ืฉืชืืฉ ืืฉืืืืช ืืืคืฉืืืช, ืืืืืจ ืืืจืืฉ ืืืฉืื ืืืืคืข ืชืฆืืจื. ืืื ืกืืคืงื ื ืืช ืืืืฉืื (8081
) ืืืื ืืฉืืฉ ืืขืจื ืืจืืจืช ืืืืื ืื ื ืืื ืขืืื ืืชืฆืืจื ืงืื ืงืจืืืช.
ืื ื ืืืืืื ืืืืจืื ืขื ืชืืืช ืืชืฆืืจื ืฉื ืืงืื ืฉืืจืืช ืื:
trait EchoClientConfig[A] {
def testMessage: String = "test"
def pollInterval: FiniteDuration
def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
}
ืืชืืืช ืืฉ ืืืชื ืกืื ืืื ืฉื echoService
. ืืคืจื, ืืื ืืืจืฉ ืืช ืืืชื ืคืจืืืืงืื. ืืคืืื, ืื ื ืืืืืื ืืืืืช ืืืืืื ืฉืื ื ืืืจ ืืช ืฉืชื ืืชืืืช ืืืื ืื ืืคืขืื ืืืืื.
ืืืืขืช ืฉืืจืืชืื
ืฉืืจืืช ืฆืจืื ืคืื ืงืฆืื ืืื ืืืชืืื ืืืืืืช ืืื. (ืืืืืืช ืืืืืช ืฉืืจืืช ืืื ืงืจืืืืช ืืืืืงื.) ืฉืื ืืฉ ืืื ืืคืฉืจืืืืช ืฉื ืฆืืื ืคืื ืงืฆืื ืืื ืขืืืจ ืชืฆืืจื ื ืชืื ื (ืืืืืื, ื ืืื ืืืฉืชืืฉ ืืืืืงืืช ืกืื). ืขืืืจ ืืคืืกื ืืื ื ืฉืชืืฉ ืฉืื ื-Cake Pattern. ืื ืื ื ืืืืืื ืืืืฆื ืฉืืจืืช ืืืืฆืขืืช 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
- ืืขืืคืช ืคืื ืงืฆืืืช ืืชืืงืฃ (ืืืขื ืืื ืืื) (ืืืชืื ืฉืืกืืคื ืฉื ืืืจ ื ืืืืฃ ืืืชื ืืืฉืื ืืืจ)
ืืืืฆืขืืช ืืืฉืง ืื ื ืืื ืืืืฉื ืืกืคืจ ืฉืืจืืชืื. ืืืฉื, ืฉืืจืืช ืฉืื ืขืืฉื ืืืื:
trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
type Config <: Any
def resource(...): ResourceReader[F, Config, Unit] =
Reader(_ => Resource.pure[F, Unit](()))
}
(ืจืื
ืฆืืืช ืืื ืืืืืืงื ืืืื ืืืจืืฅ ืืื ืฉืืจืืชืื (ืืชืืืช ืฉืจืฉืจืช ืืฉืืืื ืืืคืขืืช ืขื ืืื Cake Pattern):
object SingleNodeImpl extends ZeroServiceImpl[IO]
with EchoServiceService
with EchoClientService
with FiniteDurationLifecycleServiceImpl
{
type Config = EchoConfig[String] with EchoClientConfig[String] with FiniteDurationLifecycleConfig
}
ืฉืืื ืื ืฉืืฆืืืช ืื ื ืืฆืืื ืื ืืช ืกืื ืืชืฆืืจื ืืืืืืง ืฉืืจืืฉ ืืฆืืืช ืื. ืืืืืจ ืื ืืืคืฉืจ ืื ื ืืื ืืช ืืช ืืืืืืืงื (Cake) ืขื ืกืื ืื ืืกืคืืง, ืืืืืื ืฉืื ืชืืื ืช ืฉืืจืืช ืืฆืืืจื ืขื ืืืืืฅ ืขื Config
ืกืึผื. ืืื ืื, ืื ื ืืื ืืืคืขืื ืืช ืืฆืืืช ืืืื ืืกืคืง ืชืฆืืจื ืืืื.
ืจืืืืืฆืืืช ืืชืืืช ืืฆืืืช
ืขื ืื ืช ืืืฆืืจ ืืืืืจ ืื ื ืืงืืงืื ืืืชืืืช ืืืจื ืืืืชืืช ืขืืืจ ืื ืฆืืืช. ืื ืขืฉืื ืืืืืช ืืืืข ืืืืืจ ืืืชืจ ืืืฉืจ ืืืงืื ืืืจืื ืฉื ืืชืฆืืจื. ืืคืืื, ืื ื ืืงืืงืื ืืืจื ืืกืคืง ืืืคืื ืืื ืืืื ืืฆืืืช ืืืื ืืืชืืืช ืืืืืชืืช ืฉืื. ืืืคืื ืื ืืื ืคืื ืงืฆืื:
case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}
ืืฉื ื ืืื ืืจืืื ืืคืฉืจืืืช ืืืืฉื ืคืื ืงืฆืื ืืื.
- ืื ืื ื ืืืืขืื ืืชืืืืช ืืคืืขื ืืคื ื ืืคืจืืกื, ืืืืื ืืืคืข ืืืจื ืฆืืืช, ืื ื ืืื ืืืฆืืจ ืงืื Scala ืขื ืืืชืืืืช ืืคืืขื ืืืืจืืฅ ืืช ื-build ืืืืจ ืืื (ืฉืืืฆืข ืืืืงืืช ืืื ืงืืืคืืืฆืื ืืืืืจ ืืื ืืคืขืื ืืืืืช ืืืืงืืช ืืื ืืืจืฆืื). ืืืงืจื ืื ืคืื ืงืฆืืืช ืืืืคืื ืฉืื ื ืืืืขื ืกืืืืช ืื ืืชื ืืคืฉื ืืืชื ืืืฉืื ืืื a
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
ืืจืืื ืขืืืจ.
ื ืืชื ืืืฉืชืืฉ ืืืืชื ืงืืืฆื ืฉื ืืืฉืืื ืฉืืจืืช ืืชืฆืืจืืช ืืืฆืืจืช ืคืจืืกื ืฉื ืืขืจืืช ืขื ืฉื ื ืฆืืชืื ื ืคืจืืื. ืื ืื ื ืจืง ืฆืจืืืื ืืืฆืืจ
ืชืฆืืจืช ืฉื ื ืฆืืชืื
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
, ืืขืื echo client ืืกืชืืื ืืืืจ ืืฉื ืืืื ืืกืืคื ืฉืืืืืจ. ืจืื ืืช
ืชืืืื ืคืืชืื ืืืื
ืืืื ื ืจืื ืืืฆื ืืืฉื ืื ืืฉื ื ืืช ืืืจื ืื ืื ื ืขืืืืื ืขื ืชืฆืืจื.
ืืชืฆืืจื ืืงืื ืชืงืืืคื ืืชืืืฆืจ ืืคืฅ. ื ืจืื ืืืืื ื ืืืคืจืื ืืื ืืคืฆื ืชืฆืืจื ืืืคืฆื ืงืื ืืืจืื. ืืขืชืื ืงืจืืืืช ืื ื ืืืืืื ืืงืื ืืกืคืจ ืจื ืฉื ืชืฆืืจืืช ืขื ืืืชื ืืกืืก ืงืื. ืืืืืื, ืื ืื ื ืืืืืื ืืงืื ืืจืกืืืช ืืจืืืืช ืฉื ืขื ืคื ืชืฆืืจื ืฉืื ืื. ืืชืฆืืจื ืื ื ืืืืืื ืืืืืจ ืืจืกืืืช ืืกืืืืืช ืฉื ืกืคืจืืืช ืืื ืืืฉืืจ ืงืืืข ืืื ืคืขื ืฉื ืคืจืืก ืืช ืืชืฆืืจื ืืื.
ืฉืื ืื ืชืฆืืจื ืืืคื ืืฉืื ืื ืงืื. ืื ืื ืฆืจืื ืืืืืช ืืืืกื ืืืืชื ืชืืืื ืืืืืช ืืืืืช:
ืืจืืืก -> ืืืกื ืฆืืืืจ -> ืกืงืืจื -> ืืืืื -> ืืื ืืืจืฆืื ืืชืืฉืืช -> ืคืจืืกื ืืชืืฉืืช
ืืฉื ื ืืืฉืืืืช ืืืืืช ืฉื ืืืืฉื:
- ืืชืฆืืจื ืืื ืงืืืจื ืืืช ืขืืืจ ืืืคืข ืฉื ืืขืจืืช ืืกืืืืช. ื ืจืื ืฉืืื ืืจื ืืงืฉืจ ืฉืืื ืืื ืฆืืชืื.
- ืื ืื ืงื ืืฉื ืืช ืชืฆืืจื ืจืง ืืฆืืืช ืืื. ืื ื ืจืื ืื ืืืืื ื ืืืืื ืก ืืืฉื ืืช ืืื ืงืืฆื ืืงืกื. ืื ืกืืืคื ืฉื ืืชืฆืืจื ืืืคืืช ืืคืืืช ืืคืฉืจืืช.
- ืฉืื ืืืื ืงืื ืื ืืชืฆืืจื ืืื ื ืงืืื ืืืืฆืืข.
- ืจืื ืฉืื ืืื ืืชืฆืืจื ืืขืืจื ืืช ืืืชื ืชืืืื ืคืืชืื, ืืืื ืืขืืืจ ืกืงืืจื ืืกืืืืช.
ืืื ืื ืื ื ืฆืจืืืื ืืืืจ ื ืคืจื ืืชืฆืืจืช ืืืฆืืจ? ืชืฆืืจืช ืืืืฆืืจ ืขืฉืืื ืืืืื ืืืืข ืจืืืฉ ืฉื ืจืฆื ืืืจืืืง ืืืืฉื ืืื ืฉื ืื ืฉืื ืจืืื. ืื ืืืื ืืืื ืืฉืืืจ ืืืืจ ื ืคืจื ืขื ืืืฉื ืืืืืืช ืฉืืืื ืืช ืชืฆืืจืช ืืืืฆืืจ. ืื ื ืขืฉืืืื ืืคืฆื ืืช ืืชืฆืืจื ืืฉื ื ืืืงืื - ืืื ืฉืืืื ืืช ืืคืจืืืจืื ืืคืชืืืื ืืืืชืจ ืฉื ืืืืฆืืจ ืืืื ืฉืืืื ืืช ืืืืง ืืกืืื ืฉื ืืชืฆืืจื. ืื ืืืคืฉืจ ืืืฉื ืืจืื ืืืคืชืืื ืืจืื ืืืืจืืข ืฉื ืืคืจืืืจืื ืชืื ืืืืืช ืืืฉื ืืืืจืื ืจืืืฉืื ืืืืช. ืงื ืืืฉืื ืืืช ืืืืฆืขืืช ืชืืื ืืช ืืื ืืื ืขื ืขืจืื ืืจืืจืช ืืืื ืฉื ืคืจืืืจืื.
ืืจืืืฆืืืช
ืืืื ื ืจืื ืืช ืืืชืจืื ืืช ืืืืกืจืื ืืช ืฉื ืืืืฉื ืืืืฆืขืช ืืืฉืืืื ืืืื ืืงืืช ื ืืืื ืืชืฆืืจื ืืืืจืืช.
ืงืืื ืื, ื ืคืจื ืืื ืืืืคืืช ืืืืืืื ืืฉืื ืื ืฉื ืืืจื ืืืืฆืขืช ืืืชืืืื ืขื ืชืฆืืจื:
- ืงืืืฅ ืืงืกื ืืืืฉื ืืืขื.
- ืืืกืื ืืจืืื ืฉื ืขืจื ืืคืชื (ืืื
etcd
/zookeeper
). - ืจืืืื ืชืช-ืชืืืืืื ืฉื ืืชื ืืืืืืจ/ืืืคืขืื ืืืืฉ ืืืื ืืืคืขืื ืืืืฉ ืืช ืืชืืืื.
- ืชืฆืืจื ืืืืฅ ืืืคืฅ ืืืงืจืช ืืจืกืืืช.
ืงืืืฅ ืืงืกื ื ืืชื ืืืืฉืืช ืืกืืืืช ืืืื ืืื ืฉื ืชืืงืื ืื ืื-ืืืง. ืื ืื ืืขืจืืช ืืืื ืืืืื ืก ืืฆืืืช ืืืขื, ืืืฆืข ืฉืื ืื ืืคืฉืื ืืืคืขืื ืืืืฉ ืืช ืืฉืืจืืช. ืื ืืืื ืื ืืื ืืืขืจืืืช ืืืืืืช ืืืชืจ. ืื ื ืืชืจื ืขืงืืืช ืืืืืจื ืืฉืื ืื. ืืฉืื ืื ืืื ื ื ืืืง ืขื ืืื ืืื ืขืื ืืื ืืืจ. ืืืชืื ืฉืืืื ืงืฉื ืืืืืช ืื ืืจื ืืฉืื ืื. ืื ืื ื ืืืง. ืื ืงืืืช ืืื ืฉื ืืขืจืืช ืืืืืจืช, ืื ืื ืืืื ืคืฉืื ืืฉืืื ืืขืืื ืืช ืืชืฆืืจื ืืืื ืืฆืืชืื ืืืืจืื.
(ืืื ืืืช, ืื ืืกืืคื ืฉื ืืืจ ืืืื ืฆืืจื ืืืชืืื ืืืฉืชืืฉ ืืงืืฆื ืชืฆืืจืช ืืงืกื, ื ืฆืืจื ืืืืกืืฃ ืจืง ืื ืชื + ืืืืืช ืฉืืืื ืืืืฆืจ ืืช ืืืชื ืืืืจ Config
ืกืื ืืื ืืกืคืืง ืืื ืืืชืืื ืืืฉืชืืฉ ืืชืฆืืจืืช ืืงืกื. ืื ืื ืืจืื ืฉืืืืจืืืืช ืฉื ืชืฆืืจืช ืืื ืืืืืืจ ืืื ืงืฆืช ืืืชืจ ืงืื ื ืืืืืจืืืืช ืฉื ืชืฆืืจืืช ืืืืกืกืืช ืืงืกื, ืืืืืื ืฉืืืจืกื ืืืืกืกืช ืืงืกื ืื ืื ื ืฆืจืืืื ืงืื ื ืืกืฃ.)
ืืืกืื ืืจืืื-ืขืจื ืืคืชื ืืื ืื ืื ืื ืืื ืืืคืฆืช ืืื ืคืจืืืจืื ืฉื ืืืฉืืืื. ืืื ืื ืื ื ืฆืจืืืื ืืืฉืื ืื ืื ืื ื ืืืฉืืืื ืืขืจืื ืชืฆืืจื ืืืื ืจืง ื ืชืื ืื. ื ืชืื ื ืคืื ืงืฆืื C => A => B
ืื ืื ื ืืืจื ืืื ืืื ืื ืขืจืืื ืืฉืชื ืื ืืขืชืื ื ืืืจืืช C
"ืชืฆืืจื", ืืขืื ื ืชืื ืื ืืฉืชื ืื ืืขืชืื ืงืจืืืืช A
- ืจืง ืืื ืช ื ืชืื ืื. ืืฉ ืืกืคืง ืชืฆืืจื ืืคืื ืงืฆืื ืืคื ื ืื ืชืื ืื A
. ืืืชืืฉื ืืจืขืืื ืื ืื ื ืืืืืื ืืืืจ ืฉืชืืืจืืช ืืฉืื ืืืื ืืฆืคืืื ืืื ืื ืฉื ืืชื ืืืฉืชืืฉ ืื ืืื ืืืืืื ืืื ื ืชืื ื ืชืฆืืจื ืื ืชืื ืื ืืืื. ืืื ืื, ืื ืชืื ืื ืืืืขืื ืืืจื ืืื ืืืงืืจ ืืื (ืืฉืชืืฉ) ืืืชืฆืืจื ืืืืขื ืืืงืืจ ืืืจ (ืืืืื). ืืชืืืืืืช ืขื ืคืจืืืจืื ืื ืืชื ืื ืืฉืื ืื ืืืืจ ืชืืืื ืืืชืืื ืืืืืื ืืขืืืื ืืืืจืืืืช ืืืคืืืงืฆืื. ืขืืืจ ืคืจืืืจืื ืืืื ื ืฆืืจื ืืืคื ืืื ืื ืื ืืืกืืจื ืฉืืื, ื ืืชืื ืืืืืืช, ืืืคืื ืืขืจืืื ืฉืืืืื. ืืคืืื, ืขื ืื ืช ืืืคืืืช ืืช ืืืจืืืืช ืืชืืื ืืช, ืืืื ืฉื ืคืืืช ืืช ืืกืคืจ ืืคืจืืืจืื ืฉืืืืืื ืืืฉืชื ืืช ืืืื ืจืืฆื (ืื ืืคืืื ืืืื ืืืชื ืืืืืืื).
ืื ืงืืืช ืืืื ืฉื ืคืืกื ืื ืขืืื ื ืืขืฉืืช ืืืื ื ืืื ืคืจืืืจืื ืกืืืืื ืืืื ืืืืื. ืื ืืืืืงืช ืืฉืืจืืช ืืืจืฉืช ืฉืื ืื ื ืืืจ ืฉื ืืื ืคืจืืืจืื ืืืื ืจืืฆื, ืื ืื ืื ื ืขืฉืืืื ืืงืจืื ืืื ืคืจืืืจืื ืืื ืืืื. ืืืจืช ืื ืกืืืืื ืืืืืืื ืืืืืช ืืืืืจืื ืืืืฆืขืืช ืืืืฉื ืืืืฆืขืช. ืขืืืจ ืืืืจื ืืืืฉ ืืื ืืืช ืขืฉืืื ืืืืืช ืฆืืจื ืืืืฉืืช ืืืจืืช. ืืืืืื, ืืืชืื ืฉืืืงืื ืืืืขืจืืช ืืืคืขืื ืืืืฉ ืขื ืคืจืืืจื ืืชืฆืืจื ืืืืฉืื ืืืืคื ืืืื ืืืคืขืื ืืืืฉ ืฉื ืชืืืืืื ื ืคืจืืื ืฉื ืืขืจืืช ืืืืืจืช.
(ืืขืชื ืืฆื ืืขื ืืื ืืืืื ืข ืืชืฆืืจื ืืืืฉ ืฉื ืืื ืจืืฆื ืืืืืื ืฉืืื ืืืืืจื ืืช ืืืืจืืืืช ืฉื ืืืขืจืืช.
ืื ืขืฉืื ืืืืืช ืคืฉืื ืืืชืจ ืคืฉืื ืืืกืชืื ืขื ืชืืืืช ืืขืจืืช ืืืคืขืื ืฉื ืชืืืืื ืืคืขืื ืืืืฉ. ืื ืื, ืืืื ืื ืื ืชืืื ืืคืฉืจื.)
ืืืื ืืฉืื ืืื ืฉื ืฉืืืืฉ ืืชืฆืืจื ืกืืืืช ืฉืืืจื ืืคืขืืื ืืื ืฉืื ืืฉืงืื ืชืฆืืจื ืืื ืืืช (ืืื ืกืืืืช ืืืจืืช) ืืื ืืฉืืชืช ืืฉืืจืืช ืืืืื ืขืืืื ืืชืฆืืจื. ืืืื, ืื ืขืืื ื ืืืฆืข ืฉืื ืืืื ืืชืฆืืจื ืืกืืืืช, ืขืืื ื ืืืคืขืื ืืืืฉ ืืช ืืืขืจืืช ืื ืฉืขืจืืื ืืืฉืื ืืืื ืืขืืืื. ืืืจืืฉืืช ืืืื ืืฉืืชื ืืฉืชื ืืช ืขืืืจ ืืขืจืืืช ืฉืื ืืช, ืื ืืืื ืื ืื ืื ืื ืงืจืืื. ืื ืื ืงืจืืื, ืื ืขืืื ื ืืชืื ื ืืจืืฉ ืขืืืจ ืื ืืคืขืื ืืืืฉ ืฉื ืืืขืจืืช. ืืืฉื, ื ืืื ืืืืฉื
ืื ืืืื ืฉืืืจืช ืชืฆืืจื ืืชืื ืืคืฅ ืืจืกื ืื ืืืืฅ? ืฉืืืจืช ืชืฆืืจื ืืชืื ืืคืฅ ืคืืจืืฉื ืืจืื ืืืงืจืื ืฉืชืฆืืจื ืื ืขืืจื ืืช ืืืชื ืชืืืื ืืืืืช ืืืืืช ืืื ืืคืฆืื ืืืจืื. ืื ืืคืฉืจ ืืืืืช ืืืื ืฉืืชืฆืืจื ืืื ืืืืืืช ืืืื ืืืืืื ื. ืืืืคื, ืชืฆืืจื ืืงืืืฅ ื ืคืจื ืคืืจืืฉื ืฉืืื ืขืงืืืช ืืื ืืืื ืืืฆืขื ืฉืื ืืืื ืืงืืืฅ ืื. ืืื ืื ืืฉืื? ืื ื ืืืืื ืื ืฉืืจืื ืืขืจืืืช ืืืืฆืืจ ืขืืืฃ ืฉืชืืื ืชืฆืืจื ืืฆืืื ืืืืืืชืืช.
ืืจืกืช ืืืคืฅ ืืืคืฉืจืช ืืืืืช ืืชื ืืื ื ืืฆืจ, ืืืื ืขืจืืื ืืื ืืืื, ืืืื ืชืืื ืืช ืืืคืขืืืช/ืืืฉืืชืืช, ืื ืืื ืืืจืื ืืืืฆืืข ืื ืฉืื ืื ืืชืฆืืจื. ืื ืขืฉืื ืืืจืืฉ ืงืฆืช ืืืืฅ ืืื ืืฉืืืจ ืขื ืชืฆืืจื ืืชืื ืืคืฅ ืืื ืืืืจื ืขืืฆืืืืช ืฉืฆืจืื ืืขืฉืืช.
ืืกืจืื ืืช ืืชืจืื ืืช
ืืื ืืจืฆืื ื ื ืืืืืืฉ ืืื ืืชืจืื ืืช ืืืืื ืืืื ืืกืจืื ืืช ืฉื ืืืืฉื ืืืืฆืขืช.
ืืชืจืื ืืช
ืชืืื ืืช ืฉื ืชืฆืืจื ืื ืืชื ืช ืืืืืืจ ืฉื ืืขืจืืช ืืืืืจืช ืฉืืื:
- ืืืืงื ืกืืืืช ืฉื ืชืฆืืจื. ืื ื ืืชื ืจืื ืืืืื ืฉื ืืืืืื, ืฉืืชืฆืืจื ื ืืื ื ืืืื ืชื ืืืืืฆื ืกืื.
- ืฉืคืช ืชืฆืืจื ืขืฉืืจื. ืืืจื ืืื ืืืฉืืช ืชืฆืืจื ืืืจืืช ืืืืืืืช ืืื ืืืืชืจ ืืืืืคืช ืืฉืชื ื.
ืืืืฆืขืืช Scala ืืคืฉืจ ืืืฉืชืืฉ ืืืืืื ืจืื ืฉื ืชืืื ืืช ืฉืคื ืืื ืืฉืคืจ ืืช ืืชืฆืืจื. ืืืืืื, ืื ื ืืืืืื ืืืฉืชืืฉ ืืชืืื ืืช ืืื ืืกืคืง ืขืจืื ืืจืืจืช ืืืื, ืืืืืืงืืื ืืื ืืืืืืจ ืืืงืฃ ืฉืื ื, ืื ื ืืืืืื ืืืชืืืืก ืืืืืval
s ืืืืืจ ืจืง ืคืขื ืืืช ืืืืื ืืืืฆืื ื (DRY). ืืคืฉืจ ืืืฉืชืืฉ ืืจืฆืคืื ืืืืืืืื, ืื ืืืืคืขืื ืฉื ืืืืงืืช ืืกืืืืืช (Seq
,Map
, ืืื '). - DSL. ืืกืงืืื ืืฉ ืชืืืื ืืืื ื ืืืืชืื DSL. ืืคืฉืจ ืืืฉืชืืฉ ืืชืืื ืืช ืืืื ืืื ืืืฆืืจ ืฉืคืช ืชืฆืืจื ืฉืืื ื ืืื ืืืชืจ ืืืืืืืชืืช ืืืชืจ ืืืฉืชืืฉ ืืงืฆื, ืื ืฉืืชืฆืืจื ืืกืืคืืช ืชืืื ืืคืืืช ืงืจืืื ืืืฉืชืืฉื ืืืืืืื.
- ืฉืืืืช ืืงืืืจื ืืืืช ืขื ืคื ื ืฆืืชืื. ืืื ืืืชืจืื ืืช ืฉื ืงืืืขืช ืชืฆืืจื ืฉื ืื ืืืขืจืืช ืืืืืืจืช ืืืงืื ืืื ืืื ืฉืื ืืขืจืืื ืืืืืจืื ืื ืืจืง ืคืขื ืืืช ืืืืืจ ืืื ื ืขืฉื ืืื ืฉืืืืฉ ืืืืจ ืืื ืืืงืืืืช ืฉืืื ืื ื ืืงืืงืื ืืื. ืืงืื ืื ืืฆืืจืืช ืืฆืืืืช ืืืืืืช ืืืืืืืช ืฉืืื ืืชืฆืืจืืช ืื ืืื ืืช ืืืคืฉืจืืืช ืืฆืืชืื ืฉื ืืืขืจืืช ืืืืจื ืืืืชื ืฉืคื. ืืฉ ืชืืืช ืืคืืจืฉืช ืืื ืฆืืชืื ืื ืฉืืงืฉื ืืฉืืื ืืกืคืง ืฉืืจืืชืื ืืกืืืืื.
- ืืืืืช ืืืืื ืฉื ืฉืื ืืืื. ืืืืฉื ืืืืืืช ืฉื ืืขืืจืช ืฉืื ืืื ืชืฆืืจื ืืจื ืชืืืื ืืืกื ืฆืืืืจ ืจืืื ืงืืืขืช ืกืื ืืจืืื ืืืืืื ืฉื ืืืืืช ืื ืืชืฆืืจื.
- ืฉืื ืืื ืชืฆืืจื ืื ืืื ืืช. ืืื ืคืขื ืฉืื ื ืืืฆืขืื ืฉืื ืืืื ืืืฉืื ืืชืฆืืจื, ืืคืจืืกื ืืืืืืืืืช ืืืืืื ืฉืื ืืฆืืชืื ืืชืขืืื ืื.
- ืคืืฉืื ืืืฉืืืื. ืืืคืืืงืฆืื ืื ืฆืจืืื ืื ืชื ืืืืืช ืชืฆืืจื ืืืืคื ืืขืจืื ืชืฆืืจื ืฉืืืืื. ืื ืืคืฉื ืืช ืืืืฉืื ืืืืื. (ืขืืืื ืืกืืืืืช ืืืืจืืืืช ืืื ืืชืฆืืจื ืขืฆืื, ืืื ืื ืคืฉืจื ืืืืขืช ืืืืืื ืืืืืืช.) ืื ืื ืคืฉืื ืืืืืจ ืืชืฆืืจื ืจืืืื - ืคืฉืื ืืืกืฃ ืืช ืืืืงืื ืืืกืจืื. ืงื ืืืชืจ ืืืชืืื ืขื ืชืฆืืจื ืืืจืืืช ืืืืืืช ืืืฉืื ืฉื ืืืงืื ื ืืกืคืื ืืืื ืื ืืืืืจืื ืืืชืจ.
- ืชืฆืืจื ืื ืืกืืช. ืืฉื ืืขืืืื ืฉืฉืื ืืื ืชืฆืืจื ืขืืงืืื ืืืจ ืืืชื ืชืืืื ืคืืชืื, ืืชืืฆืื ืืื ืื ื ืืงืืืื ืืคืฅ ืขื ืืจืกื ืืืืืืืช. ืื ืืืคืฉืจ ืื ื ืืืืืืฃ ืชืฆืืจื ืืืืจื ืืืืืช ืืฆืืจื. ืื ืื ื ืืคืืื ืืืืืื ืืคืจืืก ืชืฆืืจื ืฉืืืืชื ืืฉืืืืฉ ืืคื ื ืฉื ื ืืืื ืชืขืืื ืืืืืง ืืืืชื ืืืคื. ืชืฆืืจื ืืฆืืื ืืฉืคืจืช ืืช ืื ืืืื ืืืืืื ืืช ืฉื ืืืขืจืืช ืืืืืืจืช. ืืชืฆืืจื ืงืืืขื ืืืื ืืืืืืจ ืืื ื ืืชื ืืืื ืืงืืืช ืืืขืจืืช ืืืฆืืจ.
- ืืืืืืจืืืช. ืืืกืืจืช ืืืืฆืขืช ืืื ืืืืืืจืืช ืื ืืชื ืืฉืื ืืืืืืื ืืืจืืื ืฉืื ืืช
ืชืืืื ืืชืฆืืจืืช ืฉืื ืืช (ืืืืจืืช/ืคืจืืกืืช). ืืคืจื, ืืคืฉืจ ืืงืื ืคืจืืกืช ืฆืืืช ืืืื ืืงื ื ืืืื ืงืื ืืืืืจืช ืจืืืื ืฆืืชืื ืืงื ื ืืืื ืืืื. ืื ืกืืืจ ืฉืืืื ืืกืคืจ ืคืจืืกืืช ืืืฆืืจ. - ืืืืงื. ืืืืจืืช ืืืืงื ืืคืฉืจ ืืืืฉื ืฉืืจืืช ืืืืื ืืืืฉืชืืฉ ืื ืืชืืืช ืืฆืืจื ืืืืื ืืกืื. ืืื ืคืจืืกืืช ืืืืงื ืฉืื ืืช ืขื ืืืงืื ืฉืื ืื ืฉืืืืืคื ืืืขื ืืืื ืืืืฉืืจ ืื ืืื ืืช.
- ืืืืงืช ืืื ืืืจืฆืื. ืืคืขืืื ืืืขืจืืืช ืืืืืจืืช ืงืฉื ืืืคืขืื ืืืื ื ืืื ืืืจืฆืื. ืืืืฆืขืืช ืืืืฉื ืืืชืืืจืช ืืกืื ืชืฆืืจื ืืืืื ืฉื ืืืขืจืืช ืืืืืืจืช ืืฉืืื, ืื ื ืืืืืื ืืืจืืฅ ืืช ืื ืืืืงืื ืืืืืืจืื ืขื ืฉืจืช ืืืื ืืฆืืจื ื ืืชื ืช ืืฉืืืื. ืงื ืืืงืืช ืืช ืืืฆื
ืืืฉืจ ืืื ืืฉืืจืืชืื ืืื ื ืืืื.
ืืกืจืื ืืช
ืืืฉืช ืืชืฆืืจื ืืืืืืจืช ืฉืื ื ืืชืฆืืจื "ืจืืืื" ืืืืชืื ืฉืืื ืื ืืชืืืื ืืื ืืฆืจืืื. ืืืื ืืื ืืืืกืจืื ืืช ืฉื ืชืฆืืจืช ืืงืืืคืืืฆืื:
- ืชืฆืืจื ืกืืืืช. ืืืชืื ืฉืืื ืื ืืชืืื ืืื ืืืืฉืืืื. ืืืงืจืื ืืกืืืืื ืืฉ ืฆืืจื ืืชืืงืื ืืืืจ ืฉื ืืชืฆืืจื ืืืืฆืืจ ืชืื ืขืงืืคืช ืื ืืืฆืขื ืืืืืืืช. ืืืฉื ืื ืืงืฉื ืขื ืื. ืืืืืืจ ืืืคืจืืกื ืืืืฉ ื ืืจืฉืื ืืืืจ ืืืฆืืข ืื ืฉืื ืื ืืชืฆืืจื. ืื ืื ืืชืืื ื ืืื ืื ืื.
- ืืฆืืจืช ืชืฆืืจื. ืืืฉืจ ืชืฆืืจื ื ืืฆืจืช ืขื ืืื ืืื ืืืืืืฆืื ืืืฉืื, โโืืืฉื ืื ืืืจืฉืช ืงืืืคืืืฆืื ืืืืจ ืืื (ืฉืขืฉืืื ืืชืืจื ืืืืืฉื). ืื ืขืฉืื ืืืจืืฉ ืืืืฅ ื ืืกืฃ ืืื ืืฉืื ืืช ืืฉืื ืื ืืกืฃ ืืื ืืืขืจืืช ืืื ืืื.
- ืืืื. ืืฉ ืืจืื ืืืื ืืฉืืืืฉ ืืืื ืืืกืชืืืื ืขื ืชืฆืืจืืช ืืืืกืกืืช ืืงืกื. ืืื ืืื
ืื ืืืื ืืฉืื ืืืฉืจ ืชืฆืืจื ืืืืืจ. - ืืฉ ืฆืืจื ืืฉืื ืื ืืฉืืื. ืืคืชืืื ื-DevOps ืืืืจืื ืงืืฆื ืชืฆืืจืช ืืงืกื. ืืจืขืืื ืฉื ืงืืืคืืืฆืื ืฉื ืชืฆืืจื ืขืฉืื ืืืืจืืืช ืืื ืืืืจ.
- ืืคื ื ืืฆืืช ืชืฆืืจื ืื ืืชื ืช ืืืืืืจ ื ืืจืฉ ืชืืืื ืคืืชืื ืชืืื ื ืืืืืืช ืืืืื.
ืืฉ ืืื ืืืืืืช ืฉื ืืืืืื ืืืืืฉืืช:
- ืื ื ืกืคืง ืชืฆืืจื ื ืืกืคืช ืฉืืื ื ื ืืจืฉืช ืขื ืืื ืืืฉืื ืืฆืืืช, ืืืืืจ ืื ืืขืืืจ ืื ื ืืืืืช ืืช ืืืืฉืื ืืืกืจ. ื ืืชื ืืืคื ืืื ืืืืฆืขืืช ืฉืืืืฉ
HList
ืื ADTs (ืืืืงืืช ืืงืจื) ืขืืืจ ืชืฆืืจืช ืฆืืืช ืืืงืื ืชืืื ืืช ืืืคืืก ืขืืื. - ืื ืื ื ืฆืจืืืื ืืกืคืง ืืืืฉืื ืืืืืช ืืงืืืฅ ืืชืฆืืจื: (
package
,import
,object
ืืฆืืจืืช;
override def
ืขืืืจ ืคืจืืืจืื ืฉืืฉ ืืื ืขืจืื ืืจืืจืช ืืืื). ืื ืขืฉืื ืืืืืช ืืืืคื ืืืืคื ืืืงื ืืืืฆืขืืช DSL. - ืืคืืกื ืื ืืื ื ื ืืืกืื ืชืฆืืจื ืืืืฉ ืืื ืืืช ืฉื ืืฉืืืืืช ืฉื ืฆืืชืื ืืืืื.
ืกืืืื
ืืคืืกื ืื ืื ื ืืจืขืืื ืฉื ืืืฆืื ืชืฆืืจื ืืฉืืจืืช ืืงืื ืืืงืืจ ืืฆืืจื ืืืืื. ืืืืฉื ืืืืื ืืฉืืฉ ืืืืฉืืืื ืจืืื ืืชืืืืฃ ืืชืฆืืจืืช ืืืืกืกืืช ืืงืกื ืืืจ ืฉื xml. ืืืจืืช ืฉืืืืืื ืฉืื ื ืืืฉืื ื-Scala, ื ืืชื ืืชืจืื ืืืชื ืื ืืฉืคืืช ืืืืืจ ืืืจืืช (ืืื Kotlin, C#, Swift ืืื'). ืืคืฉืจ ืื ืกืืช ืืช ืืืืฉื ืืื ืืคืจืืืงื ืืืฉ, ืืืืงืจื ืฉืื ืื ืืชืืื, ืืขืืืจ ืืืจื ืืืฉื ื.
ืืืืื, ืชืฆืืจื ืื ืืชื ืช ืืืืืืจ ืืืจืฉืช ืชืืืื ืคืืชืื ืืืืืืช ืืืืื. ืืชืืืจื ืืื ืืืืืื ืืกืคืง ืชืฆืืจื ืืืงื ืืืืืืช ืืืืื ืืืืชื ืืืื.
ื ืืชื ืืืจืืื ืืืฉื ืื ืืืจืืื ืฉืื ืืช:
- ืืคืฉืจ ืืืฉืชืืฉ ืืคืงืืืืช ืืืงืจื ืืื ืืืฆืข ืืืืืช ืชืฆืืจื ืืืืืืฉื ืืืื ืืงืืืคืืืฆืื ืืืงืจื ืฉื ืืฉืืื ืฉื ืืืืืฆื ืืืืืงื ืขืกืงืืช.
- ื ืืชื ืืืืฉื DSL ืืื ืืืืฆื ืชืฆืืจื ืืฆืืจื ืืืืืืชืืช ืืืฉืชืืฉ ืืืืืืื.
- ื ืืืื ืืฉืืืื ืืื ืื ืขื ืืชืืืืช ืืืืืืืืืช ืฉื ืชืฆืืจื. ืืืืืื, ืืืฉืจ ืื ื ืืืืื ืื ืืช ืืกืคืจ ืฆืืชื ืืืฉืืื, ืืืชืื ืฉื ืจืฆื (1) ืฉืืฆืืชืื ืืงืืื ืชืฆืืจื ืฉืื ื ืืืงืฆืช; (2) ืื ืื ืืฉืืืืืช ืืื ืืงืื ืืืืข ืขื ืฆืืชืื ืืืฉืื.
ืชืืื
ืื ื ืจืืฆื ืืืืจ ืชืืื ืืื ืืจืื ืกืงืกืื ืื, ืคืืื ืคืืคืื, ืื ืืื ื ืืืื ืขื ืฉื ืชืชื ืืฉืื ืืขืืจืจ ืืฉืจืื ืขื ืืืืืช ืืคืืกื ืืื ืฉืขืืจ ืื ืืืืืืจ ืืืชื.
ืืงืืจ: www.habr.com