Kule post singathanda ukwabelana ngendlela enomdla yokujongana noqwalaselo lwenkqubo esasazwayo.
Uqwalaselo lumelwe ngokuthe ngqo kulwimi lweScala ngohlobo olukhuselekileyo. Umzekelo wokuphunyezwa uchazwe kwiinkcukacha. Imiba eyahlukeneyo yesindululo ixoxiwe, kubandakanywa nefuthe kwinkqubo yophuhliso iyonke.

()
intshayelelo
Ukwakha iisistim ezomeleleyo ezisasazwayo kufuna ukusetyenziswa kobumbeko oluchanekileyo noluhambelanayo kuzo zonke iindawo. Isisombululo esiqhelekileyo kukusebenzisa inkcazo yokuthunyelwa kwesicatshulwa (i-terraform, i-ansible okanye into efanayo) kunye neefayile zoqwalaselo ezenziwe ngokuzenzekelayo (ngokuqhelekileyo - zinikezelwe kwi-node / indima nganye). Kwakhona siya kufuna ukusebenzisa iiprothokholi ezifanayo kwiinguqulelo ezifanayo kwindawo nganye yonxibelelwano (kungenjalo siya kuba nemiba yokungahambelani). Kwihlabathi le-JVM oku kuthetha ukuba ubuncinane ilayibrari yokuthumela imiyalezo kufuneka ibe yinguqulelo efanayo kuzo zonke iindawo zonxibelelwano.
Kuthekani ngokuvavanya inkqubo? Ewe kunjalo, kufuneka sibe novavanyo lweyunithi yawo onke amacandelo phambi kokuza kuvavanyo lokudibanisa. Ukuze sikwazi ukongeza iziphumo zovavanyo ngexesha lokusebenza, kufuneka siqinisekise ukuba iinguqulelo zawo onke amathala eencwadi zigcinwa zifana ngexesha lokusebenza kunye neemeko zovavanyo.
Xa uqhuba iimvavanyo zokudibanisa, kudla ngokuba lula kakhulu ukuba nendlela yokufundela efanayo kuzo zonke iindawo. Kufuneka nje siqinisekise ukuba i-classpath efanayo iyasetyenziswa ekuhanjisweni. (Kuyenzeka ukusebenzisa iindlela ezahlukeneyo zeklasi kwiindawo ezahlukeneyo, kodwa kunzima ngakumbi ukumela olu lungelelwaniso kwaye lusetyenziswe ngokuchanekileyo.) Ke ukuze sigcine izinto zilula siza kuthathela ingqalelo kuphela iindlela zeklasi ezifanayo kuzo zonke iindawo.
Ulungelelwaniso luthanda ukuvela kunye nesoftware. Sidla ngokusebenzisa iinguqulelo ukuchonga ezahlukeneyo
izigaba zokuzivelela kwesoftware. Kubonakala kunengqiqo ukugubungela uqwalaselo phantsi kolawulo loguqulelo kunye nokuchonga ubumbeko olwahlukileyo ngezinye iilebhile. Ukuba kukho uqwalaselo olunye kuphela kwimveliso, sinokusebenzisa inguqulelo enye njengesichongi. Ngamanye amaxesha sinokuba neemeko ezininzi zemveliso. Kwaye kwimekobume nganye sinokufuna isebe elahlukileyo loqwalaselo. Ngoko ke ulungelelwaniso lunokufakwa ilebhile ngesebe kunye noguqulelo ukuchonga ngokukodwa uqwalaselo olwahlukileyo. Ileyibhile yesebe ngalinye kunye noguqulelo luhambelana nendibaniselwano enye yeenodi ezisasaziweyo, izibuko, izixhobo zangaphandle, iinguqulelo zelayibrari yeklasi kwi-node nganye. Apha siza kugquma kuphela isebe elinye kwaye sichonge ulungelelwaniso ngoguqulelo lwamacandelo amathathu edesimali (1.2.3), ngendlela efanayo nezinye izinto zakudala.
Kwiimeko-bume zanamhlanje iifayile zoqwalaselo azilungiswanga ngesandla kwakhona. Ngokuqhelekileyo sivelisa
config iifayile ngexesha lokuthunyelwa kunye emva koko. Ke umntu unokubuza ukuba kutheni sisasebenzisa ifomati yokubhaliweyo kwiifayile zoqwalaselo? Inketho esebenzayo kukubeka ulungelelwaniso ngaphakathi kweyunithi yokudibanisa kwaye uzuze ekuqulunqweni kwexesha lokuqinisekisa uqwalaselo.
Kule posi siza kuvavanya umbono wokugcina ulungelelwaniso kwi-artifact ehlanganisiweyo.
Ubumbeko oluhambelanayo
Kweli candelo siza kuxoxa ngomzekelo woqwalaselo olungatshintshiyo. Iinkonzo ezimbini ezilula - inkonzo ye-echo kunye nomxhasi wenkonzo ye-echo iyaqwalaselwa kwaye iphunyezwe. Emva koko iinkqubo ezimbini ezahlukeneyo ezisasazwayo kunye neenkonzo zombini ziyaqiniswa. Enye yeyoqwalaselo lwendawo enye kunye nenye yoqwalaselo lweendawo ezimbini.
Inkqubo eqhelekileyo esasazwayo iquka iindawo ezimbalwa. Iindawo zokuhlala zinokuchongwa kusetyenziswa uhlobo oluthile:
sealed trait NodeId
case object Backend extends NodeId
case object Frontend extends NodeIdokanye nje
case class NodeId(hostName: String)okanye
object Singleton
type NodeId = Singleton.typeEzi nodi zenza iindima ezahlukeneyo, ziqhuba ezinye iinkonzo kwaye kufuneka zikwazi ukunxibelelana nezinye iindawo ngokuqhagamshelwa kwe-TCP/HTTP.
Kuqhagamshelo lwe-TCP ubuncinane inani lezibuko liyafuneka. Sikwafuna ukuqinisekisa ukuba umxhasi kunye nomncedisi bathetha ngendlela efanayo. Ukuze wenze umzekelo wonxibelelwano phakathi kweendawo zokuhlala masibhengeze olu didi lulandelayo:
case class TcpEndPoint[Protocol](node: NodeId, port: Port[Protocol])apho Port ngu Int ngaphakathi koluhlu oluvunyelweyo:
type PortNumber = Refined[Int, Closed[_0, W.`65535`.T]]Iintlobo ezisulungekileyo
khangela ithala leencwadi. Ngamafutshane, ivumela ukongeza imiqobo yexesha lokuqokelela kwezinye iindidi. Kule meko Int ivunyelwe kuphela ukuba ne-16-bit yamaxabiso enokumela inombolo yezibuko. Akukho mfuneko yokusebenzisa eli thala leencwadi kule ndlela yoqwalaselo. Ibonakala ingena kakuhle kakhulu.
Kwi-HTTP (REST) sinokufuna indlela yenkonzo:
type UrlPathPrefix = Refined[String, MatchesRegex[W.`"[a-zA-Z_0-9/]*"`.T]]
case class PortWithPrefix[Protocol](portNumber: PortNumber, pathPrefix: UrlPathPrefix)Uhlobo lwePhantom
Ukuze uchonge iprothokholi ngexesha lokuhlanganisa sisebenzisa uphawu lwe-Scala lokubhengeza uhlobo lwengxabano Protocol engasetyenziswa eklasini. Kubizwa njalo uhlobo lwe-phantom. Ngexesha lokusebenza asifane sifune umzekelo wesazisi somthetho, yiyo loo nto singawugcini. Ngexesha lokuqulunqa olu hlobo lwe-phantom lunika ukhuseleko lohlobo olongezelelweyo. Asikwazi ukudlula izibuko ngeprothokholi engalunganga.
Enye yeendlela ezisetyenziswa kakhulu yi-REST API ene-Json serialization:
sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]apho RequestMessage luhlobo olusisiseko lwemiyalezo umxhasi anokuyithumela kumncedisi kwaye ResponseMessage ngumyalezo wempendulo ovela kumncedisi. Ewe kunjalo, sinokwenza ezinye iinkcazo zeprotocol ezichaza iprotocol yonxibelelwano ngokuchaneka okufunwayo.
Ngenjongo yale posi siza kusebenzisa inguqulelo elula yeprotocol:
sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]Kulo myalezo wesicelo somthetho womthetho uhlonyelwe kwi-url kwaye umyalezo wempendulo ubuyiselwa njengomtya ongenanto.
Ubumbeko lwenkonzo lunokuchazwa ngegama lenkonzo, ingqokelela yamazibuko kunye nabanye abaxhomekeke kubo. Kukho iindlela ezimbalwa ezinokwenzeka zendlela yokumela zonke ezi zinto kwi-Scala (umzekelo, HList, iindidi zedatha yealjibra). Ngenjongo yesi sithuba siza kusebenzisa iPatheni yeCake kwaye simele amaqhekeza adibeneyo (iimodyuli) njengeempawu. (Ipateni yekeyiki ayiyomfuneko kule ndlela yoqwalaselo edityanisiweyo. Kukuzalisekiswa okunokwenzeka kombono.)
Ukuxhomekeka kunokumelwa kusetyenziswa iPhatheni yeCake njengesiphelo sezinye iindawo:
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)
}Inkonzo ye-Echo ifuna kuphela izibuko elimiselweyo. Kwaye sibhengeza ukuba eli zibuko liyayixhasa i-echo protocol. Qaphela ukuba akufuneki sichaze izibuko elithile ngalo mzuzu, kuba i-trait's ivumela izibhengezo zeendlela ezingabonakaliyo. Ukuba sisebenzisa iindlela ezingabonakaliyo, umqokeleli uya kufuna ukuphunyezwa kwimeko yoqwalaselo. Apha sinikeze ukuphunyezwa (8081) kwaye iyakusetyenziswa njengexabiso elingagqibekanga ukuba sitsiba kuqwalaselo lwekhonkrithi.
Sinokubhengeza ukuxhomekeka kuqwalaselo lomthengi wenkonzo ye-echo:
trait EchoClientConfig[A] {
def testMessage: String = "test"
def pollInterval: FiniteDuration
def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
}Ukuxhomekeka kunohlobo olufanayo njenge echoService. Ngokukodwa, ifuna inkqubo efanayo. Ke ngoko, sinokuqiniseka ukuba xa sidibanisa ezi zimbini zixhomekeke ziya kusebenza ngokuchanekileyo.
Ukuphunyezwa kweenkonzo
Inkonzo idinga umsebenzi ukuze iqalise kwaye ivale ngobubele. (Ukwazi ukuvala inkonzo kubalulekile kuvavanyo.) Kwakhona kukho iindlela ezimbalwa zokuchaza umsebenzi onjalo woqwalaselo olunikiweyo (umzekelo, sinokusebenzisa uhlobo lweeklasi). Kule post siza kusebenzisa iPatheni yeCake kwakhona. Singamela inkonzo usebenzisa cats.Resource esele ibonelela ngokubeka izibiyeli kunye nokukhululwa kwezibonelelo. Ukuze sifumane uvimba kufuneka sinikezele ngolungelelwaniso kunye nemeko yexesha lokusebenza. Ke umsebenzi wokuqalisa inkonzo unokujongeka ngolu hlobo:
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]
}apho
Config— uhlobo lolungelelwaniso olufunwa ngumqalisi wesevisiAddressResolver- into yokubaleka ekwaziyo ukufumana iidilesi zokwenyani zezinye ii-node (qhubeka ufunda ngeenkcukacha).
ezinye iindidi zivela cats:
F[_]- uhlobo lwesiphumo (Kwimeko elulaF[A]inokuba nje() => A. Kule post siza kusebenzisacats.IO.)Reader[A,B]— sisithethantonye somsebenziA => Bcats.Resource-Uneendlela zokufumana kunye nokukhululaTimer— ivumela ukulala/ukulinganisa ixeshaContextShift-analog yeExecutionContextApplicative- isisongelo semisebenzi esebenzayo (phantse i-monad) (ekugqibeleni sinokuyibuyisela enye into)
Ukusebenzisa olu jongano sinokuphumeza iinkonzo ezimbalwa. Umzekelo, inkonzo engenzi nto:
trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
type Config <: Any
def resource(...): ResourceReader[F, Config, Unit] =
Reader(_ => Resource.pure[F, Unit](()))
}(Jonga kwezinye iinkonzo zokuphunyezwa - ,
kwaye .)
I-node yinto enye eqhuba iinkonzo ezimbalwa (ukuqala ikhonkco lemithombo yenziwe yiPateni yeCake):
object SingleNodeImpl extends ZeroServiceImpl[IO]
with EchoServiceService
with EchoClientService
with FiniteDurationLifecycleServiceImpl
{
type Config = EchoConfig[String] with EchoClientConfig[String] with FiniteDurationLifecycleConfig
}Qaphela ukuba kwi-node sichaza uhlobo oluchanekileyo loqwalaselo olufunekayo kule node. Umqokeleli akayi kusivumela ukuba sakhe into (Ikeyiki) ngohlobo olungonelanga, kuba uphawu lwenkonzo nganye lubhengeza umqobo kwi Config uhlobo. Kananjalo asizukwazi ukuqalisa i-node ngaphandle kokubonelela ngolungelelwaniso olupheleleyo.
Isisombululo sedilesi yeNode
Ukuze siseke uxhulumaniso sifuna idilesi yokwenene yomninimzi kwindawo nganye. Isenokwaziwa mva kunezinye iindawo zoqwalaselo. Kungoko, sidinga indlela yokubonelela ngemephu phakathi kwe-id ye-node kunye nedilesi yayo yokwenyani. Le mephu ngumsebenzi:
case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}Kukho iindlela ezimbalwa ezinokwenzeka zokuphumeza umsebenzi onjalo.
- Ukuba siyazazi iidilesi zokwenyani ngaphambi kokuthunyelwa, ngexesha lokubanjwa kwe-node, ngoko sinokuvelisa ikhowudi ye-Scala kunye needilesi zokwenyani kwaye siqhube ukwakha emva koko (okwenza ukuqokelela ixesha lokujonga kwaye emva koko kuqhuba uvavanyo lokudibanisa). Kule meko umsebenzi wethu wokwenza imephu waziwa ngokwezibalo kwaye unokwenziwa lula kwinto efana ne
Map[NodeId, NodeAddress]. - Ngamanye amaxesha sifumana iidilesi zokwenyani kuphela emva kwexesha xa indawo yokusebenzela iqalisiwe, okanye asinazo iidilesi zeendawo ezingekaqaliswa. Kule meko sinokuba nenkonzo yokufumanisa eqalwe phambi kwazo zonke ezinye iindawo kwaye indawo nganye inokubhengeza idilesi yayo kuloo nkonzo kwaye ibhalisele ukuxhomekeka.
- Ukuba sinokuyilungisa
/etc/hosts, sinokusebenzisa amagama enginginya achazwe kwangaphambili (njengemy-project-main-nodekwayeecho-backend) kwaye udibanise eli gama kunye nedilesi ye-IP ngexesha lokuthunyelwa.
Kule posi asiwafaki la matyala kwiinkcukacha ezithe kratya. Ngapha koko kumzekelo wethu wokudlala zonke iindawo ziya kuba nedilesi ye-IP efanayo - 127.0.0.1.
Kule post siza kuthathela ingqalelo iindlela ezimbini ezisasaziweyo zenkqubo:
- Uyilo lwendawo enye, apho zonke iinkonzo zibekwe kwindawo enye.
- Uyilo lweendawo ezimbini, apho inkonzo kunye nomxhasi bakwiindawo ezahlukeneyo.
Uqwalaselo lwe uyilo ngolu hlobo lulandelayo:
Uqwalaselo lwendawo enye
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.
}Apha senza uqwalaselo olunye olwandisa zombini umncedisi kunye noqwalaselo lomxumi. Kwakhona siqwalasela isilawuli somjikelo wobomi oya kuthi aphelise umxhasi kunye neseva emva koko lifetime ixesha lokudlula.
Iseti efanayo yophunyezo lwenkonzo kunye noqwalaselo lunokusetyenziswa ukwenza uyilo lwenkqubo eneendawo ezimbini ezahlukeneyo. Sidinga nje ukudala ngeenkonzo ezifanelekileyo:
Uqwalaselo lweendawo ezimbini
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"
}Jonga ukuba sichaza njani ukuxhomekeka. Sikhankanya inkonzo enikezelweyo yenye node njengokuxhomekeka kwendawo yangoku. Uhlobo lokuxhomekeka lukhangelwe kuba luqulethe uhlobo lwe-phantom oluchaza iprotocol. Kwaye ngexesha lokuqhuba siya kuba ne-id eyi-node echanekileyo. Lo ngomnye wemiba ebalulekileyo yendlela ecetywayo yolungiselelo. Isinika amandla okuseta izibuko kube kanye kuphela kwaye siqinisekise ukuba sibhekisa kwizibuko elichanekileyo.
Ukuphunyezwa kweendawo ezimbini
Kolu lungelelwaniso sisebenzisa ngqo iinkonzo ezifanayo zophumezo. Akukho tshintsho kwaphela. Nangona kunjalo, sidala ukuphunyezwa kweendawo ezimbini ezahlukeneyo eziqulethe iiseti ezahlukeneyo zeenkonzo:
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
}Indawo yokuqala isebenzisa iseva kwaye ifuna kuphela uqwalaselo lwecala lomncedisi. Indawo yesibini iphumeza umxhasi kwaye ifuna enye inxalenye yoqwalaselo. Zombini iinodi zifuna iinkcukacha ezithile zobomi. Ngenjongo yale node yenkonzo yeposi iya kuba nobomi obungenasiphelo obunokupheliswa kusetyenziswa SIGTERM, ngelixa umxhasi we-echo uya kuphelisa emva kwexesha elimiselweyo elimiselweyo. Bona i iinkcukacha.
Inkqubo yophuhliso iyonke
Makhe sibone ukuba le ndlela yokujonga iyitshintsha njani indlela esisebenza ngayo kuqwalaselo.
Ubumbeko njengekhowudi iya kuqulunqwa kwaye ivelise i-artifact. Kubonakala kunengqiqo ukwahlula i-artifact yoqwalaselo kwezinye izinto zakudala zekhowudi. Rhoqo sinokuba nenkitha yoqwalaselo kwisiseko sekhowudi enye. Kwaye kunjalo, sinokuba neenguqulelo ezininzi zamasebe oqwalaselo ahlukeneyo. Kubumbeko singakhetha iinguqulelo ezithile zamathala eencwadi kwaye oku kuya kuhlala kungatshintshi nanini na sibeka olu lungelelwaniso.
Utshintsho kubumbeko luba lutshintsho lwekhowudi. Ngoko ke kufuneka igutyungelwe yinkqubo efanayo yokuqinisekisa umgangatho:
Itikiti -> PR -> ukuphononongwa -> ukudibanisa -> ukuhlanganiswa okuqhubekayo -> ukuthunyelwa okuqhubekayo
Kukho iziphumo ezilandelayo zendlela yokusebenza:
- Ubumbeko luhambelana kumzekelo wenkqubo ethile. Kubonakala ngathi akukho ndlela yokuba nonxibelelwano olungachanekanga phakathi kweenodi.
- Akukho lula ukutshintsha ubumbeko kwindawo enye. Kubonakala kungenangqiqo ukungena kunye nokutshintsha ezinye iifayile ezibhaliweyo. Ngoko ke uqwalaselo lwe-drift luba lula.
- Utshintsho oluncinci loqwalaselo alulula ukwenza.
- Uninzi lweenguqu zoqwalaselo luya kulandela inkqubo efanayo yophuhliso, kwaye iya kudlula uphononongo oluthile.
Ngaba sifuna indawo yokugcina eyahlukileyo yoqwalaselo lwemveliso? Ubumbeko lwemveliso lunokuqulatha ulwazi olubuthathaka esingathanda ukulugcina lukude nabantu abaninzi. Ngoko ke kunokuba kufanelekile ukugcina indawo yokugcina eyahlukileyo enofikelelo oluthintelweyo oluya kuqulatha uqwalaselo lwemveliso. Sinokwahlula ubumbeko lube ngamacandelo amabini-enye equlathe eyona parameters ivulekileyo yemveliso kunye nenye equlathe imfihlo yoqwalaselo. Oku kuya kwenza ufikelelo kuninzi lwabaphuhlisi kuninzi olukhulu lweeparamitha ngelixa uthintela ufikelelo kwizinto ezinobuzaza ngenene. Kulula ukufezekisa oku usebenzisa iimpawu eziphakathi kunye namaxabiso eparameter engagqibekanga.
Umahluko
Makhe sibone iinzuzo kunye neengozi zendlela ecetywayo xa kuthelekiswa nezinye iindlela zokulawula uqwalaselo.
Okokuqala, siza kudwelisa ezinye iindlela ezimbalwa kwimiba eyahlukeneyo yendlela ecetywayo yokujongana noqwalaselo:
- Ifayile yokubhaliweyo kumatshini ekujoliswe kuwo.
- Ugcino lwexabiso elingundoqo olusembindini (njenge
etcd/zookeeper). - Amalungu enkqubo engaphantsi anokuthi aqwalaselwe kwakhona/aqalwe ngokutsha ngaphandle kokuphinda kuqalwe inkqubo.
- Ulungelelwaniso olungaphandle kwe-artifact kunye nolawulo loguqulelo.
Ifayile yokubhaliweyo inika ukuguquguquka okuthile malunga nokulungiswa kwe-ad-hoc. Umlawuli wesixokelelwano angangena kwindawo ekujoliswe kuyo, enze utshintsho kwaye aqalise kwakhona inkonzo. Oku kusenokungabi kuhle kwiinkqubo ezinkulu. Akukho mikhondo ishiywe emva kotshintsho. Utshintsho alujongwa ngelinye iperi yamehlo. Kunokuba nzima ukufumanisa ukuba yintoni ebangele utshintsho. Ayikavavanywa. Ukusuka kwimbono yenkqubo esasaziweyo umlawuli unokulibala ngokulula ukuhlaziya ubumbeko kwenye yezinye iindawo.
(Btw, ukuba ekugqibeleni kuya kubakho isidingo sokuqalisa ukusebenzisa iifayile zoqwalaselo lokubhaliweyo, kuya kufuneka kuphela songeze umchasi + umqinisi onokuvelisa okufanayo. Config chwetheza kwaye oko kunokwanela ukuqalisa ukusebenzisa uqwalaselo lokubhaliweyo. Oku kukwabonisa ukuba ukuntsonkotha koqwalaselo lwexesha lokuqokelela kuncinci kancinci ukuba ukuntsonkotha koqwalaselo olusekwe kwiteksti, kuba kwinguqulelo esekwe kwiteksti sifuna ikhowudi eyongezelelweyo.)
Ugcino lwexabiso elingundoqo oluphakathi luyindlela elungileyo yokusasaza iiparamitha zemeta yesicelo. Apha kufuneka sicinge malunga nento esiyijonga njengexabiso loqwalaselo kwaye yintoni idatha nje. Unikwe umsebenzi C => A => B siqhele ukubiza amanani anqabileyo aguqukayo C "uqwalaselo", ngelixa idatha iguqulwa rhoqo A - data igalelo nje. Ulungelelwaniso kufuneka lunikezelwe kumsebenzi ngaphambi kwedatha A. Xa sinikwa le ngcamango sinokuthi kulindeleke ukuba kwenzeke rhoqo utshintsho olunokuthi lusetyenziswe ukwahlula idatha yoqwalaselo kwidatha nje. Kwakhona idatha idla ngokuvela kumthombo omnye (umsebenzisi) kwaye uqwalaselo luvela kumthombo owahlukileyo (admin). Ukujongana neeparamitha ezinokuthi zitshintshwe emva kwenkqubo yokuqalisa ikhokelela ekwandeni kobunzima besicelo. Kwezo parameters kuya kufuneka sijongane nendlela yokuhanjiswa kwazo, ukwahlula kunye nokuqinisekisa, ukuphatha amaxabiso angachanekanga. Yiyo loo nto, ukuze kuncitshiswe ubunzima benkqubo, kungangcono sinciphise inani leeparamitha ezinokutshintsha ngexesha lokusebenza (okanye nokuzisusa ngokupheleleyo).
Ngokwembono yesi sithuba kufuneka senze umahluko phakathi kweeparamitha ezimileyo kunye neziguquguqukayo. Ukuba ingqiqo yenkonzo ifuna utshintsho olunqabileyo lwezinye iiparameters ngexesha lokusebenza, ngoko ke sinokuzibiza iiparameters eziguqukayo. Kungenjalo zimile kwaye zinokumiselwa kusetyenziswa indlela ecetywayo. Kuhlenga-hlengiso oluguqukayo ezinye iindlela zingafuneka. Umzekelo, iinxalenye zesixokelelwano zinokuphinda ziqalwe ngokutsha ngeeparamitha zoqwalaselo ngendlela efanayo ekuqaliseni kwakhona iinkqubo ezahlukeneyo zenkqubo esasaziweyo.
(Uluvo lwam oluthobekileyo kukunqanda uhlengahlengiso lwexesha lokubaleka kuba lunyusa ubunzima benkqubo.
Kunokuba kuthe tye ngakumbi ukuthembela kwinkxaso ye-OS yeenkqubo zokuqalisa kwakhona. Nangona, isenokungasoloko inokwenzeka.)
Omnye umba obalulekileyo wokusebenzisa uqwalaselo olungatshintshiyo olwenza ukuba ngamanye amaxesha abantu bacinge ngolungelelwaniso oluguqukayo (ngaphandle kwezinye izizathu) lixesha lokuphumla kwenkonzo ngexesha lohlaziyo loqwalaselo. Ewe, ukuba kufuneka senze utshintsho kuqwalaselo olungatshintshiyo, kufuneka siqale ngokutsha inkqubo ukuze amaxabiso amatsha asebenze. Iimfuno zexesha lokuphumla ziyahluka kwiinkqubo ezahlukeneyo, ngoko ke akunakubaluleka kangako. Ukuba ibalulekile, ngoko ke kufuneka sicwangcise kwangaphambili ngayo nayiphi na inkqubo yokuqalisa kwakhona. Ngokomzekelo, sinokuyiphumeza . Kule meko nanini na xa sifuna ukuqalisa kwakhona inkqubo, siqala umzekelo omtsha wenkqubo ngokuhambelanayo, emva koko utshintshe i-ELB kuyo, ngelixa uvumela inkqubo endala ukuba igqibe ukusevisa uxhulumaniso olukhoyo.
Kuthekani ngokugcina ulungelelwaniso ngaphakathi kwe-artifact eguqulelweyo okanye ngaphandle? Ukugcina ubumbeko ngaphakathi kwe-artifact kuthetha ukuba kwiimeko ezininzi olu lungelelwaniso lugqithise inkqubo yoqinisekiso lomgangatho ofanayo nezinye izinto zakudala. Ke umntu unokuqiniseka ukuba uqwalaselo lusemgangathweni olungileyo kwaye luthembekile. Ngokuchasene noko uqwalaselo kwifayile eyahlukileyo luthetha ukuba akukho zikhondo zokuba ngubani kwaye kutheni enze utshintsho kuloo fayile. Ngaba oku kubalulekile? Sikholelwa ukuba kwiinkqubo ezininzi zemveliso kungcono ukuba noqwalaselo oluzinzileyo noluphezulu.
Inguqulelo ye-artifact ivumela ukufumanisa ukuba yenziwa nini, ngawaphi amaxabiso aqulethweyo, zeziphi iimpawu ezenziweyo / zikhubazekile, ngubani owayenoxanduva lokwenza utshintsho ngalunye kuqwalaselo. Kusenokufuna umzamo othile ukugcina ulungelelwaniso ngaphakathi kwe-artifact kwaye lukhetho loyilo ekufuneka lwenziwe.
IiPros & cons
Apha singathanda ukuqaqambisa iingenelo ezithile kunye nokuxoxa ngezinto ezingeloncedo ngendlela ecetywayo.
eziluncedo
Iimpawu zolungelelwaniso oludityanisiweyo lwenkqubo epheleleyo esasaziweyo:
- Ukujonga uqwalaselo olungatshintshiyo. Oku kunika umgangatho ophezulu wokuzithemba, ukuba uqwalaselo luchanekile uhlobo lwemithintelo yohlobo.
- Ulwimi olutyebileyo loqwalaselo. Ngokuqhelekileyo ezinye iindlela zoqwalaselo zilinganiselwe kutshintsho oluninzi.
Ukusebenzisa iScala umntu unokusebenzisa uluhlu olubanzi lweempawu zolwimi ukwenza ulungelelwaniso lubengcono. Umzekelo, sinokusebenzisa iimpawu ukubonelela ngamaxabiso angagqibekanga, izinto zokuseta umda owahlukileyo, esinokubhekisa kuwovals ichazwe kube kanye kuphela kumda ongaphandle (DRY). Kuyenzeka ukusebenzisa ulandelelwano lwenyani, okanye imizekelo yeendidi ezithile (Seq,Map, njl). - DSL. I-Scala inenkxaso efanelekileyo kubabhali beDSL. Omnye unokusebenzisa ezi mpawu ukuseka ulwimi loqwalaselo olulungele ngakumbi kwaye lunobuhlobo bomsebenzisi wokugqibela, ukwenzela ukuba uqwalaselo lokugqibela lufundeke ubuncinane ngabasebenzisi besizinda.
- Imfezeko kunye nokuhambelana kuzo zonke iindawo. Enye yeenzuzo zokuba noqwalaselo lwenkqubo yonke esasaziweyo kwindawo enye kukuba onke amaxabiso achazwa ngokungqongqo kube kanye emva koko aphinde asetyenziswe kuzo zonke iindawo esiwafuna kuzo. Kwakhona chwetheza izibhengezo zezibuko ezikhuselekileyo qinisekisa ukuba kulo lonke ulungelelwaniso olunokwenzeka oluchanekileyo iindawo zenkqubo ziya kuthetha ulwimi olufanayo. Kukho ukuxhomekeka okucacileyo phakathi kwee-nodes ezenza kube nzima ukulibala ukubonelela ngeenkonzo ezithile.
- Umgangatho ophezulu weenguqu. Indlela iyonke yokudlulisa uhlengahlengiso kwinkqubo yesiqhelo yePR iseka imigangatho ephezulu yomgangatho nakulungiselelo.
- Utshintsho kubumbeko ngaxeshanye. Nanini na xa sisenza naluphi na utshintsho kuqwalaselo oluzenzekelayo luqinisekisa ukuba zonke iindawo ziyahlaziywa.
- Ukwenza lula isicelo. Usetyenziso akufuneki lucazulule kwaye luqinisekise ubumbeko nokuphatha amaxabiso olungelelwaniso angachanekanga. Oku kwenza kube lula usetyenziso ngokubanzi. (Okunye ukonyuka okuntsokothileyo kukuqwalaselo ngokwalo, kodwa lurhwebo olunengqiqo olusingise kukhuseleko.) Kuhle kakhulu ukuba ubuyele kuqwalaselo oluqhelekileyo - yongeza nje iziqwenga ezingekhoyo. Kulula ukuqalisa ngoqwalaselo oluhlanganisiweyo kunye nokuhlehlisa ukuphunyezwa kwamaqhekeza okongeziweyo kumaxesha athile kamva.
- Ubumbeko oluguqulelweyo. Ngenxa yokuba iinguqu zoqwalaselo zilandela inkqubo efanayo yophuhliso, ngenxa yoko sifumana i-artifact enenguqulelo eyodwa. Ivumela ukuba sitshintshe uqwalaselo emva ukuba kuyimfuneko. Sinokude sibeke ulungelelwaniso olwalusetyenziswe kunyaka ophelileyo kwaye luya kusebenza ngendlela efanayo. Ukucwangciswa okuzinzileyo kuphucula ukuqikelelwa kunye nokuthembeka kwenkqubo esasazwayo. Ulungelelwaniso lulungisiwe ngexesha lokuqokelela kwaye alunakuphazanyiswa lula kwinkqubo yokuvelisa.
- Ukumodareyitha. Isakhelo esicetywayo sisemodyuli kwaye iimodyuli zinokudityaniswa ngeendlela ezahlukeneyo ukuze
xhasa ulungelelwaniso olwahlukileyo (umiselo/uyilo). Ngokukodwa, kuyenzeka ukuba ube nesikali esincinci soyilo lwendawo enye kunye nesikali esikhulu sokusetwa kweenodi ezininzi. Kusengqiqweni ukuba noyilo lwemveliso emininzi. - Uvavanyo. Ngeenjongo zokuvavanya umntu unokusebenzisa inkonzo yempoxo kwaye ayisebenzise njengokuxhomekeka kwindlela ekhuselekileyo yohlobo. Uyilo olumbalwa olwahlukeneyo lovavanyo olunamalungu awohlukeneyo endaweni yawo ziziqhulo anokugcinwa ngaxeshanye.
- Uvavanyo lokudibanisa. Ngamanye amaxesha kwiinkqubo ezisasaziweyo kunzima ukuqhuba iimvavanyo zokudibanisa. Ukusebenzisa indlela echazwe ukuchwetheza uqwalaselo olukhuselekileyo lwenkqubo epheleleyo esasazwayo, sinokuqhuba zonke iindawo ezisasazwayo kumncedisi omnye ngendlela elawulwayo. Kulula ukulinganisa imeko
xa enye yeenkonzo ingafumaneki.
nezingeloncedo
Indlela yoqwalaselo ehlanganisiweyo yahlukile kulungiselelo “oluqhelekileyo” kwaye isenokungalungeli zonke iimfuno. Nazi ezinye izinto ezingeloncedo kuqwalaselo oluqokelelweyo:
- Ubumbeko oluzinzileyo. Isenokungalungeli zonke izicelo. Kwezinye iimeko kukho imfuneko yokulungisa ngokukhawuleza ulungelelwaniso kwimveliso ngokudlula zonke iindlela zokhuseleko. Le ndlela yenza kube nzima ngakumbi. Ukuqulunqwa kunye nokusasazwa ngokutsha kuyafuneka emva kokwenza naluphi na utshintsho kubumbeko. Oku zombini uphawu kunye nomthwalo.
- Ukwenziwa koqwalaselo. Xa uqwalaselo luveliswa sisixhobo esithile esizisebenzelayo le ndlela ifuna ukuhlanganiswa okulandelayo (enokuthi yona iphumelele). Kusenokufuna inzame eyongezelelweyo ukudibanisa eli nyathelo elongezelelweyo kwinkqubo yokwakha.
- Izixhobo zomculo. Zininzi izixhobo ezisetyenziswayo namhlanje ezixhomekeke kwi-text-based configs. Enye yazo
ayizukusebenza xa ulungelelwaniso luqokelelwa. - Utshintsho kwindlela yokucinga luyafuneka. Abaphuhlisi kunye ne-DevOps baqhelene neefayile zoqwalaselo lombhalo. Umbono wokuqulunqa uqwalaselo unokubonakala ungaqhelekanga kubo.
- Phambi kokwazisa uqwalaselo oludibeneyo inkqubo yophuhliso lwesoftware ekumgangatho ophezulu iyafuneka.
Kukho imida yomzekelo ophunyeziweyo:
- Ukuba sibonelela ngoqwalaselo olongezelelweyo olungafunwayo luphunyezo lwe-node, umqokeleli akayi kusinceda ukuba sibone ukuphunyezwa okungekho. Oku kunokusonjululwa ngokusetyenziswa
HListokanye iiADTs (iiklasi zemeko) kuqwalaselo lwenode endaweni yeempawu kunye nePatheni yeCake. - Kufuneka sinikeze i-boilerplate kwifayile yoqwalaselo: (
package,import,objectizibhengezo;
override def's yeparameters ezinamaxabiso angagqibekanga). Oku kunokuqwalaselwa ngokuyinxenye kusetyenziswa i-DSL. - Kwesi sithuba asigubungeli uhlengahlengiso oluguquguqukayo lwamaqela eendawo ezifanayo.
isiphelo
Kule post sixoxe ngombono wokumela uqwalaselo ngqo kwikhowudi yomthombo ngendlela ekhuselekileyo. Indlela yokujonga inokusetyenziswa kwizicelo ezininzi njengendawo yokutshintsha i-xml- kunye nolunye uqwalaselo olusekwe kumbhalo. Ngaphandle kokuba umzekelo wethu uphunyeziwe kwi-Scala, unokuguqulelwa kwezinye iilwimi ezidibeneyo (ezifana neKotlin, C #, Swift, njl.). Umntu unokuzama le ndlela kwiprojekthi entsha kwaye, ukuba ayingeni kakuhle, tshintshela kwindlela yakudala.
Ngokuqinisekileyo, ulungelelwaniso oludibeneyo lufuna inkqubo yophuhliso lomgangatho ophezulu. Ngembuyekezo ithembisa ukubonelela ngokulinganayo umgangatho ophezulu woqwalaselo oluqinileyo.
Le ndlela inokwandiswa ngeendlela ezahlukeneyo:
- Umntu unokusebenzisa iimacros ukwenza uqinisekiso lolungelelwaniso kwaye asilele ngexesha lokuqokelela kwimeko yokusilela kwemiqobo yeshishini.
- I-DSL inokuphunyezwa ukubonisa ulungelelwaniso kwi-domain-user-friendly way.
- Ulawulo lwesixhobo esinamandla kunye nohlengahlengiso oluzenzekelayo lolungelelwaniso. Umzekelo, xa sihlengahlengisa inani leendibano zeqela esinokufuna (1) iindawo zokufumana ubumbeko oluhlengahlengisiweyo kancinane; (2) umphathi weqela ukufumana ulwazi olutsha lweenodi.
Enkosi
Ndingathanda ukubulela ku-Andrey Saksonov, uPavel Popov, u-Anton Nehaev ngokunika impendulo ekhuthazayo kwidrafti yale post eyandinceda ukuba ndiyenze icace.
umthombo: www.habr.com
