Compilable gadziriso yeakagoverwa system

Mune ino post tinoda kugovera inonakidza nzira yekubata nekumisikidzwa kweiyo yakagoverwa system.
Iyo gadziriso inomiririrwa zvakananga mumutauro weScala nenzira yakachengeteka. Muenzaniso wekushandiswa unotsanangurwa zvakadzama. Zvikamu zvakasiyana-siyana zvechikumbiro zvinokurukurwa, kusanganisira pesvedzero pamaitiro ese ebudiriro.

Compilable gadziriso yeakagoverwa system

(muchiRussia)

ziviso

Kuvaka masisitimu akasimba akagovaniswa kunoda kushandiswa kwakaringana uye kwakabatana gadziriso pane ese node. Mhinduro yakajairika ndeye kushandisa tsananguro yekutumira mameseji (terraform, inobatika kana chimwe chinhu chakafanana) uye inogadzirwa otomatiki mafaera ekugadzirisa (kazhinji - yakatsaurirwa imwe neimwe node / basa). Isu taizodawo kushandisa maprotocol akafanana eshanduro dzakafanana pane imwe neimwe yekutaurirana node (zvikasadaro taizosangana nenyaya dzekusapindirana). Munyika yeJVM izvi zvinoreva kuti raibhurari yekutumira mameseji inofanirwa kunge iri yevhezheni imwe chete pane ese ekutaurirana.

Zvakadini nekuyedza system? Ehe, isu tinofanirwa kuve neyuniti bvunzo dzezvinhu zvese tisati tauya kumayedzo ekubatanidza. Kuti tikwanise kuwedzera mhinduro dzebvunzo panguva yekumhanya, isu tinofanirwa kuve nechokwadi chekuti mavhezheni emaraibhurari ese anochengetwa akafanana munguva yekumhanya uye yekuyedza nharaunda.

Paunenge uchimhanyisa bvunzo dzekubatanidza, kazhinji zviri nyore kuve neclasspath yakafanana pamanode ese. Isu tinongoda kuve nechokwadi chekuti iyo imwecheteyo classpath inoshandiswa pakutumirwa. (Zvinogoneka kushandisa nzira dzekirasi dzakasiyana pamanodhi akasiyana, asi zvakanyanya kuoma kumiririra iyi gadziriso uye nekuishandisa nemazvo.) Saka kuitira kuti zvinhu zvirambe zviri nyore tichangofunga nzira dzekirasi dzakafanana pamanodhi ese.

Kugadzirisa kunowanzo shanduka pamwe chete nesoftware. Isu tinowanzo shandisa shanduro kuziva dzakasiyana
matanho ekushanduka kwesoftware. Zvinoita sezvine musoro kuvhara gadziriso pasi peshanduro manejimendi uye kuona magadzirirwo akasiyana nemamwe mavara. Kana paine gadziriso imwe chete mukugadzira, tinogona kushandisa shanduro imwechete sechiratidzo. Dzimwe nguva tinogona kunge tine akawanda ekugadzira nharaunda. Uye kune yega yega nharaunda isu tingada rakasiyana bazi rekugadzirisa. Saka zvigadziriso zvinogona kunyorwa nebazi uye vhezheni kuratidza zvakasiyana masimisheni. Imwe neimwe bazi rezita uye vhezheni inoenderana nemusanganiswa mumwechete weakagoverwa node, zviteshi, zvekunze zviwanikwa, classpath raibhurari shanduro pane imwe neimwe node. Pano tichangovhara bazi rimwechete uye toona zvigadziriso nezvikamu zvitatu zvedecimal version (1.2.3), nenzira imwechete sezvimwe zvinhu zvekare.

Munzvimbo dzemazuva ano mafaera ekugadzirisa haagadziriswe nemaoko zvakare. Kazhinji tinogadzira
config mafaira panguva yekuendesa uye usambozvibata pashure. Saka munhu anogona kubvunza kuti nei tichiri kushandisa mameseji fomati yekugadzirisa mafaera? Sarudzo inogoneka ndeyekuisa iyo yekumisikidza mukati mekubatanidza unit uye kubatsirwa kubva mukuunganidza-nguva yekumisikidza kusimbiswa.

Mune ino positi isu tichaongorora iyo pfungwa yekuchengeta iyo gadziriso mune yakanyorwa artifact.

Compilable configuration

Muchikamu chino tichakurukura muenzaniso we static configuration. Masevhisi maviri akareruka - echo sevhisi uye mutengi weiyo echo sevhisi ari kugadzirwa uye kuitwa. Ipapo maviri akasiyana akagoverwa masisitimu ane ese masevhisi anosimbiswa. Imwe ndeyekugadziriswa kwenode imwe uye imwe kune mbiri node kumisikidzwa.

Iyo yakajairika yakagovaniswa sisitimu ine mashoma mashoma. Manodhi anogona kuzivikanwa uchishandisa imwe mhando:

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

kana zvakarurama

case class NodeId(hostName: String)

kana kunyange

object Singleton
type NodeId = Singleton.type

Aya ma node anoita mabasa akasiyana siyana, anomhanyisa mamwe masevhisi uye anofanirwa kutaurirana nemamwe ma node kuburikidza neTCP/HTTP.

Kune TCP yekubatanidza inodiwa nhamba yechiteshi. Isu tinoda zvakare kuve nechokwadi chekuti mutengi uye server vari kutaura zvakafanana protocol. Kuti tienzanisire kubatana pakati pemanodhi ngatizivise kirasi inotevera:

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

apo Port ingori Int mukati mechikamu chinotenderwa:

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

Mhando dzakanatswa

ona yakanatswa library. Muchidimbu, inobvumira kuwedzera kuunganidza zvipingamupinyi zvenguva kune mamwe marudzi. Panyaya iyi Int inongotenderwa kuve ne16-bit values ​​inogona kumiririra port nhamba. Hapana chinodiwa chekushandisa raibhurari iyi kune iyi yekumisikidza nzira. Zvinongoratidzika kuti zvinonyatsoenderana.

YeHTTP (REST) ​​tinogona zvakare kuda nzira yebasa:

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

Phantom type

Kuti tizive protocol panguva yekubatanidza isu tiri kushandisa iyo Scala chimiro chekuzivisa mhando nharo Protocol iyo isingashandiswe mukirasi. Ndizvo zvinonzi phantom type. Panguva yekumhanya hatiwanzo kuda muenzaniso weprotocol identifier, ndosaka tisingaichengete. Munguva yekubatanidza iyi phantom mhando inopa imwe mhando chengetedzo. Hatigone kudarika chiteshi neprotocol isiriyo.

Imwe yeanonyanya kushandiswa protocol ndeye REST API ine Json serialization:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

apo RequestMessage ndiyo mhando yemhando yemeseji iyo mutengi anogona kutumira kune server uye ResponseMessage ndiyo meseji yemhinduro kubva kuseva. Ehe, isu tinogona kugadzira dzimwe tsananguro dzeprotocol dzinotsanangura iyo protocol yekutaurirana neicho chaidiwa.

Nechinangwa cheichi post tichashandisa yakapfava vhezheni yeprotocol:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Mune ino protocol yekukumbira meseji inowedzerwa kune url uye mhinduro meseji inodzoserwa setambo chena.

Kugadziriswa kwesevhisi kunogona kutsanangurwa nezita rebasa, muunganidzwa wezviteshi uye zvimwe zvinotsamira. Pane nzira shoma dzinogoneka dzekumiririra zvese izvi zvinhu muScala (semuenzaniso, HList, algebraic data types). Nechinangwa cheichi positi isu tichashandisa Cake Pateni uye tinomiririra zvinosanganiswa zvidimbu (module) sehunhu. (Pateni yekeke haidiwi pamaitiro aya anobatanidzwa. Ingori nzira imwe chete inogona kuitwa yepfungwa.)

Kutsamira kunogona kumiririrwa uchishandisa Keke Patani semagumo emamwe node:

  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 sevhisi inongoda chiteshi chakagadziriswa. Uye isu tinozivisa kuti chiteshi ichi chinotsigira echo protocol. Ziva kuti isu hatifanire kutsanangura imwe chiteshi panguva ino, nekuti maitiro anobvumira abstract nzira kuzivisa. Kana tikashandisa abstract nzira, compiler inoda kuitiswa muchiitiko chekugadzirisa. Pano takapa kushandiswa (8081) uye ichashandiswa seyakasarudzika kukosha kana tikaisvetuka mukugadzirisa kongiri.

Tinogona kuzivisa kutsamira mukugadzirisa kweiyo echo sevhisi mutengi:

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

Dependency ine mhando yakafanana neye echoService. Kunyanya, inoda iyo protocol yakafanana. Nekudaro, tinogona kuve nechokwadi chekuti kana tikabatanidza aya maviri anotsamira anozoshanda nemazvo.

Kuitwa kwesevhisi

Sevhisi inoda basa kuti itange uye nekudzima zvine nyasha. (Kugona kudzima sevhisi kwakakosha pakuyedzwa.) Zvekare pane sarudzo shoma dzekutsanangura basa rakadaro kune rakapihwa config (somuenzaniso, tinogona kushandisa mhando makirasi). Kune iyi positi isu tichashandisa Keke Patani zvakare. Tinogona kumiririra sevhisi tichishandisa cats.Resource iyo inotopa bracketing uye kuburitswa kwezviwanikwa. Kuti tiwane sosi tinofanira kupa gadziriso uye imwe nguva yekumhanya mamiriro. Saka basa rekutanga sevhisi rinogona kutaridzika senge:

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

apo

  • Config - mhando yekumisikidza inodiwa neiyi sevhisi yekutanga
  • AddressResolver - chinhu chenguva yekumhanya chinokwanisa kuwana kero chaidzo dzedzimwe node (ramba uchiverenga kuti uwane rumwe ruzivo).

mamwe marudzi anobva cats:

  • F[_] - maitiro emhando (Mune iyo yakapusa kesi F[A] zvinogona kuva zvakarurama () => A. Mune ino post tichashandisa cats.IO.)
  • Reader[A,B] — rinenge richireva zvakafanana nezwi rekuita A => B
  • cats.Resource - ine nzira dzekuwana nekusunungura
  • Timer - inobvumira kurara / kuyera nguva
  • ContextShift -analog ye ExecutionContext
  • Applicative - kuputira kwemabasa mukuita (inenge monad) (tinogona kuzoitsiva nechimwe chinhu)

Tichishandisa iyi interface tinogona kuita mashoma masevhisi. Semuenzaniso, sevhisi isingaite chinhu:

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

(Ona Purogiramu yekupa kune mamwe masevhisi ekuita - echo service,
echo client uye lifetime controlers.)

Node chinhu chimwe chete chinomhanyisa masevhisi mashoma (kutanga ketani yezviwanikwa inogoneswa neKeke Patani):

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

Ziva kuti mune node tinotsanangura iyo chaiyo mhando yekumisikidzwa inodiwa neiyi node. Compiler haatibvumire kuvaka chinhu (Keke) nemhando isina kukwana, nekuti yega yega sevhisi hunhu hunozivisa chinomanikidza pane Config type. Zvakare isu hatizokwanisa kutanga node pasina kupa yakakwana kumisikidzwa.

Node kero kugadzirisa

Kuti tigadzirise chinongedzo tinoda kero chaiyo yekutambira kune imwe neimwe node. Inogona kuzozivikanwa gare gare kupfuura zvimwe zvikamu zvekugadzirisa. Nekudaro, isu tinoda nzira yekupa mepu pakati pe node id uye iyo kero chaiyo. Iyi mepu ibasa:

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

Pane nzira shoma dzinogona kuita basa rakadaro.

  1. Kana isu tichiziva kero chaidzo tisati tatumirwa, panguva yeanode host instantiation, saka tinogona kugadzira Scala kodhi nemakero chaiwo uye tomhanyisa kuvaka mushure (iyo inoita yekuunganidza nguva yekutarisa uye yobva yamhanyisa yekubatanidza bvunzo suite). Muchiitiko ichi basa redu rekugadzira mepu rinozivikanwa statically uye rinogona kurerutswa kuita senge a Map[NodeId, NodeAddress].
  2. Dzimwe nguva tinowana kero chaidzo pane imwe nguva inotevera apo node inenge yatangwa, kana kuti hatina kero dzenodhi dzisati dzatangwa. Muchiitiko ichi tinogona kuve nesevhisi yekuwana iyo inotangwa pamberi pemamwe manode uye imwe neimwe node inogona kushambadza kero yayo musevhisi iyoyo uye kunyorera kune vanovimba.
  3. Kana tikakwanisa kugadzirisa /etc/hosts, tinogona kushandisa akafanotsanangurwa mazita evaenzi (se my-project-main-node uye echo-backend) uye ingobatanidza zita iri ne ip kero panguva yekuendesa.

Mune ino post hatifukidze nyaya idzi mune zvimwe zvakawanda. Muchokwadi mumuenzaniso wedu wematoyi manode ese achave neiyo IP kero - 127.0.0.1.

Mune ino post tichatarisa maviri akagoverwa masisitimu marongero:

  1. Single node dhizaini, uko masevhisi ese anoiswa pane imwechete node.
  2. Maviri node dhizaini, uko sevhisi uye mutengi ari panzvimbo dzakasiyana.

Kugadziriswa kwe a imwe node marongerwo akaita seizvi:

Single node configuration

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

Pano isu tinogadzira imwe gadziriso iyo inowedzera ese ari maviri sevha uye mutengi kumisikidzwa. Zvakare isu tinogadzirisa lifecycle controller iyo inowanzo misa mutengi uye server mushure lifetime interval inopfuura.

Iyo imwechete seti yekushandiswa kwesevhisi uye zvigadziriso zvinogona kushandiswa kugadzira sisitimu marongero ane maviri akaparadzana node. Tinongoda kugadzira maviri akasiyana node configs nemasevhisi akakodzera:

Manode maviri configuration

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

Ona kuti tinotsanangura sei kutsamira. Isu tinotaura imwe node yakapihwa sevhisi sekutsamira kweiyo node iripo. Mhando yekutsamira inotariswa nekuti ine phantom mhando inotsanangura protocol. Uye panguva yekumhanya tichava neiyo node id chaiyo. Ichi ndicho chimwe chezvinhu zvakakosha zvemaitiro akarongwa ekugadzirisa. Inotipa kugona kuseta chiteshi kamwe chete uye kuita shuwa kuti tiri kunongedzera chiteshi chaicho.

Kuitwa nodes mbiri

Kune iyi gadziriso tinoshandisa zvakafanana masevhisi ekuita. Hapana shanduko zvachose. Nekudaro, isu tinogadzira maviri akasiyana node mashandisirwo ane akasiyana seti yemasevhisi:

  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
  }

Yekutanga node inoshandisa server uye inongoda server side config. Yechipiri node inoshandisa mutengi uye inoda chimwe chikamu che config. Manode ese ari maviri anoda humwe hupenyu hwehupenyu. Nezvinangwa zveiyi post service node ichave nekusingaperi hupenyu hunogona kugumiswa nekushandisa SIGTERM, nepo echo mutengi achizoguma mushure menguva yakatarwa inopera. Onai kutanga application nokuti mashoko.

Yese nzira yekuvandudza

Ngationei kuti nzira iyi inoshandura sei nzira yatinoshanda nayo nekugadzirisa.

Iyo gadziriso sekodhi ichaunganidzwa uye inogadzira artifact. Zvinoita sezvine musoro kuparadzanisa dhizaini yekumisikidza kubva kune mamwe makodhi artifacts. Kazhinji isu tinogona kuve neakawanda magadzirirwo pane imwecheteyo kodhi base. Uye zvechokwadi, isu tinogona kuve neakawanda mavhezheni emapazi akasiyana ekugadzirisa. Mukugadzirisa tinogona kusarudza mamwe mavhezheni emaraibhurari uye izvi zvinoramba zvakangogara pese patinotumira iyi gadziriso.

Shanduko yegadziriso inova shanduko yekodhi. Saka inofanirwa kufukidzwa neiyo yakafanana yemhando yekusimbisa maitiro:

Tikiti -> PR -> kudzokorora -> kubatanidza -> kuenderera mberi kubatanidzwa -> kuenderera mberi kutumirwa

Pane zvinotevera zvinokonzeresa nzira:

  1. Iyo yekumisikidza inobatana kune imwe system yemuenzaniso. Zvinoita sekuti hapana nzira yekuve nekubatana kwakashata pakati pemanodhi.
  2. Hazvisi nyore kushandura configuration mune imwe node. Zvinoita sezvisinganzwisisike kupinda uye kushandura mamwe mameseji mafaera. Saka kumisikidza drift inova shoma inogoneka.
  3. Diki configuration shanduko haisi nyore kuita.
  4. Mazhinji ekuchinja kwekugadzirisa anozotevera nzira imwechete yekuvandudza, uye ichapfuura kumwe kuongorora.

Isu tinoda nzvimbo yakaparadzana yekugadziriswa kwekugadzira? Magadzirirwo ekugadzira anogona kunge aine ruzivo rwakadzama rwatinoda kuti tisasvike kune vanhu vazhinji. Saka zvingave zvakakodzera kuchengeta yakaparadzana repository ine yakaganhurirwa kupinda iyo ichange iine gadziriro yekugadzira. Isu tinogona kupatsanura iyo gadziriso kuita zvikamu zviviri - imwe ine yakavhurika maparamita ekugadzira uye imwe ine chakavanzika chikamu chekugadzirisa. Izvi zvaizogonesa kuwana kune vazhinji vevagadziri kune yakawanda yakawanda paramita uku ichirambidza kupinda kune chaizvo zvinotemesa zvinhu. Zviri nyore kuita izvi uchishandisa epakati maitiro ane default parameter kukosha.

Kusiyana

Ngationei zvakanakira nezvayakaipira nzira yakarongwa tichienzaniswa nemamwe magadzirirwo ekugadzirisa maitiro.

Chekutanga pane zvese, isu tichanyora mashoma mashoma kune akasiyana maficha eiyo yakarongwa nzira yekugadzirisa nekugadzirisa:

  1. Runyoro faira pamushini wakanangana.
  2. Centralized kiyi-kukosha kuchengetedza (se etcd/zookeeper).
  3. Subprocess zvikamu zvinogona kugadziriswa / kutangwazve pasina kutangazve maitiro.
  4. Kugadzirisa kunze kwechigadzirwa uye shanduro yekutonga.

Runyoro faira inopa kumwe kuchinjika maererano nead-hoc inogadzirisa. A system's maneja anogona kupinda kune inotangwa node, chinja uye ingo tangazve sevhisi. Izvi zvinogona kunge zvisina kunaka kune makuru masisitimu. Hapana maronda anosiiwa kumashure kweshanduko. Shanduko haina kuongororwa neimwe peya yemaziso. Zvingave zvakaoma kuziva kuti chii chakonzera shanduko. Hazvina kuedzwa. Kubva pane yakagoverwa sisitimu maonero maneja anogona kungokanganwa kugadzirisa iyo gadziriso mune imwe yedzimwe node.

(Btw, kana pakupedzisira kuchave nekudikanwa kwekutanga kushandisa mavara ekugadzirisa mafaera, isu tichangowedzera parser + validator inogona kuburitsa zvakafanana. Config type uye izvo zvingave zvakakwana kuti utange kushandisa zvinyorwa configs. Izvi zvinoratidza zvakare kuti kuomarara kwekugadzirisa-nguva kudiki kudiki kune kuomarara kwemavara-based configs, nekuti mune zvinyorwa-based version tinoda imwe kodhi yekuwedzera.)

Centralized kiyi-kukosha kuchengetedza inzira yakanaka yekugovera application meta paramita. Pano isu tinofanirwa kufunga nezve izvo zvatinoona sezvimiro zvekugadzirisa uye chii chiri data chete. Kupiwa basa C => A => B tinowanzo kudana kashoma kuchinja tsika C "configuration", nepo ichiwanzochinjwa data A - kungoisa data chete. Kugadzirisa kunofanirwa kupihwa kune basa pamberi peiyo data A. Tichifunga iyi pfungwa tinogona kutaura kuti inotarisirwa kuwanda kweshanduko izvo zvingashandiswa kusiyanisa dhizaini yekumisikidza kubva ku data chete. Zvakare data rinowanzouya kubva kune imwe sosi (mushandisi) uye kumisikidzwa kunobva kune akasiyana sosi (admin). Kutarisana nemiganhu inogona kuchinjwa mushure mekutanga kwekutanga kunotungamirira kukuwedzera kwekuoma kwekushanda. Kune ma parameter akadaro tichafanirwa kubata maitiro avo ekutumira, kupatsanura uye kusimbisa, kubata zvisirizvo kukosha. Nekudaro, kuti tideredze kuomarara kwechirongwa, isu zvirinani tidzikise huwandu hwema paramita anogona kuchinja panguva yekumhanya (kana kutomboabvisa zvachose).

Kubva pamaonero eiyi positi isu tinofanirwa kuita mutsauko pakati pe static uye dynamic parameters. Kana sevhisi logic inoda shanduko isingawanzo yemamwe ma paramita panguva yekumhanya, saka tinogona kuadaidza ane simba paramita. Zvikasadaro ivo vane static uye vanogona kugadzirwa vachishandisa nzira yakarongwa. Pakugadzirisazve dynamic dzimwe nzira dzinogona kudiwa. Semuenzaniso, zvikamu zvehurongwa zvinogona kutangwa patsva neiyo mitsva yekumisikidza paramita nenzira yakafanana yekutangisazve akasiyana maitiro eyakagoverwa system.
(Maonero angu akazvininipisa ndeekudzivirira kumhanyisa nguva yekumisikidza nekuti inowedzera kuoma kwehurongwa.
Zvingave zvakanyanya kutwasanuka kungovimba neOS rutsigiro rwekutangazve maitiro. Zvisinei, zvingasave zvichibvira nguva dzose.)

Chimwe chinhu chakakosha chekushandisa static kumisikidza iyo dzimwe nguva inoita kuti vanhu vatarise dhizaini dhizaini (pasina zvimwe zvikonzero) ibasa rekudzikira panguva yekugadziriswa kwekugadzirisa. Chokwadi, kana isu tichifanira kuita shanduko kune static kumisikidza, isu tinofanirwa kutangazve sisitimu kuitira kuti mitsva mitsva ishande. Izvo zvinodikanwa zvekudzikisa nguva zvinosiyana kune akasiyana masisitimu, saka zvinogona kunge zvisiri izvo zvakakosha. Kana zvakakosha, saka isu tinofanirwa kuronga kumberi kune chero system inotangazve. Somuenzaniso, tinogona kushandisa AWS ELB yekubatanidza inodhonza. Muchiitiko ichi pese patinenge tichida kudzoreredza sisitimu, tinotanga chiitiko chitsva cheiyo sisitimu yakafanana, tobva tachinja ELB kwairi, tichirega iyo yekare system kupedzisa kusevhisi iripo.

Zvakadini nekuchengeta configuration mukati shanduro artifact kana kunze? Kuchengeta gadziriso mukati meiyo artifact kunoreva mune mazhinji ezviitiko kuti iyi gadziriso yakapfuura imwechete yemhando yekusimbisa maitiro semamwe maartifact. Saka mumwe anogona kuve nechokwadi chekuti gadziriso ndeyemhando yakanaka uye yakavimbika. Pane zvinopesana nekugadziriswa mune imwe faira kunoreva kuti hapana maratidziro ekuti ndiani uye nei akaita shanduko kune iyo faira. Izvi zvakakosha here? Isu tinotenda kuti kune akawanda ekugadzira masisitimu zviri nani kuve yakagadzikana uye yemhando yepamusoro dhizaini.

Shanduro yeiyo artifact inobvumira kuziva payakagadzirwa, ndeapi makoshero airi, ndeapi maficha anogoneswa / akaremara, ndiani aive nebasa rekuita shanduko yega yega mukugadzirisa. Zvinogona kuda kuedza kuchengetedza gadziriso mukati meiyo artifact uye isarudzo yekugadzira kuita.

Zvakanakira & zvakaipa

Pano tinoda kuburitsa zvimwe zvakanakira uye kukurukura zvimwe zvakaipira nzira yakarongwa.

Advantages

Zvimiro zvekugadziriswa kwekugadziriswa kweiyo yakazara yakagoverwa system:

  1. Static cheki yekugadzirisa. Izvi zvinopa yakakwira mwero wekuvimba, kuti iyo yekumisikidza ndiyo yakapihwa mhando zvipingaidzo.
  2. Mutauro wakapfuma wekugadzirisa. Kazhinji dzimwe nzira dzekugadzirisa dzinongogumira pakutsiva kwakasiyana.
    Kushandisa Scala munhu anogona kushandisa huwandu hwakasiyana hwemitauro kuita kuti kurongeka kuve nani. Semuyenzaniso, isu tinogona kushandisa hunhu kupa default tsika, zvinhu kumisikidza chiyero chakasiyana, chatinogona kureva vals inotsanangurwa kamwe chete muchikamu chekunze (DRY). Zvinogoneka kushandisa kutevedzana chaiko, kana zviitiko zvemamwe makirasi (Seq, Map, nezvimwewo).
  3. DSL. Scala ine rutsigiro rwakanaka kune vanyori veDSL. Mumwe anogona kushandisa aya maficha kumisikidza mutauro wekugadzirisa uri nyore uye wekupedzisira-mushandisi ane hushamwari, kuitira kuti iyo yekupedzisira gadziriso igone kuverengeka nevashandisi vedomasi.
  4. Kutendeseka uye kubatana kumativi ose. Imwe yemabhenefiti ekuve nekugadziriswa kweiyo yese yakagoverwa sisitimu munzvimbo imwechete ndeyekuti hunhu hwese hunotsanangurwa kamwechete uye hwozoshandiswazve munzvimbo dzese dzatinoda. Nyorawo zvakachengetedzeka port declarations iva nechokwadi chekuti mune zvese zvinogoneka zvigadziriso masystem's node anotaura mutauro wakafanana. Pane zvakajeka kutsamira pakati pemanodhi izvo zvinoita kuti zviome kukanganwa kupa mamwe masevhisi.
  5. Hunhu hwepamusoro hwekuchinja. Iyo yese nzira yekupfuura gadziriso shanduko kuburikidza neyakajairwa PR maitiro inogadza yakakwira mwero wemhando zvakare mukumisikidzwa.
  6. Kuchinja kwekugadzirisa panguva imwe chete. Chero isu patinoita chero shanduko mukugadzirisa otomatiki deployment inova nechokwadi chekuti node dzese dziri kuvandudzwa.
  7. Kurerutsa application. Chishandiso hachidi kupatsanura uye kusimbisa gadziriso uye kubata zvisirizvo zvimiro zvemaitiro. Izvi zvinorerutsa kushandiswa kwese. (Kumwe kuomarara kwekuwedzera kuri mugadziriro yacho pachayo, asi iko kutengeserana kwakanangana nekuchengeteka.) Zviri nyore kudzoka kune zvakajairika gadziriso - ingo wedzera zvidimbu zvisipo. Zviri nyore kuti utange neyakagadziriswa gadziriso uye kumisikidza kuita kwezvimwe zvidimbu kune dzimwe nguva dzinotevera.
  8. Versioned configuration. Nekuda kwekuti shanduko dzemagadzirirwo dzinotevera nzira imwechete yekusimudzira, semhedzisiro tinowana artifact ine yakasarudzika vhezheni. Inotibvumira kushandura configuration kumashure kana zvichidiwa. Tinogona kutoisa gadziriso yakashandiswa gore rapfuura uye ichashanda nenzira imwecheteyo. Kugadziriswa kwakagadzikana kunovandudza kufungidzira uye kuvimbika kweiyo yakagoverwa system. Iyo gadziriso inogadziriswa panguva yekuunganidza uye haigone kukanganiswa nyore pane yekugadzira system.
  9. Modularity. Iyo yakarongwa dhizaini ndeye modular uye ma module anogona kusanganiswa nenzira dzakasiyana siyana
    tsigira zvigadziriso zvakasiyana (setups / marongero). Kunyanya, zvinokwanisika kuve nediki diki node dhizaini uye yakakura chiyero multi node kuseta. Zvine musoro kuve nemaitiro akawanda ekugadzira.
  10. Testing. Nezvinangwa zvekuyedza munhu anogona kuita sevhisi yekuseka uye kuishandisa sekutsamira nenzira yakachengeteka. Mamwe mashoma akasiyana ekuyedza marongero ane zvikamu zvakasiyana-siyana akatsiviwa nemaseke anogona kuchengetedzwa panguva imwe chete.
  11. Integration test. Dzimwe nguva mumasisitimu akagoverwa zvinonetsa kumhanyisa bvunzo dzekubatanidza. Tichishandisa iyo yakatsanangurwa nzira yekunyora yakachengeteka gadziriso yeyakazara yakagoverwa sisitimu, isu tinogona kumhanyisa zvikamu zvese zvakagoverwa pane imwe sevha nenzira inodzoreka. Zviri nyore kutevedzera mamiriro acho ezvinhu
    kana imwe yemasevhisi isingawanikwe.

payakaipira

Iyo yakaunganidzwa yekumisikidza nzira yakasiyana ne "yakajairika" kumisikidzwa uye inogona kusaenderana nezvinodiwa zvese. Hezvino zvimwe zvekuipa kweiyo yakagadzirwa config:

  1. Static configuration. Inogona kunge isina kukodzera kune ese maapplication. Mune zvimwe zviitiko pane kudiwa kwekukurumidza kugadzirisa kugadziridzwa mukugadzira kupfuudza ese ekuchengetedza matanho. Iyi nzira inoita kuti zvive zvakaoma. Iko kuunganidza uye kutumirazve kunodiwa mushure mekuita chero shanduko mukugadziriswa. Izvi zvese zviri zviviri chimiro uye mutoro.
  2. Configuration generation. Kana iyo config inogadzirwa neimwe otomatiki chishandiso iyi nzira inoda inotevera kuunganidzwa (iyo inogona kuzotadza kukundikana). Zvinogona kuda kuwedzera kuedza kubatanidza iyi nhanho yekuwedzera mukuvaka sisitimu.
  3. Zviridzwa. Kune akawanda maturusi ari kushandiswa nhasi anotsamira pane zvinyorwa-based configs. Vamwe vavo
    haishande kana gadziriso yaunganidzwa.
  4. Kuchinja kwemafungiro kunodiwa. Vagadziri uye DevOps vanojairana nemafaira ekugadzirisa mafaira. Pfungwa yekugadzira gadziriso inogona kuita seyakajairika kwavari.
  5. Usati waunza gadziriso inobatanidzwa inodiwa yemhando yepamusoro software yekuvandudza.

Pane zvimwe zvinogumira zvemuenzaniso wakashandiswa:

  1. Kana tikapa imwe gadziriso isiri kudiwa nekuita node, compiler haizotibatsire kuona kusipo kwekuita. Izvi zvinogona kugadziriswa nekushandisa HList kana maADTs (kesi makirasi) ekugadzirisa node pachinzvimbo chehunhu uye Keke Patani.
  2. Isu tinofanirwa kupa imwe boilerplate mune config faira: (package, import, object zviziviso;
    override def's yemaparameter ane default values). Izvi zvinogona kugadziriswa zvishoma uchishandisa DSL.
  3. Mune ino positi isu hativharidzire dynamic reconfiguration yemasumbu emanodhi akafanana.

mhedziso

Mune ino positi takakurukura pfungwa yekumiririra kumisikidzwa yakananga mune sosi kodhi nenzira yakachengeteka. Iyo nzira inogona kushandiswa mune akawanda maapplication sechinotsiva ku xml- uye mamwe mavara-akavakirwa configs. Zvisinei kuti muenzaniso wedu wakaitwa muScala, unogona zvakare kushandurirwa kune mimwe mitauro inobatanidzwa (seKotlin, C #, Swift, nezvimwewo). Mumwe anogona kuedza nzira iyi mupurojekiti nyowani uye, kana ikasakwana zvakanaka, chinja nenzira yechinyakare.

Ehe, gadziriso inosanganiswa inoda yemhando yepamusoro yekuvandudza maitiro. Mukudzoka inovimbisa kupa zvakaenzana zvemhando yepamusoro robust configuration.

Iyi nzira inogona kuwedzerwa nenzira dzakasiyana-siyana:

  1. Mumwe anogona kushandisa macros kuita gadziriso yekumisikidza uye kutadza panguva yekubatanidza kana chero bhizinesi-logic constraints kukundikana.
  2. A DSL inogona kuitwa kuti imiririre kumisikidzwa mune domain-mushandisi-inoshamwaridzika nzira.
  3. Dynamic resource manejimendi ine otomatiki gadziriso zvigadziriso. Semuenzaniso, kana isu tichigadzirisa huwandu hwemasumbu node isu tingada (1) node kuti tiwane zvishoma zvakagadziridzwa gadziriso; (2) cluster maneja kuti agamuchire hutsva node info.

Ndatenda

Ndinoda kutaura kuti ndinokutendai kuna Andrey Saksonov, Pavel Popov, Anton Nehaev nekupa mhinduro inokurudzira pakunyorwa kwechinyorwa ichi chakandibatsira kujekesa.

Source: www.habr.com