Nhazi mkpokọta nke usoro kesara

Na post a, anyị ga-achọ ịkekọrịta ụzọ na-atọ ụtọ maka ịme nhazi nke sistemụ kesara.
A na-anọchi anya nhazi ahụ ozugbo n'asụsụ Scala n'ụdị adịghị mma. A kọwara mmejuputa ihe atụ na nkọwa. A na-atụle akụkụ dị iche iche nke atụmatụ ahụ, gụnyere mmetụta na usoro mmepe n'ozuzu ya.

Nhazi mkpokọta nke usoro kesara

(na Russian)

Okwu Mmalite

Iwulite sistemu ekesa siri ike chọrọ iji nhazi ziri ezi na nke jikọrọ ọnụ na ọnụ niile. Ihe ngwọta a na-ahụkarị bụ iji nkọwa ntinye ederede (terraform, asible ma ọ bụ ihe yiri ya) na faịlụ nhazi na-akpaghị aka (mgbe - raara onwe ya nye maka ọnụ / ọrụ ọ bụla). Anyị ga-achọkwa iji otu protocol nke otu nsụgharị na ọnụ ọnụ nke ọ bụla (ma ọ bụghị ya, anyị ga-enwe nsogbu enweghị nkwekọrịta). Na ụwa JVM nke a pụtara na opekata mpe, ọba akwụkwọ ozi kwesịrị ịdị otu ụdị na ọnụ ụzọ niile.

Kedu maka ịnwale usoro ahụ? N'ezie, anyị kwesịrị inwe ule unit maka ihe niile tupu abịa na mwekota ule. Iji nwee ike iwepụta nsonaazụ ule n'oge ọ na-agba ọsọ, anyị kwesịrị ijide n'aka na edobere ụdị ọba akwụkwọ niile n'otu oge na gburugburu ule.

Mgbe ị na-eme ule njikọta, ọ na-adịkarị mfe ịnwe otu ụzọ klaasị n'ọnụ ọnụ niile. Naanị anyị kwesịrị ijide n'aka na a na-eji otu ụzọ klaasị na ntinye. (Ọ ga-ekwe omume iji ụzọ klaasị dị iche iche na ọnụ ụzọ dị iche iche, mana ọ na-esiri ike ịnọchite anya nhazi a ma tinye ya n'ụzọ ziri ezi.) Ya mere, iji mee ka ihe dị mfe, anyị ga-atụle naanị ụzọ klas ndị yiri ya na ọnụ ụzọ niile.

Nhazi na-achọkarị ịmalite yana ngwa ngwa. Anyị na-ejikarị nsụgharị mata dị iche iche
ogbo nke software evolushọn. Ọ dị ka ihe ezi uche dị na ya ikpuchi nhazi n'okpuru njikwa ụdị ma chọpụta nhazi dị iche iche nwere akara ụfọdụ. Ọ bụrụ na enwere naanị otu nhazi na mmepụta, anyị nwere ike iji otu ụdị dị ka ihe nchọpụta. Mgbe ụfọdụ, anyị nwere ike ịnwe ọtụtụ gburugburu mmepụta. Na gburugburu ebe obibi ọ bụla anyị nwere ike ịchọ ngalaba nhazi dị iche iche. Ya mere enwere ike ịkanye nhazi na alaka na ụdị iji chọpụta nhazi dị iche iche. Labelụ alaka ọ bụla na ụdị ya dabara na otu ngwakọta nke ọnụ ụzọ ekesa, ọdụ ụgbọ mmiri, akụrụngwa mpụga, ụdị ọba akwụkwọ klaasị na ọnụ nke ọ bụla. N'ebe a, anyị ga-ekpuchi naanị otu alaka ụlọ ọrụ wee chọpụta nhazi site na ụdị nkeji iri atọ (1.2.3), n'otu ụzọ ahụ dị ka ihe ndị ọzọ.

N'ime mpaghara ọgbara ọhụrụ, anaghị eji aka emezi faịlụ nhazi. Na-emekarị anyị na-emepụta
config faịlụ n'oge nnyefe na emetụla ha aka emesia. Ya mere, mmadụ nwere ike ịjụ ihe mere anyị ka ji eji usoro ederede maka faịlụ nhazi? Nhọrọ dị mma bụ itinye nhazi n'ime ngalaba nchịkọta ma rite uru na nkwado nhazi oge nchịkọta.

Na nke a post anyị ga-enyocha echiche nke idobe nhazi na artifact chịkọtara.

Nhazi enwere ike ikpokọta

N'akụkụ a, anyị ga-atụle ihe atụ nke nhazi static. A na-ahazi ma mejuputa ọrụ abụọ dị mfe - ọrụ echo na onye ahịa nke ọrụ echo. Mgbe ahụ, a na-ewepụta usoro abụọ dị iche iche nkesa nwere ọrụ abụọ ahụ ozugbo. Otu bụ maka otu nhazi ọnụ ọnụ na nke ọzọ maka nhazi ọnụ abụọ.

Usoro a na-ekesa nke ọma nwere ọnụ ọnụ ole na ole. Enwere ike iji ụdị ụfọdụ chọpụta ọnụ ọnụ:

sealed trait NodeId
case object Backend extends NodeId
case object Frontend extends NodeId

ma ọ bụ naanị

case class NodeId(hostName: String)

ma ọ bụ ọbụna

object Singleton
type NodeId = Singleton.type

Ọnụ ndị a na-arụ ọrụ dị iche iche, na-arụ ọrụ ụfọdụ ma nwee ike iji njikọ TCP/HTTP na-ekwurịta okwu na ọnụ ndị ọzọ.

Maka njikọ TCP opekata mpe, achọrọ nọmba ọdụ ụgbọ mmiri. Anyị na-achọkwa ijide n'aka na onye ahịa na ihe nkesa na-ekwu otu protocol. Iji gosipụta njikọ dị n'etiti ọnụ ka anyị kwupụta klas ndị a:

case class TcpEndPoint[Protocol](node: NodeId, port: Port[Protocol])

ebe Port bụ naanị otu Int n'ime oke ekwenyere:

type PortNumber = Refined[Int, Closed[_0, W.`65535`.T]]

Ụdị nụchara anụcha

Lee nụchara ụlọ akwụkwọ. Na nkenke, ọ na-enye ohere ịgbakwunye ihe mgbochi oge na ụdị ndị ọzọ. N'okwu a Int a na-ahapụ ya ka ọ nwee ụkpụrụ 16-bit nke nwere ike ịnọchite anya nọmba ọdụ ụgbọ mmiri. Ọnweghị ihe achọrọ iji ọbá akwụkwọ a maka usoro nhazi a. Ọ dị ka ọ dabara nke ọma.

Maka HTTP (REST) ​​anyị nwekwara ike ịchọ ụzọ ọrụ:

type UrlPathPrefix = Refined[String, MatchesRegex[W.`"[a-zA-Z_0-9/]*"`.T]]
case class PortWithPrefix[Protocol](portNumber: PortNumber, pathPrefix: UrlPathPrefix)

Ụdị Phantom

Iji chọpụta protocol n'oge nchịkọta anyị na-eji njirimara Scala nke ikwuwapụta ụdị arụmụka Protocol nke na-adịghị eji na klas. Ọ bụ ihe a na-akpọ ụdị phantom. N'oge ọsọ, anyị anaghị achọ ihe ngosi nke protocol, ya mere anyị anaghị echekwa ya. Mgbe a na-achịkọta ụdị phantom a na-enye nchekwa ụdị ọzọ. Anyị enweghị ike iji ụkpụrụ na-ezighi ezi gafere ọdụ ụgbọ mmiri.

Otu n'ime ụkpụrụ ndị a na-ejikarị eme ihe bụ REST API na usoro Json:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

ebe RequestMessage bụ isi ụdị ozi onye ahịa nwere ike izipu na ihe nkesa na ResponseMessage bụ ozi nzaghachi sitere na sava. N'ezie, anyị nwere ike ịmepụta nkọwa protocol ndị ọzọ nke na-akọwapụta usoro nzikọrịta ozi na nkenke achọrọ.

Maka ebumnuche nke post a, anyị ga-eji ụdị protocol dị mfe:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

N'ime usoro arịrịọ a ka etinyere ozi na url wee weghachi ozi nzaghachi dị ka eriri doro anya.

Enwere ike ịkọwa nhazi ọrụ site na aha ọrụ, nchịkọta ọdụ ụgbọ mmiri na ụfọdụ ndabere. Enwere ụzọ ole na ole enwere ike isi gosipụta ihe ndị a niile na Scala (dịka ọmụmaatụ, HList, ụdị data algebra). Maka ebumnuche nke ọkwa a, anyị ga-eji usoro achicha ma na-anọchi anya iberibe (modul) dị ka àgwà. (Ụkpụrụ achịcha abụghị ihe achọrọ maka usoro nhazi a na-achịkọta. Ọ bụ naanị otu mmejuputa echiche nke nwere ike ime.)

Enwere ike ịnọchite anya ndabere site na iji ụkpụrụ achicha dị ka njedebe nke ọnụ ndị ọzọ:

  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)
  }

Ọrụ Echo chọrọ naanị ahaziri ọdụ ụgbọ mmiri. Anyị na-ekwupụtakwa na ọdụ ụgbọ mmiri a na-akwado protocol echo. Mara na anyị achọghị ịkọwapụta otu ọdụ ụgbọ mmiri n'oge a, n'ihi na njirimara na-enye ohere ikwupụta usoro abstract. Ọ bụrụ na anyị na-eji ụzọ abstract, onye nchịkọta ga-achọ mmejuputa ya na nhazi nhazi. Ebe a anyị enyela mmejuputa iwu (8081) na a ga-eji ya dị ka uru ndabara ma ọ bụrụ na anyị wụpụ ya na nhazi nhazi.

Anyị nwere ike ikwuwapụta ndabere na nhazi nke onye ahịa ọrụ echo:

  trait EchoClientConfig[A] {
    def testMessage: String = "test"
    def pollInterval: FiniteDuration
    def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
  }

Ndabere nwere otu ụdị dị ka nke echoService. Karịsịa, ọ chọrọ otu protocol. N'ihi ya, anyị nwere ike ijide n'aka na ọ bụrụ na anyị jikọọ abụọ a dabere na ha ga-arụ ọrụ nke ọma.

Mmejuputa ọrụ

Ọrụ chọrọ ọrụ iji bido na mechie ya nke ọma. (Ikike imechi ọrụ dị oke mkpa maka nnwale.) Ọzọ enwere nhọrọ ole na ole nke ịkọwapụta ọrụ dị otú ahụ maka nhazi enyere (dịka ọmụmaatụ, anyị nwere ike iji ụdị klas). Maka ọkwa a, anyị ga-eji usoro achicha ọzọ. Anyị nwere ike ịnọchite anya ọrụ site na iji cats.Resource nke na-enyelarị bracketing na mwepụta akụrụngwa. Iji nweta akụrụngwa, anyị kwesịrị ịnye nhazi yana ụfọdụ okirikiri oge. Yabụ na ọrụ mmalite ọrụ nwere ike ịdị ka:

  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]
  }

ebe

  • Config - ụdị nhazi nke onye mbido ọrụ a chọrọ
  • AddressResolver - ihe na-agba ọsọ nke nwere ike ịnweta ezigbo adreesị nke ọnụ ndị ọzọ (na-agụ maka nkọwa).

ụdị ndị ọzọ si cats:

  • F[_] - ụdị mmetụta (N'okwu kachasị mfe F[A] nwere ike ịbụ naanị () => A. Na post a anyị ga-eji cats.IO.)
  • Reader[A,B] — bụ ihe karịrị ma ọ bụ obere a synonym maka ọrụ A => B
  • cats.Resource - nwere ụzọ iji nweta na ntọhapụ
  • Timer - na-enye ohere ihi ụra / tụọ oge
  • ContextShift - analog nke ExecutionContext
  • Applicative - ihe mkpuchi ọrụ dị na ya (ihe fọrọ nke nta ka ọ bụrụ monad) (anyị nwere ike jiri ihe ọzọ dochie ya)

Iji interface a anyị nwere ike mejuputa ọrụ ole na ole. Dịka ọmụmaatụ, ọrụ na-adịghị eme ihe ọ bụla:

  trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
    type Config <: Any
    def resource(...): ResourceReader[F, Config, Unit] =
      Reader(_ => Resource.pure[F, Unit](()))
  }

(Lee Isi koodu maka mmejuputa ọrụ ndị ọzọ - ọrụ mgbakwasa,
nkwughachi ahịa na ndị na-achịkwa ndụ oge niile.)

Otu ọnụ bụ otu ihe na-arụ ọrụ ole na ole (malite usoro akụrụngwa na-akwado site na usoro achicha):

object SingleNodeImpl extends ZeroServiceImpl[IO]
  with EchoServiceService
  with EchoClientService
  with FiniteDurationLifecycleServiceImpl
{
  type Config = EchoConfig[String] with EchoClientConfig[String] with FiniteDurationLifecycleConfig
}

Rịba ama na n'ime ọnụ anyị na-akọwapụta kpọmkwem ụdị nhazi nke dị mkpa site na ọnụ a. Ndị nchịkọta agaghị ekwe ka anyị wuo ihe (Cake) na ụdị ezughi oke, n'ihi na njirimara ọrụ ọ bụla na-ekwupụta mmachi na Config ụdị. Ọzọkwa anyị agaghị enwe ike ịmalite ọnụ na-enyeghị nhazi zuru oke.

Mkpebi adreesị ọnụ

Iji guzobe njikọ anyị chọrọ ezigbo adreesị nnabata maka ọnụ ọ bụla. Enwere ike mara ya ma emechaa karịa akụkụ ndị ọzọ nke nhazi ahụ. N'ihi ya, anyị chọrọ ụzọ iji weta maapụ n'etiti id node na adreesị ya n'ezie. Maapụ a bụ ọrụ:

case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
  def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}

Enwere ụzọ ole na ole enwere ike iji mejuputa ọrụ dị otú ahụ.

  1. Ọ bụrụ na anyị maara adreesị n'ezie tupu ebuga ya, n'oge nnabata ọnụ ọnụ, mgbe ahụ, anyị nwere ike ịmepụta koodu Scala na adreesị ndị ahụ ma rụọ ọrụ ahụ ma emesịa (nke na-eme nyocha oge wee na-agba ọsọ ule ntinye akwụkwọ). N'okwu a, a maara ọrụ nkewa anyị nke ọma na enwere ike ime ka ọ dị mfe n'ihe dịka a Map[NodeId, NodeAddress].
  2. Mgbe ụfọdụ, anyị na-enweta adreesị n'ezie naanị n'oge na-esote mgbe ọnụ ụzọ malitere n'ezie, ma ọ bụ na anyị enweghị adreesị ọnụ na-amalitebeghị. N'okwu a, anyị nwere ike ịnwe ọrụ nchọpụta malitere tupu ọnụ ụzọ ndị ọzọ na ọnụ ọ bụla nwere ike kpọsaa adreesị ya na ọrụ ahụ wee denye aha na ndabere.
  3. Ọ bụrụ na anyị nwere ike gbanwee /etc/hosts, anyị nwere ike iji aha ndị ọbịa eburu ụzọ kọwaa (dịka my-project-main-node na echo-backend) na naanị jikọọ aha a na adreesị IP n'oge ntinye.

Na post a anyị anaghị ekpuchi ikpe ndị a na nkọwa ndị ọzọ. N'ezie na ihe atụ egwuregwu ụmụaka anyị niile ọnụ ga-enwe otu adreesị IP - 127.0.0.1.

Na post a, anyị ga-atụle usoro nhazi usoro kesara abụọ:

  1. Nhazi otu ọnụ ọnụ, ebe etinyere ọrụ niile n'otu ọnụ ọnụ.
  2. Nhazi ọnụ ụzọ abụọ, ebe ọrụ na onye ahịa nọ na ọnụ ọnụ dị iche iche.

Nhazi maka a otu ọnụ ọnụ layout bụ dị ka ndị a:

Otu nhazi ọnụ ọnụ

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.
}

N'ebe a, anyị na-emepụta otu nhazi nke na-agbatị ma ihe nkesa na nhazi ndị ahịa. Anyị na-ahazikwa onye njikwa ndụ nke ga-akwụsịkarị ahịa na ihe nkesa ma emechaa lifetime etiti oge gafere.

Enwere ike iji otu nhazi nke mmejuputa ọrụ na nhazi iji mepụta nhazi usoro nwere ọnụ abụọ dị iche iche. Naanị anyị kwesịrị ịmepụta abụọ dị iche iche ọnụ configs ya na ọrụ kwesịrị ekwesị:

Nhazi ọnụ abụọ

  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"
  }

Hụ ka anyị si ezipụta ndabere. Anyị na-ekwu maka ọrụ ọnụ nke ọzọ enyere dị ka ndabere nke ọnụ dị ugbu a. A na-enyocha ụdị ịdabere na ya n'ihi na ọ nwere ụdị phantom na-akọwa protocol. Na n'oge ojiri gaa anyị ga-enwe id node ziri ezi. Nke a bụ otu n'ime akụkụ dị mkpa nke usoro nhazi a chọrọ. Ọ na-enye anyị ikike ịtọ ọdụ ụgbọ mmiri naanị otu ugboro ma hụ na anyị na-ekwu maka ọdụ ụgbọ mmiri ziri ezi.

Mmejuputa ọnụ ụzọ abụọ

Maka nhazi a anyị na-eji otu mmejuputa ọrụ ahụ kpọmkwem. Enweghị mgbanwe ọ bụla. Agbanyeghị, anyị na-emepụta mmejuputa ọnụ ụzọ abụọ dị iche iche nwere ọrụ dị iche iche:

  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
  }

Ọnụ ụzọ mbụ na-arụ ọrụ nkesa na ọ chọrọ naanị nhazi akụkụ nkesa. Ọnụ nke abụọ na-emejuputa onye ahịa ma chọọ akụkụ ọzọ nke nhazi. Ọnụ abụọ ahụ chọrọ nkọwapụta oge ndụ ụfọdụ. Maka ebumnuche nke ọnụ ọrụ nzipu ozi a ga-enwe ogologo ndụ enweghị ngwụcha nke enwere ike ịkwụsị iji SIGTERM, mgbe echo ahịa ga-akwụsị mgbe njedebe nke ahaziri. Lee ihe ngwa mmalite maka nkọwa.

Usoro mmepe n'ozuzu ya

Ka anyị hụ ka ụzọ a si agbanwe ka anyị si arụ ọrụ na nhazi.

A ga-achịkọta nhazi ahụ dị ka koodu ma mepụta arịa. Ọ dị ka ihe ezi uche dị na ya ikewapụta arịa nhazi na arịa koodu ndị ọzọ. Ọtụtụ mgbe anyị nwere ike ịnwe ọtụtụ nhazi n'otu ntọala koodu. Ma n'ezie, anyị nwere ike inwe otutu nsụgharị nke dị iche iche nhazi alaka. N'ime nhazi anyị nwere ike họrọ ụdị ọba akwụkwọ pụrụ iche na nke a ga-adịgide mgbe ọ bụla anyị na-ebuga nhazi a.

Mgbanwe nhazi na-aghọ mgbanwe koodu. Yabụ na ekwesịrị iji otu usoro mmesi obi ike kpuchie ya:

Tiketi -> PR -> nyochaa -> jikota -> ntinye aka na-aga n'ihu -> ntinye na-aga n'ihu

Enwere nsonaazụ ndị a sitere na usoro a:

  1. Nhazi ahụ jikọtara ọnụ maka ihe atụ nke otu sistemụ. Ọ dị ka ọ nweghị ụzọ isi nweta njikọ na-ezighi ezi n'etiti ọnụ ọnụ.
  2. Ọ dịghị mfe ịgbanwe nhazi naanị n'otu ọnụ ọnụ. Ọ dị ka enweghị ezi uche ịbanye na ịgbanwe ụfọdụ faịlụ ederede. Ya mere nhazigharị nhazi na-aghọ obere ike.
  3. Obere mgbanwe nhazi adịghị mfe ime.
  4. Ọtụtụ n'ime mgbanwe nhazi ahụ ga-agbaso otu usoro mmepe ahụ, ọ ga-agafe nyocha ụfọdụ.

Anyị chọrọ ebe nchekwa dị iche iche maka nhazi mmepụta? Nhazi mmepụta ahụ nwere ike ịnwe ozi dị nro nke anyị ga-achọ ka ọtụtụ mmadụ ghara iru ya. Yabụ na ọ bara uru idobe ebe nchekwa dị iche yana ohere amachibidoro nke ga-enwe nhazi nrụpụta. Anyị nwere ike kewaa nhazi ahụ n'ime akụkụ abụọ - nke nwere parampat kachasị emeghe nke mmepụta na nke nwere akụkụ nzuzo nke nhazi. Nke a ga-enyere ohere ịnweta ọtụtụ n'ime ndị mmepe ohere ka ukwuu nke paramita ebe na-egbochi ohere ịnweta ihe ndị nwere mmetụta dị nro. Ọ dị mfe imezu nke a site na iji njirimara etiti nwere ụkpụrụ paramita ndabara.

ọdịiche

Ka anyị hụ uru na ọghọm nke usoro a chọrọ ma e jiri ya tụnyere usoro nhazi nhazi ndị ọzọ.

Nke mbụ, anyị ga-edepụta ụzọ ole na ole maka akụkụ dị iche iche nke ụzọ a chọrọ isi na-emeso nhazi:

  1. Faịlụ ederede na igwe ebumnuche.
  2. Nchekwa igodo-uru emebere (dịka etcd/zookeeper).
  3. Akụkụ ndị dị n'okpuru nke enwere ike ịhazigharị/malitegharịa na-enweghị ịmalitegharị usoro.
  4. Nhazi n'èzí artifact na njikwa ụdị.

Faịlụ ederede na-enye ụfọdụ mgbanwe n'ihe gbasara ndozi ad-hoc. Onye nchịkwa sistemu nwere ike ịbanye na oghere ebumnuche, mee mgbanwe wee malitegharịa ọrụ ahụ naanị. Nke a nwere ike ọ gaghị adị mma maka sistemụ buru ibu. Ọnweghị ihe ọ bụla fọdụrụ n'azụ mgbanwe ahụ. A naghị enyocha mgbanwe ahụ site na anya abụọ ọzọ. O nwere ike isiri gị ike ịchọpụta ihe kpatara mgbanwe ahụ. A nwalebeghị ya. Site n'echiche nkesa nkesa, onye nchịkwa nwere ike ichefu imelite nhazi ahụ n'otu akụkụ ndị ọzọ.

(Btw, ọ bụrụ n'ikpeazụ ọ ga-adị mkpa ịmalite iji faịlụ nhazi ederede, naanị anyị ga-agbakwunye parser + validator nke nwere ike ịmepụta otu ihe ahụ. Config pịnye na nke ahụ ga-ezuru ịmalite iji nhazi ederede. Nke a na-egosikwa na mgbagwoju anya nke nhazi oge nchịkọta dị ntakịrị ntakịrị na mgbagwoju anya nke nhazi ederede, n'ihi na na ụdị ederede anyị chọrọ ụfọdụ koodu ndị ọzọ.)

Nchekwa igodo-ọnụ ahịa etiti bụ ezigbo usoro maka ikesa paramita meta ngwa. N'ebe a, anyị kwesịrị iche echiche banyere ihe anyị na-ewere dị ka ụkpụrụ nhazi na ihe bụ naanị data. Enyere ọrụ C => A => B anyị na-akpọkarị ụkpụrụ na-agbanwe agbanwe C "nhazi", ebe a na-agbanwe data ugboro ugboro A - naanị tinye data. Ekwesịrị ịnye nhazi maka ọrụ ahụ tupu data ahụ A. N'iburu echiche a, anyị nwere ike ịsị na a na-atụ anya mgbanwe mgbanwe nke enwere ike ịmata ọdịiche data nhazi na naanị data. Ọzọkwa data na-esi n'otu ebe (onye ọrụ) na nhazi na-esite na isi mmalite dị iche (admin). Ịnagide paramita nke nwere ike ịgbanwe mgbe usoro mmalite na-eduga n'ịbawanye mgbagwoju anya ngwa. Maka paramita ndị dị otú ahụ, anyị ga-ejikwa usoro nnyefe ha, nyocha na nkwenye, ijikwa ụkpụrụ ezighi ezi. N'ihi ya, iji belata mgbagwoju anya mmemme, anyị ga-aka mma ibelata ọnụ ọgụgụ nke parampat nwere ike ịgbanwe n'oge ọsọ (ma ọ bụ ọbụna kpochapụ ha kpamkpam).

Site n'echiche nke post a, anyị kwesịrị ime ọdịiche dị n'etiti paramita static na ike. Ọ bụrụ na mgbagha ọrụ chọrọ mgbanwe na-adịghị ahụkebe nke ụfọdụ parampat n'oge ojiri, mgbe ahụ anyị nwere ike ịkpọ ha paramita dị ike. Ma ọ bụghị ya, ha kwụ ọtọ na enwere ike ịhazi ya site na iji usoro a chọrọ. Maka nhazigharị dị ike nwere ike ịchọ ụzọ ndị ọzọ. Dịka ọmụmaatụ, enwere ike ịmalitegharị akụkụ nke sistemu ahụ site na usoro nhazi ọhụrụ n'otu ụzọ ahụ iji malitegharịa usoro dị iche iche nke sistemụ kesara.
(Echiche m dị umeala n'obi bụ iji zere nhazigharị oge n'ihi na ọ na-abawanye mgbagwoju anya nke usoro ahụ.
Ọ nwere ike ịdị mfe karịa ịdabere naanị na nkwado OS nke usoro ịmalitegharị. Agbanyeghị, ọ nwere ike ọ gaghị ekwe omume mgbe niile.)

Otu akụkụ dị mkpa nke iji nhazi nhazi nke oge ụfọdụ na-eme ka ndị mmadụ tụlee nhazi dị ike (na-enweghị ihe ndị ọzọ) bụ oge nkwụsị ọrụ n'oge nhazi nhazi. N'ezie, ọ bụrụ na anyị ga-eme mgbanwe na nhazi nhazi, anyị ga-amalitegharị usoro ahụ ka ụkpụrụ ọhụrụ wee dị irè. Ihe ndị a chọrọ maka oge nkwụsịtụ dị iche iche maka usoro dị iche iche, n'ihi ya, ọ nwere ike ọ gaghị adị oke egwu. Ọ bụrụ na ọ dị mkpa, mgbe ahụ, anyị ga-eme atụmatụ n'ihu maka usoro ọ bụla malitegharịa. Dịka ọmụmaatụ, anyị nwere ike mejuputa Njikọ AWS ELB na-agbaze. N'ọnọdụ a mgbe ọ bụla anyị chọrọ ịmalitegharị sistemụ ahụ, anyị na-amalite usoro usoro ọhụrụ n'otu oge, wee gbanwee ELB na ya, ka anyị na-ahapụ sistemụ ochie ka ọ rụchaa ọrụ njikọ dị adị.

Kedu maka idowe nhazi n'ime artifact mbipute ma ọ bụ n'èzí? Idobe nhazi n'ime ihe arịa pụtara n'ọtụtụ ọnọdụ na nhazi a agafeela otu usoro mmesi obi ike dị ka ihe ndị ọzọ. Ya mere, onye nwere ike ijide n'aka na nhazi ahụ dị mma na ntụkwasị obi. N'ụzọ megidere nhazi na faịlụ dị iche pụtara na ọ nweghị akara onye na ihe kpatara mgbanwe na faịlụ ahụ. Nke a ọ dị mkpa? Anyị kwenyere na maka ọtụtụ sistemụ mmepụta ọ ka mma ịnwe nhazi kwụsiri ike ma dị elu.

Version nke artifact na-enye ohere ịchọpụta mgbe e kere ya, ụkpụrụ dị na ya, kedu ihe enyere / nkwarụ, onye na-ahụ maka ime mgbanwe ọ bụla na nhazi ahụ. Ọ nwere ike ịchọ mgbalị ụfọdụ iji dobe nhazi n'ime ihe arịa na ọ bụ nhọrọ imewe.

Uru & ọghọm

N'ebe a, anyị ga-achọ ịkọwapụta uru ụfọdụ yana ikwurịta ụfọdụ adịghị ike nke usoro a chọrọ.

uru

Akụkụ nke nhazi mkpokọta nke sistemu ekesa zuru oke:

  1. Nleba anya nke nhazi. Nke a na-enye obi ike dị elu, na nhazi ahụ ziri ezi nyere ihe mgbochi ụdị.
  2. Asụsụ nhazi bara ụba. Dịka usoro nhazi ndị ọzọ na-ejedebere na ngbanwe mgbanwe.
    Iji Scala onye nwere ike iji ọtụtụ njirimara asụsụ mee ka nhazi dị mma. Dịka ọmụmaatụ, anyị nwere ike iji àgwà wepụta ụkpụrụ ndabara, ihe iji tọọ obosara dị iche iche, anyị nwere ike na-ezo aka vals akọwara naanị otu ugboro na mpụga obosara (DRY). Ọ ga-ekwe omume iji usoro nkịtị, ma ọ bụ ihe atụ nke klaasị ụfọdụ (Seq, Map, Wdg).
  3. DSL. Scala nwere ezigbo nkwado maka ndị edemede DSL. Otu nwere ike iji atụmatụ ndị a iji guzobe asụsụ nhazi nke dị mma na njedebe njedebe, nke mere na nhazi ikpeazụ bụ ma ọ dịkarịa ala ndị ọrụ ngalaba nwere ike ịgụ ya.
  4. Iguzosi ike n'ezi ihe na ịdị n'otu n'ofe ọnụ. Otu n'ime uru dị n'inwe nhazi maka sistemụ kesara dum n'otu ebe bụ na a na-akọwa ụkpụrụ niile otu ugboro wee jiri ya mee ihe n'ebe niile ebe anyị chọrọ ha. Tinyekwa nkwupụta ọdụ ụgbọ mmiri dị mma hụ na na nhazi niile enwere ike, ọnụ sistemu ahụ ga-asụ otu asụsụ. Enwere ndabere doro anya n'etiti ọnụ nke na-eme ka ọ sie ike ichefu ịnye ụfọdụ ọrụ.
  5. Ụdị mgbanwe dị elu. N'ozuzu obibia nke ịgafe nhazi mgbanwe site na nkịtị PR usoro guzobe elu ụkpụrụ nke àgwà nakwa na nhazi.
  6. Mgbanwe nhazi oge. Mgbe ọ bụla anyị na-eme mgbanwe ọ bụla na nhazi nhazi akpaaka na-eme ka a hụ na a na-emelite ọnụ ọnụ niile.
  7. Ngwa dị mfe. Ngwa ahụ achọghị ịtụgharị ma kwado nhazi yana jikwaa ụkpụrụ nhazi ezighi ezi. Nke a na-eme ka ngwa ngwa dị mfe. (Ụfọdụ mgbagwoju anya abawanye bụ na nhazi n'onwe ya, ma ọ bụ a maara ahia-apụ kwupụta nchekwa.) Ọ mara mma n'ụzọ kwụ ọtọ ịlaghachi na nkịtị nhazi - dị nnọọ tinye efu iberibe. Ọ dị mfe ịmalite site na nhazi achịkọtara ma yigharịa mmejuputa ibe n'ibe ndị ọzọ ruo oge ụfọdụ.
  8. Nhazi ụdịdị. N'ihi n'eziokwu na mgbanwe nhazi na-agbaso otu usoro mmepe ahụ, n'ihi ya, anyị na-enweta artifact nwere ụdị pụrụ iche. Ọ na-enye anyị ohere ịgbanwe nhazi azụ ma ọ bụrụ na ọ dị mkpa. Anyị nwere ike itinye nhazi nke ejiri otu afọ gara aga ma ọ ga-arụ ọrụ kpọmkwem n'otu ụzọ ahụ. Nhazi kwụsiri ike na-eme ka amụma amụma na ntụkwasị obi nke sistemụ kesara. A na-edozi nhazi ahụ n'oge a na-achịkọta ma enweghi ike ịmebi ya ngwa ngwa na usoro mmepụta ihe.
  9. Modularity. Usoro a na-atụ aro bụ modular yana modul nwere ike jikọta ya n'ụzọ dị iche iche
    na-akwado nhazi dị iche iche (nhazi / nhazi). Karịsịa, ọ ga-ekwe omume ịnwe nhazi ọnụ ọnụ dị nta na otu nnukwu ọnụ ọgụgụ ọtụtụ ntọala ọnụ. Ọ bụ ihe ezi uche dị na ya inwe ọtụtụ nhazi nhazi.
  10. Nnwale. Maka ebumnuche nnwale mmadụ nwere ike mejuputa ọrụ njakịrị ma jiri ya dịka ndabere n'ụdị ụzọ nchekwa. Enwere ike idowe okirikiri ule ole na ole dị iche iche nwere akụkụ dị iche iche ejiri njakịrị dochie anya n'otu oge.
  11. Nnwale njikọta. Mgbe ụfọdụ n'ime sistemu ekesa, ọ na-esiri ike ịme ule nnabata. N'iji usoro akọwapụtara iji pịnye nhazi nchekwa nke usoro nkesa zuru oke, anyị nwere ike ịmegharị akụkụ niile kesara na otu ihe nkesa n'ụzọ a na-achịkwa. Ọ dị mfe iṅomi ọnọdụ ahụ
    mgbe otu n'ime ọrụ agaghị adị.

ọghọm

Usoro nhazi achịkọtara dị iche na nhazi "nkịtị" ma ọ nwere ike ọ gaghị adabara mkpa niile. Nke a bụ ụfọdụ ọghọm dị na nhazi a chịkọtara:

  1. Nhazi static. O nwere ike ọ gaghị adabara maka ngwa niile. N'ọnọdụ ụfọdụ ọ dị mkpa iji dozie nhazi ngwa ngwa na mmepụta na-agafe usoro nchekwa niile. Ụzọ a na-eme ka ọ sie ike karị. A na-achọ nchịkọta na ntinyeghachi mgbe emechara mgbanwe ọ bụla na nhazi. Nke a bụ ma njirimara na ibu arọ.
  2. Ọgbọ nhazi. Mgbe emepụtara config site na ụfọdụ ngwa ọrụ akpaaka usoro a chọrọ nchịkọta na-esote (nke nwere ike ịdaba). Ọ nwere ike ịchọ mgbalị ọzọ iji tinye nzọụkwụ a n'ime usoro ihe owuwu.
  3. Ngwa ngwa. Enwere ọtụtụ ngwa eji eme ihe taa na-adabere na nhazi ederede. Ụfọdụ n'ime ha
    agaghị adị mgbe achịkọtara nhazi.
  4. Ngbanwe n'uche dị mkpa. Ndị mmepe na DevOps maara faịlụ nhazi ederede. Echiche nke ịchịkọta nhazi nwere ike iyi ihe ijuanya nye ha.
  5. Tupu iwebata nhazi mkpokọta, achọrọ usoro mmepe ngwanrọ dị elu.

Enwere ụfọdụ mmachi nke ọmụmaatụ etinyere:

  1. Ọ bụrụ na anyị weta nhazi ọzọ nke mmejuputa node na-achọghị, onye nchịkọta agaghị enyere anyị aka ịchọpụta mmejuputa a na-adịghị. Enwere ike idozi nke a site na iji HList ma ọ bụ ADT (klaasị ikpe) maka nhazi ọnụ kama njiri mara na ụkpụrụ achicha.
  2. Anyị ga-enye ụfọdụ efere efere na config faịlụ: (package, import, object nkwupụta;
    override def's maka parameters ndị nwere ụkpụrụ ndabara). Enwere ike dozie nke a site na iji DSL.
  3. Na nke a post anyị anaghị ekpuchi ike reconfiguration nke ụyọkọ nke yiri ọnụ.

mmechi

Na nke a post, anyị atụlewo echiche nke na-anọchi anya nhazi ozugbo na koodu iyi n'ụdị dị nchebe. Enwere ike iji usoro a n'ọtụtụ ngwa dị ka nnọchi nke xml- na nhazi ederede ndị ọzọ. N'agbanyeghị na etinyere ihe atụ anyị na Scala, enwere ike ịtụgharị ya na asụsụ ndị ọzọ achịkọtara (dịka Kotlin, C #, Swift, wdg). Mmadụ nwere ike ịnwale ụzọ a n'ọrụ ọhụrụ, ma ọ bụrụ na ọ dabara nke ọma, gbanwee gaa n'ụzọ ochie.

N'ezie, nhazi mkpokọta chọrọ usoro mmepe dị elu. Na nloghachi ọ na-ekwe nkwa inye nhazi nhazi siri ike dị oke mma nha anya.

Enwere ike ịgbatị usoro a n'ụzọ dị iche iche:

  1. Mmadụ nwere ike iji macros rụọ nkwado nhazi wee daa n'oge achịkọta ma ọ bụrụ na ọ bụrụ na ọ bụla mmachibido azụmahịa-ọchịchọ ọdịda.
  2. Enwere ike itinye DSL iji nọchite anya nhazi n'ụzọ enyi-enyi na ngalaba.
  3. Njikwa akụrụngwa dị ike yana nhazi nhazi akpaaka. Dị ka ọmụmaatụ, mgbe anyị na-agbanwe ọnụ ọgụgụ nke ụyọkọ ọnụ anyị nwere ike ịchọ (1) ọnụ ọnụ iji nweta ntakịrị gbanwetụrụ nhazi; (2) onye njikwa ụyọkọ iji nweta ozi ọnụ ọhụrụ.

ekele

Ọ ga-amasị m ịkele Andrey Saksonov, Pavel Popov, Anton Nehaev maka inye nzaghachi mkpali na ederede nke post a nke nyeere m aka ime ka ọ dokwuo anya.

isi: www.habr.com