ืืื ืืืึธืื ืืื ืฆื ืืึธืื ืืืจ ืึท ืืฉืืงืึทืืืข ืืขืงืึทื ืืืึทื ืคึฟืึทืจ ืืจืืขืื ืืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืคืื ืึท ืคืื ืื ืืขืจืืขืืืืื ืกืืกืืขื. ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืจืขืคึผืจืืืขื ืืื ืืืืึทื ืืื ืึท ืงืึทืืคึผืืืื ืฉืคึผืจืึทื (ืกืงืึทืืึท) ื ืืฆื ืืืืขืจ ืืืืคึผืก. ืืขืจ ืคึผืึธืกืื ืืื ืึท ืืืืฉืคึผืื ืคืื ืึทืืึท ืึท ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืืืกืงืึทืกื ืคืึทืจืฉืืื ืึทืกืคึผืขืงืฅ ืคืื ืืืคึผืืึทืืขื ืื ื ืึท ืงืึทืืคึผืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืื ืงืืืืขืืืืง ืึทื ืืืืืงืืื ื ืคึผืจืึธืฆืขืก.
ืืงืืื
ืื ืื ืึท ืคืึทืจืืึธืืืขื ืคืื ืื ืืขืจืืขืืืืื ืกืืกืืขื ืืืื ืึทื ืึทืืข ื ืึธืืื ื ืืฆื ืื ืจืืืืืง ืงืึทื ืคืืืืขืจืืืฉืึทื, ืกืื ืืงืจืึทื ืืืื ืืื ืื ืืขืจืข ื ืึธืืื. DevOps ืืขืงื ืึทืืึทืืืฉืื (ืืขืจืจืึทืคืึธืจื, ืึทื ืกืึทืืึทื ืึธืืขืจ ืขืคึผืขืก ืืื ืืึธืก) ืืขื ืขื ืืืืฉืึทืืืึทืื ืืขื ืืฆื ืฆื ืืืืืึธืืึทืืืฉ ืืืฉืขื ืขืจืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืงืขืก (ืึธืคื ืกืคึผืขืฆืืคืืฉ ืคึฟืึทืจ ืืขืืขืจ ื ืึธืืข). ืืืจ ืืืขืื ืืืื ืืืื ืืืืขืจ ืึทื ืึทืืข ืงืึทืืืื ืึทืงืืืืื ื ื ืึธืืื ื ืืฆื ืืืืขื ืืงืึทื ืคึผืจืึธืืึธืงืึธืืก (ืึทืจืืึทื ืืขืจืขืื ื ืื ืืขืืืข ืืืขืจืกืืข). ืึทื ืืขืจืฉ, ืื ืงืึทืืคึผืึทืืึทืืืืึทืื ืืืขื ืืืื ืืขืืืื ืืื ืืื ืืืขืจ ืคืื ืื ืืขืจืืขืืืืื ืกืืกืืขื. ืืื ืื JVM ืืืขืื, ืืืื ืงืึทื ืกืึทืงืืืึทื ืก ืคืื ืืขื ืคืึธืืขืจืื ื ืืื ืึทื ืื ืืขืืืข ืืืขืจืกืืข ืคืื โโืืขืจ ืืืืืืึธืืขืง ืืื ืื ืคึผืจืึธืืึธืงืึธื ืึทืจืืืงืืขื ืืืื ืืืื ืืขืืืืื ื ืืืืขืืื.
ืืืึธืก ืืืขืื ืืขืกืืื ื ืึท ืคืื ืื ืืขืจืืขืืืืื ืกืืกืืขื? ืคืื ืงืืจืก, ืืืจ ืืืขืจื ืขืืขื ืึทื ืึทืืข ืงืึทืืคึผืึธืื ืึทื ืฅ ืืึธืื ืึทืคึผืึทืจืึทื ืืขืกืฅ ืืืืืขืจ ืืืจ ืืึทื ืืืืฃ ืฆื ืื ืืึทืืจืืืฉืึทื ืืขืกืืื ื. (ืืื ืืื ืื ืฆื ืขืงืกืืจืึทืคึผืึธืืืืจื ืคึผืจืืืืจื ืจืขืืืืืึทืื ืฆื ืจืื ืืืืข, ืืืจ ืืืื ืืืื ืฆืืฉืืขืื ืึทื ืืืืขื ืืงืึทื ืืึทื ื ืคืื ืืืืืจืขืจืื ืืื ืื ืืขืกืืื ื ืืื ืข ืืื ืืื ืจืื ืืืืข.)
ืืืขื ืืจืืขืื ืืื ืื ืืึทืืจืืืฉืึทื ืืขืกืฅ, ืขืก ืืื ืึธืคื ืืจืื ืืขืจ ืฆื ื ืืฆื ืื ืืขืืืข ืงืืึทืกืคึผืึทื ืืืืขืืื ืืืืฃ ืึทืืข ื ืึธืืื. ืื ืืืจ ืืึธืื ืฆื ืืึธื ืืื ืฆื ืขื ืฉืืจ ืึทื ืืขืจ ืืขืืืืงืขืจ ืงืืึทืกืคึผืึทื ืืื ืืขื ืืฆื ืืื ืจืื ืืืืข. (ืืึธืืฉ ืขืก ืืื ืืึธืจ ืืขืืืขื ืฆื ืืืืคื ืคืึทืจืฉืืืขื ืข ื ืึธืืื ืืื ืคืึทืจืฉืืืขื ืข ืงืืึทืก ืคึผืึทืืก, ืืึธืก ืืืืื ืงืึทืืคึผืืขืงืกืืื ืฆื ืื ืงืืืืขืืืืง ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืฉืืืขืจืืงืืืื ืืื ืืืคึผืืืืืึทื ื ืืื ืื ืืึทืืจืืืฉืึทื ืืขืกืฅ.) ืคึฟืึทืจ ืื ืฆืืืขืงื ืคืื ืืขื ืคึผืึธืกืื, ืืืจ ืืืขืจื ืขืืขื ืึทื ืึทืืข ื ืึธืืื ืืืขื ื ืืฆื ืื ืืขืืืข ืงืืึทืกืคึผืึทื.
ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืืึทืืืื ืืื ืื ืึทืคึผืืึทืงืืืฉืึทื. ืืืจ ื ืืฆื ืืืขืจืกืืขืก ืฆื ืืืขื ืืืคืืฆืืจื ืคืึทืจืฉืืืขื ืข ืกืืึทืืขืก ืคืื ืคึผืจืึธืืจืึทื ืขืืืึธืืืฆืืข. ืขืก ืกืืื ืืึทืืืฉืืงืึทื ืฆื ืืืขื ืืืคืืฆืืจื ืคืึทืจืฉืืืขื ืข ืืืขืจืกืืขืก ืคืื ืงืึทื ืคืืืืขืจืืืฉืึทื ื. ืืื ืฉืืขืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืืื ืื ืืืขืจืกืืข ืงืึธื ืืจืึธื ืกืืกืืขื. ืืืื ืขืก ืืื ืืืืื ืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืคึผืจืึธืืืงืฆืืข, ืืืจ ืงืขื ืขื ืคืฉืื ื ืืฆื ืื ืืืขืจืกืืข ื ืืืขืจ. ืืืื ืืืจ ื ืืฆื ืคืืืข ืคึผืจืึธืืืงืฆืืข ืื ืกืืึทื ืกืื, ืืืจ ืืึทืจืคึฟื ืขืืืขืืข
ืงืึทื ืคืืืืขืจืืืฉืึทื ืฆืืืืืื ืืื ืึทื ื ืึธื ืคืืจืืข ืืื ืึทืืืฉืึทื ืฆื ืื ืืืขืจืกืืข (ืืืฉื, ืื ื ืึธืืขื ืคืื ืื ืฆืืืืึทื). ืืขื ืืืขื ืืืจ ืงืขื ืขื ืงืืืจ ืืืขื ืืืคืืฆืืจื ืื ืคึผืื ืืืขื ืงืึทื ืคืืืืขืจืืืฉืึทื. ืืขืืขืจ ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืืขื ืืืคืืฆืืจื ืืื ืืงืื ืงืึธืจืึทืกืคึผืึทื ืื ืฆื ืึท ืกืคึผืขืฆืืคืืฉ ืงืึธืืืื ืึทืฆืืข ืคืื โโืคืื ืื ืืขืจืืขืืืืื ื ืึธืืื, ืคึผืึธืจืฅ, ืคืื ืืจืืืกื ืืืง ืจืขืกืืจืกื ืืื ืืืืืืึธืืขืง ืืืขืจืกืืขืก. ืคึฟืึทืจ ืื ืฆืืืขืงื ืคืื ืืขื ืคึผืึธืกืื, ืืืจ ืืืขืื ืืืขืจื ืขืืขื ืึทื ืขืก ืืื ืืืืื ืืืื ืฆืืืืึทื ืืื ืืืจ ืงืขื ืขื ืืืขื ืืืคืืฆืืจื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืืฃ ืื ืืขืืืืื ืืืขื ืืืขื ื ืืฆื ืืจืื ื ืืืขืจื ืืคืืขืฉืืืื ืืืจื ืึท ืคึผืื ืงื (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)
ืคืึทื ืืึธื ืืืืคึผืก
ืฆื ืืืขื ืืืคืืฆืืจื ืืขื ืคึผืจืึธืืึธืงืึธื ืืื ืื ืงืึทืืคึผืืืืื ื ืฆืืื, ืืืจ ื ืืฆื ืึท ืืืคึผ ืคึผืึทืจืึทืืขืืขืจ ืืืึธืก ืืื ื ืืฉื ืืขื ืืฆื ืืื ืืขืจ ืงืืึทืก. ืืขืจ ืืึทืฉืืืก ืืื ืจืขืื ืฆื ืืขื ืคืึทืงื ืึทื ืืืจ ืืึธื ื ืื ื ืืฆื ืึท ืคึผืจืึธืืึธืงืึธื ืืืึทืฉืคึผืื ืืื ืจืื ืืืืข, ืึธืืขืจ ืืืจ ืืืึธืื ืืื ืืขืจ ืงืึทืืคึผืืืืขืจ ืฆื ืงืึธื ืืจืึธืืืจื ืคึผืจืึธืืึธืงืึธื ืงืึทืืคึผืึทืืึทืืืืึทืื. ืืืจื ืกืคึผืขืฆืืคืืฆืืจื ืืขื ืคึผืจืึธืืึธืงืึธื, ืืืจ ืืืขืื ื ืืฉื ืงืขื ืขื ืฆื ืคืึธืจื ืึทื ืื ืึทืคึผืจืึธืืคึผืจืืื ืืื ืกื ืืื ืึท ืืขืคึผืขื ืืขื ืกื.
ืืืื ืขืจ ืคืื ืื ืคึผืจืึธืกื ืคึผืจืึธืืึธืงืึธืืก ืืื ืื 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
. ืืื ืืึทืืื ืืขืจ, ืืื ืื ืขืงืึธื ืงืืืขื ื ืืืจ ืืึทืจืคื ืื ืืขืืืข ืคึผืจืึธืืึธืงืึธื. ืืขืจืืืขืจ, ืืืขื ืงืึทื ืขืงืืื ื ืฆืืืื ืืึทืืื ืื ืืก, ืืืจ ืงืขื ืขื ืืืื ืืืืขืจ ืึทื ืึทืืฅ ืืืขื ืึทืจืืขืื ืจืืืืืง.
ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืืึทืืื ืื ืืขื
ื ืคึฟืื ืงืฆืืข ืืื ืคืืจืืื ืื ืฆื ืึธื ืืืืื ืืื ืืึทืืื ืื ืืื ืกื. (ืื ืคืืืืงืืื ืฆื ืืึทืืื ืึท ืืื ืกื ืืื ืงืจืืืืฉ ืคึฟืึทืจ ืืขืกืืื ื.) ืืืืืขืจ, ืขืก ืืขื ืขื ืขืืืขืืข ืึธืคึผืฆืืขืก ืคึฟืึทืจ ืืืคึผืืึทืืขื ืื ื ืึทืืึท ืึท ืฉืืจืื (ืืืฉื, ืืืจ ืงืขื ื ืืฆื ืืืคึผ ืงืืืกื ืืืืืจื ืืืืฃ ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืคึผ). ืคึฟืึทืจ ืื ืฆืืืขืงื ืคืื ืืขื ืคึผืึธืกืื, ืืืจ ืืืขืื ื ืืฆื ืื ืฉืืืงื ืืืกืืขืจ. ืืืจ ืืืขืื ืคืึธืจืฉืืขืื ืื ืืื ืกื ื ืืฆื ืึท ืงืืึทืก 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]]
}
ืขืก ืืขื ืขื ืขืืืขืืข ืืืขืื ืฆื ืื ืกืืจืืืขื ื ืืขื ืคึฟืื ืงืฆืืข:
- ืืืื ืื ืืืขื ืื ืืืขืจื ืืืงืื ื ืฆื ืืื ืื ืืืืืขืจ ืืืคึผืืืืืึทื ื, ืืืจ ืงืขื ืขื ืืืฉืขื ืขืจืืื ืกืงืึทืืึท ืงืึธื ืืื
ืึทืืจืขืกื ืืื ืืขืืึธืื ืืืืคื ืื ืืืืขื. ืืึธืก ืืืขื ืฆืื ืืืคื ืขืืขื ืืื ืืืืคื ืืขืกืฅ.
ืืื ืืขื ืคืึทื, ืื ืคึฟืื ืงืฆืืข ืืืขื ืืืื ืกืืึทืืืงืื ืืึทืืืืกื ืืื ืงืขื ืขื ืืืื ืจืขืคึผืจืืืขื ืืื ืืื ืงืึธื ืืื ืึท ืืึทืคึผืื ื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
'ืึธื, ืืื ืืขืจ ืงืืืขื ื ื ืึธืืข ืืขืจืืึทื ืืืฅ ื ืึธื ืขืืืขืืข ืืึธื. ืกืขื ืืืืขืืขืจ.
ืึทืืืขืืืื ืข ืึทื ืืืืืงืืื ื ืคึผืจืึธืฆืขืก
ืืื ืก ืืขื ืืื ืืขื ืงืึทื ืคืืืืขืจืืืฉืึทื ืฆืืืึทื ื ืึทืคืขืงืฅ ืื ืงืืืืขืืืืง ืึทื ืืืืืงืืื ื ืคึผืจืึธืฆืขืก.
ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืขื ืืืื ืงืึทืืคึผืืืื ืฆืืืืืขื ืืื ืื ืจืขืฉื ืคืื ืื ืงืึธื ืืื ืึท ืึทืจืืึทืคืึทืงื (.ืืืฉืึทืจ) ืืืขื ืืืื ืืืฉืขื ืขืจืืืืึทื. ืขืก ืืืื ื ืฆื ืืึทืื ืืื ืขื ืฆื ืฉืืขืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืึท ืืึทืืื ืืขืจ ืึทืจืืืคืึทืงื. ืืึธืก ืืื ืืืืึทื ืืืจ ืงืขื ืขื ืืึธืื ืงืืืคื ืงืึทื ืคืืืืขืจืืืฉืึทื ื ืืืืืจื ืืืืฃ ืืขืจ ืืขืืืืงืขืจ ืงืึธื. ืืืืืขืจ, ืขืก ืืื ืืขืืืขื ืฆื ืืืฉืขื ืขืจืืื ืึทืจืืึทืคืึทืงืฅ ืงืึธืจืึทืกืคึผืึทื ืืื ื ืฆื ืคืึทืจืฉืืืขื ืข ืงืึทื ืคืืืืขืจืืืฉืึทื ืฆืืืืืื. ืึธืคืขื ืืืงืืึทื ืืืืฃ ืกืคึผืขืฆืืคืืฉ ืืืขืจืกืืขืก ืคืื ืืืืืจืขืจืื ืืขื ืขื ืืขืจืืืขืืืขื ืฆืืืืืขื ืืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื, ืืื ืื ืืืขืจืกืืขืก ืืขื ืขื ืืขืจืืืขืืืขื ืืืืฃ ืืืืืืง ืืืขื ืืืจ ืืึทืฉืืืกื ืฆื ืฆืขืืืืงืืขื ืื ืืืขืจืกืืข ืคืื โโโโืื ืงืึทื ืคืืืืขืจืืืฉืึทื.
ืงืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืืฉื ืืืจื ืก ืืื ืึท ืงืึธื ืืืืฉื. ืืื ืืขืจืืืขืจ, ืืขืืขืจ
ืื ืขื ืืขืจืื ื ืืืขื ืืืื ืืืืขืงื ืืืจื ืื ื ืึธืจืืึทื ืงืืืึทืืืืขื ืคืืจืืืืขืจืื ื ืคึผืจืึธืฆืขืก:
ืืืืขื ืืื ืื ืืฉืืง ืืจืึทืงืขืจ -> ืคึผืจ -> ืึธืคึผืฉืึทืฆืื ื -> ืฆืื ืืืคืืืกื ืืื ืืึทืืืึทืืืง ืฆืืืืืื ->
ืื ืึทืืจืืืฉืึทื -> ืืืคึผืืืืืึทื ื
ืื ืืืืคึผื ืงืึทื ืกืึทืงืืืขื ืกืึทื ืคืื ืืืคึผืืึทืืขื ืื ื ืึท ืงืึทืืคึผืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขื ืขื:
-
ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืขื ืืืื ืงืึธื ืกืืกืืขื ื ืืื ืึทืืข ื ืึธืืื ืคืื ืื ืคืื ืื ืืขืจืืขืืืืื ืกืืกืืขื. ืจืขืื ืฆื ืืขื ืคืึทืงื ืึทื ืึทืืข ื ืึธืืื ืืึทืงืืืขื ืื ืืขืืืข ืงืึทื ืคืืืืขืจืืืฉืึทื ืคืื ืึท ืืืื ืืงืืจ.
-
ืขืก ืืื ืคึผืจืึธืืืขืืึทืืืง ืฆื ืืืืฉื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืืืืื ืืืื ืขืจ ืคืื ืื ื ืึธืืื. ืืขืจืืืขืจ, "ืงืึทื ืคืืืืขืจืืืฉืึทื ืืจืืคื" ืืื ืึทื ืืืืงืื.
-
ืขืก ืืืขืจื ืืขืจ ืฉืืืขืจ ืฆื ืืึทืื ืงืืืื ืขื ืืขืจืื ืืขื ืฆื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื.
-
ืจืืึฟ ืงืึทื ืคืืืืขืจืืืฉืึทื ืขื ืืขืจืื ืืขื ืืืขื ืคึผืึทืกืืจื ืืื ืึท ืืืื ืคืื ืื ืงืืืืขืืืืง ืึทื ืืืืืงืืื ื ืคึผืจืึธืฆืขืก ืืื ืืืขื ืืืื ืืื ืืขืจืืขื ืืง ืฆื ืึธืคึผืฉืึทืฆืื ื.
ืฆื ืืื ืืึทืจืคึฟื ืึท ืืึทืืื ืืขืจ ืจืืคึผืึทืืึทืืึธืจื ืฆื ืงืจืึธื ืื ืคึผืจืึธืืืงืฆืืข ืงืึทื ืคืืืืขืจืืืฉืึทื? ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืงืขื ืึทื ืืืึทืืื ืคึผืึทืกืืืขืจืื ืืื ืื ืืขืจืข ืฉืคึผืืจืขืืืืืง ืืื ืคึฟืึธืจืืึทืฆืืข ืฆื ืืืึธืก ืืืจ ืืืึธืื ืืื ืฆื ืืึทืืจืขื ืขืฆื ืึทืงืกืขืก. ืืึทืืืจื ืืืืฃ ืืขื, ืขืก ืืืื ื ืฆื ืืึทืื ืืื ืขื ืฆื ืงืจืึธื ืื ืืขืฆื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืึท ืืึทืืื ืืขืจ ืจืืคึผืึทืืึทืืึธืจื. ืืืจ ืงืขื ืขื ืฉืคึผืึทืืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืฆืืืื ืคึผืึทืจืฅ - ืืืื ืขืจ ืืื ืขืคื ืืืขื ืฆืืืจืืืืขื ืงืึทื ืคืืืืขืจืืืฉืึทื ืกืขืืืื ืืก ืืื ืืืื ืขืจ ืืื ืืืืืืขื ืกืขืืืื ืืก. ืืึธืก ืืืขื ืืึธืื ืจืืึฟ ืืขืืืขืืึธืคึผืขืจืก ืฆื ืืึธืื ืึทืงืกืขืก ืฆื ืคึผืจืึธืกื ืกืขืืืื ืืก. ืืขื ืฆืขืฉืืืืื ื ืืื ืืจืื ื ืฆื ืืขืจืืจืืืื ืืื ืื ืืขืจืืืืืื ืืจืืืฅ ืืื ืคืขืืืงืืึทื ืืืึทืืืขืก.
ืืขืืืขื ืืืขืจืืืืฉืึทื ื
ืืึธืืืจ ืคึผืจืืืืจื ืฆื ืคืึทืจืืืืึทืื ืื ืงืึทืืคึผืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืขืืืขืืข ืคึผืจืึธืกื ืึทืืืขืจื ืึทืืืืืขืก:
- ืืขืงืกื ืืขืงืข ืืืืฃ ืื ืฆืื ืืึทืฉืื.
- ืกืขื ืืจืึทืืืืื ืฉืืืกื-ืืืขืจื ืงืจืึธื (
etcd
/zookeeper
). - ืคึผืจืึธืฆืขืก ืงืึทืืคึผืึธืื ืึทื ืฅ ืืืึธืก ืงืขื ืขื ืืืื ืจืืงืึทื ืคืืืืขืจื / ืจืืกืืึทืจืืื ืึธื ืจืืกืืึทืจืืื ื ืืขื ืคึผืจืึธืฆืขืก.
- ืกืืึธืจืื ื ืงืึทื ืคืืืืขืจืืืฉืึทื ืึทืจืืืก ืคืื ืึทืจืืึทืคืึทืงื ืืื ืืืขืจืกืืข ืงืึธื ืืจืึธื.
ืืขืงืกื ืืขืงืขืก ืฆืืฉืืขืื ืืึทืืืึทืืืง ืืืืืืงืืึทื ืืื ืืขืจืืื ืขื ืคืื ืงืืืื ืขื ืืขืจืื ืืขื. ืืขืจ ืกืืกืืขื ืึทืืืื ืืกืืจืึทืืึธืจ ืงืขื ืขื ืงืืึธืฅ ืืื ืื ืืืืึทื ื ืึธืืข, ืืึทืื ืขื ืืขืจืื ืืขื ืฆื ืื ืฆืื ืขืืขื ืืขืงืขืก ืืื ืจืืกืืึทืจื ืื ืืื ืกื. ืคึฟืึทืจ ืืจืืืก ืกืืกืืขืืขื, ืึธืืขืจ, ืึทืืึท ืืืืืืงืืึทื ืงืขื ื ืืฉื ืืืื ืืืืืืขืจืึทืืึทื. ืื ืขื ืืขืจืื ืืขื ืืืึธืก ืืขื ืขื ืืขืืืื ืืึธืื ืงืืื ืฉืคึผืืจ ืืื ืื ืืขืจืข ืกืืกืืขืืขื. ืงืืื ืืืื ืขืจ ืจืขืฆืขื ืืืขืก ืื ืขื ืืขืจืื ืืขื. ืขืก ืืื ืฉืืืขืจ ืฆื ืืึทืฉืืืกื ืืืขืจ ืคึผืื ืงื ืืขืืืื ืื ืขื ืืขืจืื ืืขื ืืื ืคึฟืึทืจ ืืืึธืก ืกืืื. ืขื ืืขืจืื ืืขื ืืขื ืขื ื ืืฉื ืืขืกืืขื. ืืืื ืื ืกืืกืืขื ืืื ืคืื ืื ืืขืจืืขืืืืื, ืืขืจ ืึทืืืื ืืกืืจืึทืืึธืจ ืงืขื ืคืึทืจืืขืกื ืฆื ืืึทืื ืื ืงืึธืจืึทืกืคึผืึทื ืืื ื ืขื ืืขืจืื ื ืืืืฃ ืื ืืขืจืข ื ืึธืืื.
(ืขืก ืืึธื ืืืื ืืืื ืืืืขืจืงื ืึทื ื ืืฆื ืึท ืงืึทืืคึผืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ื ืืฉื ืคืึทืจืืึทืื ืื ืืขืืืขืืงืืื ืคืื ื ืืฆื ืืขืงืกื ืืขืงืขืก ืืื ืืขืจ ืฆืืงืื ืคึฟื. ืขืก ืืืขื ืืืื ืืขื ืื ืฆื ืืืืื ืึท ืคึผืึทืจืกืขืจ ืืื ืืืึทืืืืึทืืึธืจ ืืืึธืก ืคึผืจืึธืืืฆืืจื ืื ืืขืืืข ืืืคึผ ืืื ืจืขืืืืืึทื Config
, ืืื ืืืจ ืงืขื ืขื ื ืืฆื ืืขืงืกื ืืขืงืขืก. ืขืก ืืืืื ืืืื ืึทื ืื ืงืึทืืคึผืืขืงืกืืื ืคืื ืึท ืกืืกืืขื ืืื ืึท ืงืึทืืคึผืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืึท ืืืกื ืืืืื ืืงืขืจ ืืื ืื ืงืึทืืคึผืืขืงืกืืื ืคืื ืึท ืกืืกืืขื ื ืืฆื ืืขืงืกื ืืขืงืขืก, ืืืืึทื ืืขืงืกื ืืขืงืขืก ืืึทืจืคื ื ืึธื ืงืึธื.)
ื ืกืขื ืืจืึทืืืืื ืฉืืืกื-ืืืขืจื ืงืจืึธื ืืื ืึท ืืื ืืขืงืึทื ืืืึทื ืคึฟืึทืจ ืืืกืืจืืืืืืื ื ืืขืืึท ืคึผืึทืจืึทืืขืืขืจืก ืคืื ืึท ืคืื ืื ืืขืจืืขืืืืื ืึทืคึผืืึทืงืืืฉืึทื. ืืืจ ืืึทืจืคึฟื ืฆื ืืึทืฉืืืกื ืืืึธืก ืืขื ืขื ืงืึทื ืคืืืืขืจืืืฉืึทื ืคึผืึทืจืึทืืขืืขืจืก ืืื ืืืึธืก ืืขื ืขื ื ืึธืจ ืืึทืื. ืืื ืืื ืื ืืึธืื ืึท ืคึฟืื ืงืฆืืข C => A => B
, ืืื ืื ืคึผืึทืจืึทืืขืืขืจืก C
ืจืึทืจืขืื ืขื ืืขืจืื ืืขื, ืืื ืืึทืื A
- ืึธืคื. ืืื ืืขื ืคืึทื ืืืจ ืงืขื ืขื ืืึธืื ืึทื C
- ืงืึทื ืคืืืืขืจืืืฉืึทื ืคึผืึทืจืึทืืขืืขืจืก, ืืื A
- ืืึทืื. ืขืก ืืืืก ืึทื ืงืึทื ืคืืืืขืจืืืฉืึทื ืคึผืึทืจืึทืืขืืขืจืก ืึทื ืืขืจืฉ ืคืื ืืึทืื ืืื ืึทื ืืื ืืืืฉืึทืืืึทืื ืืืืฉื ืืืืื ืืงืขืจ ืึธืคื ืืื ืืึทืื. ืืืื, ืืึทืื ืืืืฉืึทืืืึทืื ืงืืืขื ืคืื ืืืื ืืงืืจ (ืคืื ืืขืจ ืืึทื ืืฆืขืจ), ืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืคึผืึทืจืึทืืขืืขืจืก ืคืื ืื ืืขืจื (ืคืื ืื ืกืืกืืขื ืึทืืืื ืืกืืจืึทืืึธืจ).
ืืืื ืจืึทืจืขืื ืืฉืึทื ืืื ื ืคึผืึทืจืึทืืขืืขืจืก ืืึทืจืคึฟื ืฆื ืืืื ืืขืจืืืึทื ืืืงื ืึธื ืจืืกืืึทืจืืื ื ืื ืคึผืจืึธืืจืึทื, ืืึธืก ืงืขื ืึธืคื ืคืืจื ืฆื ืื ืงืึทืืคึผืืึทืงืืืฉืึทื ืคืื ืื ืคึผืจืึธืืจืึทื, ืืืืึทื ืืืจ ืืืขืื ืขืคืขืก ืฆืืฉืืขืื ืคึผืึทืจืึทืืขืืขืจืก, ืงืจืึธื, ืคึผืึทืจืก ืืื ืงืึธื ืืจืึธืืืจื ืืื ืคึผืจืึธืฆืขืก ืคืึทืืฉ ืืืึทืืืขืก. ืืขืจืืืขืจ, ืคึฟืื ืื ืคืื ื ืคืื ืืืื ืื ื ืคืื ืจืืืืกืื ื ืื ืงืึทืืคึผืืขืงืกืืื ืคืื ืื ืคึผืจืึธืืจืึทื, ืขืก ืืื ืืื ืขื ืฆื ืจืขืืืฆืืจื ืื ื ืืืขืจ ืคืื ืคึผืึทืจืึทืืขืืขืจืก ืืืึธืก ืงืขื ืขื ืืืืฉื ืืขืฉืึทืก ืคึผืจืึธืืจืึทื ืึธืคึผืขืจืึทืฆืืข (ืึธืืขืจ ื ืื ืฉืืืฆื ืึทืืึท ืคึผืึทืจืึทืืขืืขืจืก ืืืึท ืึทืืข).
ืคึฟืึทืจ ืื ืฆืืืขืงื ืคืื ืืขื ืคึผืึธืกืื, ืืืจ ืืืขืื ืืืคืขืจืขื ืฉืืืื ืฆืืืืฉื ืกืืึทืืืง ืืื ืืื ืึทืืืฉ ืคึผืึทืจืึทืืขืืขืจืก. ืืืื ืื ืืึธืืืง ืคืื ืื ืืื ืกื ืจืืงืืืืืขืจื ืืฉืึทื ืืื ื ืคึผืึทืจืึทืืขืืขืจืก ืืขืฉืึทืก ืื ืึธืคึผืขืจืึทืฆืืข ืคืื โโืื ืคึผืจืึธืืจืึทื, ืืืจ ืืืขืื ืจืืคื ืึทืืึท ืคึผืึทืจืึทืืขืืขืจืก ืืื ืึทืืืฉ. ืึทื ืืขืจืฉ ืื ืึธืคึผืฆืืขืก ืืขื ืขื ืกืืึทืืืง ืืื ืงืขื ืขื ืืืื ืงืึทื ืคืืืืขืจื ืืื ืื ืงืึทืืคึผืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื. ืคึฟืึทืจ ืืื ืึทืืืฉ ืจืืงืึทื ืคืืืืขืจืืืฉืึทื, ืืืจ ืงืขื ืืึทืจืคึฟื ืึท ืืขืงืึทื ืืืึทื ืฆื ืจืืกืืึทืจื ืคึผืึทืจืฅ ืคืื ืืขื ืคึผืจืึธืืจืึทื ืืื ื ืืึทืข ืคึผืึทืจืึทืืขืืขืจืก, ืขื ืืขื ืฆื ืืื ืื ืคึผืจืึทืกืขืกืึทื ืคืื ืื ืึธืคึผืขืจืืืืื ื ืกืืกืืขื ืืขื ืขื ืจืืกืืึทืจืืื. (ืืื ืืื ืืืขืจ ืืืื ืื ื, ืขืก ืืื ืงืขืืืึทืืง ืฆื ืืืกืืืืื ืคืึทืงืืืฉ-ืฆืืื ืจืืงืึทื ืคืืืืขืจืืืฉืึทื, ืืืืึทื ืืึธืก ืื ืงืจืืกืื ืื ืงืึทืืคึผืืขืงืกืืื ืคืื ืื ืกืืกืืขื. ืืืื ืืขืืืขื, ืขืก ืืื ืืขืกืขืจ ืฆื ื ืืฆื ืื ื ืึธืจืืึทื ืึทืก ืงืืืคึผืึทืืืืึทืืื ืคึฟืึทืจ ืจืืกืืึทืจืืื ื ืคึผืจืึทืกืขืกืึทื.)
ืืืื ืืืืืืืง ืึทืกืคึผืขืงื ืคืื ื ืืฆื ืกืืึทืืืง ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืึธืก ืืืื ืืขื ืืฉื ืืึทืืจืึทืืื ืืื ืึทืืืฉ ืจืืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืื ืฆืืื ืขืก ื ืขืื ืคึฟืึทืจ ืื ืกืืกืืขื ืฆื ืจืขืืึธืึธื ื ืึธื ืึท ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืจืืืึทื ืืืงื (ืืึทืื ืืืื). ืืื ืคืึทืงื, ืืืื ืืืจ ืืึทืจืคึฟื ืฆื ืืึทืื ืขื ืืขืจืื ืืขื ืืื ืื ืกืืึทืืืง ืงืึทื ืคืืืืขืจืืืฉืึทื, ืืืจ ืืืขืื ืืึธืื ืฆื ืจืืกืืึทืจื ืื ืกืืกืืขื ืคึฟืึทืจ ืื ื ืืึทืข ืืืึทืืืขืก ืฆื ื ืขืืขื ืืืืจืงืื ื. ืื ืืึทืื ืืืื ืคึผืจืึธืืืขื ืืืขืจืื ืืื ืฉืืจืขื ืืงืืึทื ืคึฟืึทืจ ืคืึทืจืฉืืืขื ืข ืกืืกืืขืืขื. ืืื ืขืืืขืืข ืงืึทืกืขืก, ืืืจ ืงืขื ืขื ืคึผืืึทื ืึท ืจืขืืึธืึธื ืืื ืึท ืฆืืื ืืืขื ืื ืืึทืกืข ืืื ืืื ืืืึทื. ืืืื ืืืจ ืืึทืจืคึฟื ืฆื ืฆืืฉืืขืื ืงืขืกืืืืขืจืืืง ืืื ืกื, ืืืจ ืงืขื ืขื ืื ืกืืจืืืขื ื
ืืื ืืื ืื ืืืฆื ืืึทืืจืึทืืื ืื ืึทืจืืืกืืขืื ืคืื ืกืืึธืจืื ื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืื ืึธืืขืจ ืึทืจืืืก ืื ืึทืจืืึทืคืึทืงื. ืืืื ืืืจ ืงืจืึธื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืื ืึท ืึทืจืืึทืคืึทืงื, ืืืจ ืืื ืืื ืืกืืขืจ ืืืจ ืืึธืื ืื ืืขืืขืื ืืืื ืฆื ืืึทืฉืืขืืืงื ืื ืจืืืืืง ืคืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืฉืึทืก ืื ืคึฟืึทืจืืึทืืืื ื ืคืื ืื ืึทืจืืึทืคืึทืงื. ืืืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืึทืจืืืก ืื ืงืึทื ืืจืึธืืื ืึทืจืืึทืคืึทืงื, ืขืก ืืื ืฉืืืขืจ ืฆื ืฉืคึผืืจ ืืืขืจ ืืขืืืื ืขื ืืขืจืื ืืขื ืฆื ืืขื ืืขืงืข ืืื ืืืึธืก. ืืื ืืืืืืืง ืืื ืขืก? ืืื ืืื ืืืขืจ ืืืื ืื ื, ืคึฟืึทืจ ืคืืืข ืคึผืจืึธืืืงืฆืืข ืกืืกืืขืืขื ืขืก ืืื ืืืืืืืง ืฆื ืืึธืื ืึท ืกืืึทืืื ืืื ืืืื-ืงืืืึทืืืืขื ืงืึทื ืคืืืืขืจืืืฉืึทื.
ืื ืืืขืจืกืืข ืคืื โโโโืึท ืึทืจืืึทืคืึทืงื ืึทืืึทืื ืืืจ ืฆื ืืึทืฉืืืกื ืืืขื ืขืก ืืื ืืขืืืขื ืืืฉืืคื, ืืืึธืก ืืืึทืืืขืก ืขืก ืึผืืื, ืืืึธืก ืคืึทื ืืงืฉืึทื ื ืืขื ืขื ืขื ืืืืึทืื / ืคืึทืจืงืจืืคึผืื ืืื ืืืขืจ ืืื ืคืึทืจืึทื ืืืืึธืจืืืขื ืคึฟืึทืจ ืงืืื ืขื ืืขืจืื ื ืืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื. ืคืื ืงืืจืก, ืกืืึธืจืื ื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืึท ืึทืจืืึทืคืึทืงื ืจืืงืืืืืขืจื ืขืืืขืืข ืื, ืึทืืื ืืืจ ืืึทืจืคึฟื ืฆื ืืึทืื ืึท ืื ืคืึธืจืื ืืึทืฉืืืก.
ืคึผืจืึธืก ืืื ืงืึธื ืก
ืืื ืืืึธืื ืืื ืฆื ืืืืื ืขื ืืืืฃ ืื ืคึผืจืึธืก ืืื ืงืึธื ืก ืคืื ืื ืคืืจืืขืืืืื ืืขืื ืึธืืึธืืืข.
ืึทืืืืึทื ืืึทืืขืก
ืื ืืขืจ ืืื ืึท ืจืฉืืื ืคืื ืื ืืืืคึผื ืคึฟืขืึดืงืืืื ืคืื ืึท ืงืึทืืคึผืืืื ืคืื ืื ืืขืจืืขืืืืื ืกืืกืืขื ืงืึทื ืคืืืืขืจืืืฉืึทื:
- ืกืืึทืืืง ืงืึทื ืคืืืืขืจืืืฉืึทื ืืฉืขืง. ืึทืืึทืื ืืืจ ืฆื ืืืื ืืืืขืจ ืึทื
ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืจืืืืืง. - ืจืืืฉ ืงืึทื ืคืืืืขืจืืืฉืึทื ืฉืคึผืจืึทื. ืืืคึผืืงืึทืืื, ืื ืืขืจืข ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืืืึธืืก ืืขื ืขื ืืขืจืกืื ืก ืืืืืืขื ืฆื ืกืืจืื ื ืืืขืจืืึทืืึทื ืกืึทืืกืืืืืฉืึทื. ืืืขื ืืืจ ื ืืฆื Scala, ืึท ืืจืืื ืงืืื ืคืื ืฉืคึผืจืึทื ืคึฟืขืึดืงืืืื ืืขื ืขื ืืืจืขืืืืื ืฆื ืคึฟืึทืจืืขืกืขืจื ืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื. ืคึฟืึทืจ ืืืึทืฉืคึผืื ืืืจ ืงืขื ืขื ื ืืฆื
ืืจืืืฅ ืคึฟืึทืจ ืคืขืืืงืืึทื ืืืึทืืืขืก, ื ืืฆื ืึทืืืืฉืขืงืฅ ืฆื ืืจืืคึผืข ืคึผืึทืจืึทืืขืืขืจืก, ืืืจ ืงืขื ืขื ืึธืคึผืฉืืงื ืฆื ืืืึทืืก ืืขืจืงืืขืจื ืืืืื ืึทืืึธื (DRY) ืืื ืื ืขื ืงืืึธืืืื ื ืคืึทืจื ืขื. ืืืจ ืงืขื ืขื ืื ืกืืึทื ืืืื ืงืืื ืงืืืกื ืืืืื ืืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื (Seq
,Map
, ืื ืื ืงืืืกื). - ืืกื. Scala ืืื ืึท ื ืืืขืจ ืคืื ืฉืคึผืจืึทื ืคึฟืขืึดืงืืืื ืืืึธืก ืืึทืื ืขืก ืืจืื ืืขืจ ืฆื ืฉืึทืคึฟื ืึท DSL. ืขืก ืืื ืืขืืืขื ืฆื ื ืืฆื ืื ืคึฟืขืึดืงืืืื ืืื ืื ืกืืจืืืขื ื ืึท ืงืึทื ืคืืืืขืจืืืฉืึทื ืฉืคึผืจืึทื ืืืึธืก ืืื ืืขืจ ืืึทืงืืืขื ืคึฟืึทืจ ืื ืฆืื ืืจืืคึผืข ืคืื โโื ืืฆืขืจืก, ืึทืืื ืึทื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืืคึผืืืช ืืืื ืขืืืืืง ืืืจื ืคืขืื ืขืงืกืคึผืขืจืฅ. ืกืคึผืขืกืืึทืืืกืฅ ืงืขื ืขื, ืืืฉื, ืึธื ืืืื ื ืขืืขื ืืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืึธืคึผืฉืึทืฆืื ื ืคึผืจืึธืฆืขืก.
- ืึธืจื ืืืขืืงืืึทื ืืื ืกืื ืืฉืจืึธื ื ืฆืืืืฉื ื ืึธืืื. ืืืื ืขืจ ืคืื ืื ืึทืืืืึทื ืืืืืฉืื ืคืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืคืื ืึท ืืึทื ืฅ ืคืื ืื ืืขืจืืขืืืืื ืกืืกืืขื ืกืืึธืจื ืืื ืึท ืืืื ืคืื ื ืืื ืึทื ืึทืืข ืืืึทืืืขืก ืืขื ืขื ืืขืจืงืืขืจื ืคึผืื ืงื ืึทืืึธื ืืื ืืขืืึธืื ืจืืืื ืืื ื ืึธืจ ืืื ืืขื ืขื ืืืจืฃ. ื ืืฆื ืคืึทื ืืึธื ืืืืคึผืก ืฆื ืืขืจืงืืขืจื ืคึผืึธืจืฅ ืื ืฉืืจื ืึทื ื ืึธืืื ื ืืฆื ืงืึทืืคึผืึทืืึทืืึทื ืคึผืจืึธืืึธืงืึธืืก ืืื ืึทืืข ืจืืืืืง ืกืืกืืขื ืงืึทื ืคืืืืขืจืืืฉืึทื ื. ืืืืื ืืงืกืคึผืืืกืึทื ืืึทื ืืึทืืึธืจื ืืืคึผืขื ืืึทื ืกืื ืฆืืืืฉื ื ืึธืืื ืื ืฉืืจื ืึทื ืึทืืข ืกืขืจืืืืกืขืก ืืขื ืขื ืงืึธื ื ืขืงืืขื.
- ืืืื ืงืืืึทืืืืขื ืขื ืืขืจืื ืืขื. ืืืื ืขื ืืขืจืื ืืขื ืฆื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืึท ืคึผืจืึธืกื ืึทื ืืืืืงืืื ื ืคึผืจืึธืฆืขืก ืืืื ืขืก ืืขืืืขื ืฆื ืืขืจืืจืืืื ืืืื ืงืืืึทืืืืขื ืกืืึทื ืืึทืจืืก ืคึฟืึทืจ ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืื.
- ืกืืืืึทืืืืื ืืึทืก ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืจืืืึทื ืืืงื. ืึธืืึทืืึทืืืง ืกืืกืืขื ืืืคึผืืืืืึทื ื ื ืึธื ืงืึทื ืคืืืืขืจืืืฉืึทื ืขื ืืขืจืื ืืขื ืขื ืฉืืจ ืึทื ืึทืืข ื ืึธืืื ืืขื ืขื ืืขืจืืืึทื ืืืงื.
- ืกืืืคึผืืึทืคืืืื ื ืื ืึทืคึผืืึทืงืืืฉืึทื. ืื ืึทืคึผืืึทืงืืืฉืึทื ืืึทืจืฃ ื ืื ืคึผืึทืจืกืื ื, ืงืึทื ืคืืืืขืจืืืฉืึทื ืงืึธื ืืจืึธืืืจืื ื ืึธืืขืจ ืืึทื ืืืื ื ืคืึทืืฉ ืืืึทืืืขืก. ืืึธืก ืจืึทืืืกืึทื ืื ืงืึทืืคึผืืขืงืกืืื ืคืื ืื ืึทืคึผืืึทืงืืืฉืึทื. (ืขืืืขืืข ืคืื โโืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืงืึทืืคึผืืขืงืกืืื ืืืืขืจืงื ืืื ืืื ืืืขืจ ืืืึทืฉืคึผืื ืืื ื ืืฉื ืึทื ืึทืืจืืืืื ืคืื ืื ืงืึทืืคึผืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื, ืึธืืขืจ ืืืืื ืึท ืืึทืืืืกืืืื ืืง ืืึทืฉืืืก ืืขืืจืืื ืืืจื ืื ืคืึทืจืืึทื ื ืฆื ืฆืืฉืืขืื ืึท ืืจืขืกืขืจืข ืืืคึผ ืืืืขืจืงืืึทื.) ืขืก ืืื ืืึทื ืฅ ืืจืื ื ืฆื ืฆืืจืืงืงืืืขื ืฆื ืื ืืขืืืืื ืืืขื ืงืึทื ืคืืืืขืจืืืฉืึทื - ื ืึธืจ ืื ืกืืจืืืขื ื ืื ืคืขืื ืืืง. ืืืืื. ืืขืจืืืขืจ, ืืืจ ืงืขื ืขื, ืืืฉื, ืึธื ืืืืื ืืื ืึท ืงืึทืืคึผืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื, ืืืคืขืจืื ื ืื ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืืื ืืืืืง ืคึผืึทืจืฅ ืืื ืื ืฆืืื ืืืขื ืขืก ืืื ืืึทืงืข ืืืจืฃ.
- ืืืขืจืกืืคืืขื ืงืึทื ืคืืืืขืจืืืฉืึทื. ืืื ื ืงืึทื ืคืืืืขืจืืืฉืึทื ืขื ืืขืจืื ืืขื ื ืึธืืคืึธืืื ืื ืืขืืืืื ืืืขื ืืืจื ืคืื ืงืืื ืื ืืขืจืข ืขื ืืขืจืื ืืขื, ืืขืจ ืจืขืืืืืึทื ืืืึธืก ืืืจ ืืึทืงืืืขื ืืื ืึทื ืึทืจืืึทืคืึทืงื ืืื ืึท ืืื ืฆืืง ืืืขืจืกืืข. ืืึธืก ืึทืืึทืื ืืื ืื, ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืฆื ืฆืืจืืงืงืืืขื ืฆื ืึท ืคืจืืขืจืืืงื ืืืขืจืกืืข ืคืื โโโโืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืื ื ืืืืืง. ืืืจ ืงืขื ืขื ืืคืืื ื ืืฆื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืคืื ืึท ืืึธืจ ืฆืืจืืง ืืื ืื ืกืืกืืขื ืืืขื ืึทืจืืขืื ืคึผืื ืงื ืื ืืขืืืข. ื ืกืืึทืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืคึผืจืืืื ืื ืคึผืจืืืืงืืึทืืืืืื ืืื ืจืืืืืึทืืืืึทืื ืคืื ืึท ืคืื ืื ืืขืจืืขืืืืื ืกืืกืืขื. ืืื ื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืคืึทืจืคืขืกืืืงื ืืื ืื ืืึทืืืื ื ืืื ืข, ืขืก ืืื ืืึทื ืฅ ืฉืืืขืจ ืฆื ืฉืืืื ืื ืขืก ืืื ืคึผืจืึธืืืงืฆืืข.
- ืืึธืืืืึทืจืืื. ืื ืคืืจืืขืืืืื ืคืจืืืืืืขืจืง ืืื ืืึทืืืฉืึทืืขืจ ืืื ืื ืืึทืืืฉืืื ืงืขื ืขื ืืืื ืงืึทืืืืื ื ืืื ืคืึทืจืฉืืืขื ืข ืืืขืื ืฆื ืฉืึทืคึฟื ืคืึทืจืฉืืืขื ืข ืกืืกืืขืืขื. ืืื ืืึทืืื ืืขืจ, ืืืจ ืงืขื ืขื ืงืึทื ืคืืืืขืจ ืื ืกืืกืืขื ืฆื ืืืืคื ืืืืฃ ืึท ืืืื ื ืึธืืข ืืื ืืืื ืขืืืึทืืืืึทื ื, ืืื ืืืืฃ ืงืืืคื ื ืึธืืื ืืื ืื ืืขืจื. ืืืจ ืงืขื ืขื ืืึทืื ืขืืืขืืข ืงืึทื ืคืืืืขืจืืืฉืึทื ื ืคึฟืึทืจ ืคึผืจืึธืืืงืฆืืข ืื ืกืืึทื ืกืื ืคืื ืื ืกืืกืืขื.
- ืืขืกืืื ื. ืืืจื ืจืืคึผืืืืกืื ื ืืืื ืืึทืืื ืื ืืก ืืื ืจืืืฆื ืึทืืืืฉืขืงืฅ, ืืืจ ืงืขื ืขื ืืึทืงืืืขื ืขืืืขืืข ืืืขืจืกืืขืก ืคืื ืื ืกืืกืืขื ืืืึธืก ืืขื ืขื ืืึทืงืืืขื ืคึฟืึทืจ ืืขืกืืื ื.
- ืื ืืขืืจืึทืืืึธื ืืขืกืืื ื. ืืืืื ืึท ืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืคึฟืึทืจ ืื ืืื ืฆืข ืคืื ืื ืืขืจืืขืืืืื ืกืืกืืขื ืืืื ืขืก ืืขืืืขื ืฆื ืืืืคื ืึทืืข ืงืึทืืคึผืึธืื ืึทื ืฅ ืืื ืึท ืงืึทื ืืจืึธืืื ืกืืืืืืข ืืื ืึท ืืืื ืคืื ืื ืืึทืืจืืืฉืึทื ืืขืกืืื ื. ืขืก ืืื ืืจืื ื ืฆื ืขืืืึทืืืื, ืืืฉื, ืึท ืกืืืืึทืฆืืข ืืื ืขืืืขืืข ื ืึธืืื ืืืขืจื ืฆืืืจืืืืขื.
ืืืกืึทืืืืึทื ืืืืืฉืื ืืื ืืืืืืืืฉืึทื ื
ืงืึธืืคึผืืืขื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืึทื ืืขืจืฉ ืคืื ืื ืืขืจืข ืงืึทื ืคืืืืขืจืืืฉืึทื ืึทืคึผืจืึธืืืฉืื ืืื ืงืขื ื ืืฉื ืืืื ืคึผืึทืกืืง ืคึฟืึทืจ ืขืืืขืืข ืึทืคึผืืึทืงืืืฉืึทื ื. ืื ืืขืจ ืืขื ืขื ืขืืืขืืข ืืืกืึทืืืืึทื ืืืืืฉืื:
- ืกืืึทืืืง ืงืึทื ืคืืืืขืจืืืฉืึทื. ืืื ืืืจ ืืึทืจืคึฟื ืฆื ืืขืฉืืืื ื ืจืืืืืง ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืคึผืจืึธืืืงืฆืืข, ืืืืคึผืึทืกืื ื ืึทืืข ืคึผืจืึทืืขืงืืืื ืืขืงืึทื ืืืึทืื. ืืื ืืขื ืฆืืืึทื ื ืขืก ืงืขื ืืืื ืืขืจ ืฉืืืขืจ. ืืื ืืื ืืกืืขืจ, ืืึทืืืื ื ืืื ืึธืืึทืืึทืืืง ืืืคึผืืืืืึทื ื ืืืขื ื ืึธื ืืืื ืคืืจืืื ืื. ืืึธืก ืืื ืืืืืข ืึท ื ืืฆืืง ืฉืืจืื ืคืื ืืขื ืฆืืืึทื ื ืืื ืึท ืืืกืึธืจื ืืื ืขืืืขืืข ืงืึทืกืขืก.
- ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืจ. ืืื ืคืึทื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืงืข ืืื ืืืฉืขื ืขืจืืืืึทื ืืืจื ืึทื ืึธืืึทืืึทืืืง ืืขืฆืืึทื, ื ืึธื ืืฉืชืืืืช ืงืขื ืืืื ืคืืจืืื ืื ืฆื ืืืกืฉืืืืขื ืื ืืืืขื ืฉืจืืคื.
- ืืืฉืืจืื. ืืขืจืืืืึทื, ืืืืืืึทืืื ืืื ืืขืงื ืืงืก ืืืืืื ื ืฆื ืึทืจืืขืื ืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขื ืขื ืืืืืจื ืืืืฃ ืืขืงืกื ืืขืงืขืก. ื ืื ืึทืืข ืึทืืึท ืืืืืืึทืืื / ืืขืงื ืืงืก ืืืขื ืืืื ืืืจืขืืืืื ืืื ืึท ืงืึทืืคึผืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื.
- ื ืขื ืืขืจืื ื ืืื ืึทืืึทืืืื ืืื ืคืืจืืื ืื. ืืขืืืขืืึธืคึผืขืจืก ืืื DevOps ืืขื ืขื ืฆืืืขืืืืื ื ืฆื ืืขืงืกื ืืขืงืขืก. ืืขืจ ืืขืืึทื ืง ืคืื ืงืึทืืคึผืืืืื ื ืึท ืงืึทื ืคืืืืขืจืืืฉืึทื ืงืขื ืืืื ืขืคึผืขืก ืืืืืขืจืืื ืืื ืืืืขืืืืื ืืืขื ืืื ืคืึทืจืฉืึทืคื ืจืืืืฉืขืงืฉืึทื.
- ื ืืืื ืงืืืึทืืืืขื ืึทื ืืืืืงืืื ื ืคึผืจืึธืฆืขืก ืืื ืคืืจืืื ืื. ืืื ืกืืจ ืฆื ืงืึทืืคืขืจืืึทืืื ื ืืฆื ืื ืงืึทืืคึผืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื, ืคืื ืึธืืึทืืืืฉืึทื ืคืื ืืขื ืคึผืจืึธืฆืขืก ืคืื ืืืืขื ืืื ืืืคึผืืืืื ื ืื ืึทืคึผืืึทืงืืืฉืึทื (CI / CD) ืืื ื ืืืืืง. ืึทื ืืขืจืฉ ืขืก ืืืขื ืืืื ืืึทื ืฅ ืืืืึทืงืืืขื.
ืืื ืืื ืื ืืืื ืืืืื ืขื ืืืืฃ ืึท ื ืืืขืจ ืคืื ืืืืืืืืฉืึทื ื ืคืื ืื ืืึทืืจืึทืื ืืืืฉืคึผืื ืืืึธืก ืืขื ืขื ื ืืฉื ืฉืืื ืฆื ืืขืจ ืืขืืึทื ืง ืคืื ืึท ืงืึทืืคึผืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื:
- ืืืื ืืืจ ืฆืืฉืืขืื ืืื ืืืืืง ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืคึฟืึธืจืืึทืฆืืข ืืืึธืก ืืื ื ืืฉื ืืขื ืืฆื ืืืจื ืื ื ืึธืืข, ืืขืจ ืงืึทืืคึผืืืืขืจ ืืืขื ื ืืฉื ืืขืืคึฟื ืืื ืื ืืืืขืงื ืื ืคืขืื ืืืง ืืืคึผืืึทืืขื ืืืืฉืึทื. ืืขื ืคึผืจืึธืืืขื ืงืขื ืขื ืืืื ืกืึทืืืื ืืืจื ืคืึทืจืืึธืื ืืขื ืฉืืืงื ืืืกืืขืจ ืืื ื ืืฆื ืืขืจ ืฉืืจืขื ื ืืืืคึผืก, ืืืฉื,
HList
ืึธืืขืจ ืึทืืืขืืจืึทืืง ืืึทืื ืืืืคึผืก (ืคืึทื ืงืืืกื) ืฆื ืคืึธืจืฉืืขืื ืงืึทื ืคืืืืขืจืืืฉืึทื. - ืขืก ืืขื ืขื ืฉืืจืืช ืืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืงืข ืืืึธืก ืืขื ืขื ื ืืฉื ืฉืืื ืฆื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื: (
package
,import
,ืึธืืืืฉืขืงื ืืขืงืืึทืจืึทืฆืืขืก;override def
'ืก ืคึฟืึทืจ ืคึผืึทืจืึทืืขืืขืจืก ืืืึธืก ืืึธืื ืคืขืืืงืืึทื ืืืึทืืืขืก). ืืึธืก ืงืขื ืืืื ืืืื ืึทืืืืืืื ืืืื ืืืจ ืื ืกืืจืืืขื ื ืืืื ืืืืืขื ืข ืืกื. ืืื ืืขืจืฆื, ืื ืืขืจืข ืืืืคึผืก ืคืื ืงืึทื ืคืืืืขืจืืืฉืึทื (ืืืฉื, XML) ืืืื ืึธื ืืึธื ืืืืขืจ ืจืืกืืจืืงืฉืึทื ื ืืืืฃ ืื ืืขืงืข ืกืืจืืงืืืจ. - ืคึฟืึทืจ ืื ืฆืืืขืงื ืคืื ืืขื ืคึผืึธืกืื, ืืืจ ืืขื ืขื ื ืืฉื ืงืึทื ืกืืืขืจืื ื ืืื ืึทืืืฉ ืจืืงืึทื ืคืืืืขืจืืืฉืึทื ืคืื ืึท ืงื ืืื ืคืื ืขื ืืขื ื ืึธืืื.
ืกืึธืฃ
ืืื ืืขื ืคึผืึธืกืื, ืืืจ ืืืกืคืึธืจืฉื ืื ืืขืืึทื ืง ืคืื ืจืขืคึผืจืืืขื ืืื ื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืืงืืจ ืงืึธื ื ืืฆื ืื ืึทืืืึทื ืกืืจืืข ืงืืืคึผืึทืืืืึทืืื ืคืื ืื Scala ืืืคึผ ืกืืกืืขื. ืืขืจ ืฆืืืึทื ื ืงืขื ืขื ืืืื ืืขืืืืื ื ืืื ืคืึทืจืฉืืื ืึทืคึผืืึทืงืืืฉืึทื ื ืืื ืึท ืคืึทืจืืืึทื ืคึฟืึทืจ ืืจืืืืฆืืื ืขืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืขืืืึธืืก ืืืืืจื ืืืืฃ ืงืกืื ืึธืืขืจ ืืขืงืกื ืืขืงืขืก. ืืึธืืฉ ืืื ืืืขืจ ืืืืฉืคึผืื ืืื ืืืคึผืืึทืืขื ืึทื ืืื ืกืงืึทืืึท, ืื ืืขืืืข ืืขืืื ืงืขื ืงืขื ืขื ืืืื ืืจืึทื ืกืคืขืจื ืฆื ืื ืืขืจืข ืงืึทืืคึผืืืื ืฉืคึผืจืึทืื (ืึทืืึท ืืื ืงืึธืืืื, C #, ืกืืืืคื, ...). ืืืจ ืงืขื ืขื ืคึผืจืืืืจื ืืขื ืฆืืืึทื ื ืืื ืืืื ืขืจ ืคืื ืื ืคืืืืขื ืืข ืคึผืจืึทืืืฉืขืงืก, ืืื, ืืืื ืขืก ืืื ื ืืฉื ืึทืจืืขืื, ืืึทื ืืืืฃ ืฆื ืื ืืขืงืกื ืืขืงืข, ืึทืืื ื ืื ืคืขืื ืืืง ืคึผืึทืจืฅ.
ืืขืืืืื ืืืขื, ืึท ืงืึทืืคึผืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืจืืงืืืืืขืจื ืึท ืืืื ืงืืืึทืืืืขื ืึทื ืืืืืงืืื ื ืคึผืจืึธืฆืขืก. ืืื ืฆืืจืืงืงืืืขื, ืืืื ืงืืืึทืืืืขื ืืื ืจืืืืืึทืืืืึทืื ืคืื ืงืึทื ืคืืืืขืจืืืฉืึทื ื ืืื ืื ืฉืืจื.
ืืขืจ ืืืืจืืื ืฆืืืึทื ื ืงืขื ืขื ืืืื ืืงืกืคึผืึทื ืืื:
- ืืืจ ืงืขื ืขื ื ืืฆื ืืึทืงืจืึธืก ืฆื ืืืจืืคืืจื ืงืึธืืคึผืื-ืฆืืื ืืฉืขืงืก.
- ืืืจ ืงืขื ืขื ืื ืกืืจืืืขื ื ืึท DSL ืฆื ืคืึธืจืฉืืขืื ืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืึท ืืืขื ืึทื ืืื ืฆืืืจืืืืขื ืฆื ืกืืฃ ื ืืฆืขืจืก.
- ืืืจ ืงืขื ืขื ืื ืกืืจืืืขื ื ืืื ืึทืืืฉ ืืืื ืคืึทืจืืืึทืืืื ื ืืื ืึธืืึทืืึทืืืง ืงืึทื ืคืืืืขืจืืืฉืึทื ืึทืืืฉืึทืกืืืึทื ื. ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืืฉืึทื ืืื ื ืื ื ืืืขืจ ืคืื ื ืึธืืื ืืื ืึท ืงื ืืื ืจืืงืืืืืขืจื ืึทื (1) ืืขืืขืจ ื ืึธืืข ืืึทืงืืืขื ืึท ืืืกื ืึทื ืืขืจืฉ ืงืึทื ืคืืืืขืจืืืฉืึทื; (2) ืืขืจ ืงื ืืื ืคืึทืจืืืึทืืืขืจ ืืืงืืืขื ืืื ืคึฟืึธืจืืึทืฆืืข ืืืขืื ื ืืึทืข ื ืึธืืื.
ืึทืงืงื ืึธืืืืขืืืืขื ืฅ
ืืื ืืืึธืื ืืื ืฆื ืืึทื ืงืขื Andrei Saksonov, Pavel Popov ืืื Anton Nekhaev ืคึฟืึทืจ ืืืืขืจ ืงืึทื ืกืืจืึทืงืืืื ืงืจืืืืง ืคืื ืืขื ืคึผืืึทื ืึทืจืืืงื.
ืืงืืจ: www.habr.com