Dhibiti usanidi wa huduma ndogo kwa urahisi ukitumia microconfig.io

Moja ya matatizo makuu katika maendeleo na uendeshaji wa baadaye wa microservices ni usanidi wenye uwezo na sahihi wa matukio yao. Kwa maoni yangu, mfumo mpya unaweza kusaidia na hii microconfig.io. Inakuruhusu kutatua kazi za usanidi wa programu za kawaida kwa uzuri kabisa.

Ikiwa una microservices nyingi, na kila mmoja wao anakuja na faili / faili zake za usanidi, basi kuna uwezekano mkubwa wa kufanya kosa katika mojawapo yao, ambayo inaweza kuwa vigumu sana kukamata bila ujuzi sahihi na mfumo wa magogo. Kazi kuu ambayo mfumo unajiwekea ni kupunguza vigezo vya usanidi wa mfano, na hivyo kupunguza uwezekano wa kuongeza hitilafu.

Hebu tuangalie mfano. Wacha tuseme tuna programu rahisi na faili ya usanidi yaml. Hii inaweza kuwa huduma ndogo yoyote katika lugha yoyote. Wacha tuone jinsi mfumo unaweza kutumika kwa huduma hii.

Lakini kwanza, kwa urahisi zaidi, wacha tuunda mradi tupu katika IDE ya Idea, baada ya kusakinisha programu-jalizi ya microconfig.io ndani yake:

Dhibiti usanidi wa huduma ndogo kwa urahisi ukitumia microconfig.io

Tunaweka usanidi wa uzinduzi wa programu-jalizi, unaweza kutumia usanidi chaguo-msingi, kama kwenye picha ya skrini hapo juu.

Huduma yetu inaitwa utaratibu, basi katika mradi mpya tutaunda muundo sawa:

Dhibiti usanidi wa huduma ndogo kwa urahisi ukitumia microconfig.io

Weka faili ya usanidi kwenye folda na jina la huduma - maombi.yaml. Microservices zote zinazinduliwa katika aina fulani ya mazingira, kwa hiyo, pamoja na kuunda usanidi wa huduma yenyewe, ni muhimu kuelezea mazingira yenyewe: kwa hili tutaunda folda. envs na uiongeze faili iliyo na jina la mazingira yetu ya kufanya kazi. Kwa hivyo, mfumo utaunda faili za usanidi kwa huduma katika mazingira dev, kwa kuwa parameter hii imewekwa katika mipangilio ya programu-jalizi.

Muundo wa faili dev.yaml itakuwa rahisi sana:

mainorder:
    components:
         - order

Mfumo hufanya kazi na usanidi ambao umeunganishwa pamoja. Kwa huduma yetu, chagua jina la kikundi agizo kuu. Mfumo hupata kila kikundi kama hicho cha programu kwenye faili ya mazingira na huunda usanidi kwa wote, ambao hupata kwenye folda zinazolingana.

Katika faili ya mipangilio ya huduma yenyewe ili Wacha tubainishe parameta moja tu kwa sasa:

spring.application.name: order

Sasa wacha tuendeshe programu-jalizi, na itatoa usanidi unaohitajika kwa huduma yetu kulingana na njia iliyoainishwa katika mali:

Dhibiti usanidi wa huduma ndogo kwa urahisi ukitumia microconfig.io

Unaweza pitia na bila kusanikisha programu-jalizi, kupakua tu usambazaji wa mfumo na kuiendesha kutoka kwa safu ya amri.
Suluhisho hili linafaa kwa matumizi kwenye seva ya ujenzi.

Ni muhimu kuzingatia kwamba mfumo unaelewa kikamilifu mali syntax, yaani, faili za kawaida za mali ambazo zinaweza kutumika pamoja katika yaml usanidi.

Hebu tuongeze huduma nyingine malipo na ugumu uliopo.
Π’ ili:

eureka:
 instance.preferIpAddress: true
 client:
   serviceUrl:
     defaultZone: http://192.89.89.111:6782/eureka/
server.port: 9999
spring.application.name: order
db.url: 192.168.0.100

Π’ malipo:

eureka:
 instance.preferIpAddress: true
 client:
   serviceUrl:
     defaultZone: http://192.89.89.111:6782/eureka/
server.port: 9998
spring.application.name: payments
db.url: 192.168.0.100

Tatizo kuu na usanidi huu ni kuwepo kwa kiasi kikubwa cha nakala-kuweka katika mipangilio ya huduma. Wacha tuone jinsi mfumo utasaidia kuiondoa. Hebu tuanze na dhahiri zaidi - uwepo wa usanidi eureka katika maelezo ya kila microservice. Wacha tuunde saraka mpya na faili ya mipangilio na tuongeze usanidi mpya kwake:

Dhibiti usanidi wa huduma ndogo kwa urahisi ukitumia microconfig.io

Na sasa hebu tuongeze mstari kwa kila moja ya miradi yetu #pamoja na eureka.

Mfumo huo utapata kiotomati usanidi wa eureka na kuinakili kwa faili za usanidi wa huduma, wakati usanidi tofauti wa eureka hautaundwa, kwani hatutaitaja kwenye faili ya mazingira. dev.yaml. Huduma ili:

#include eureka
server.port: 9999
spring.application.name: order
db.url: 192.168.0.100

Tunaweza pia kusogeza mipangilio ya hifadhidata katika usanidi tofauti kwa kubadilisha laini ya kuingiza hadi #pamoja na eureka, oracle.

Inafaa kumbuka kuwa mfumo unafuatilia kila mabadiliko wakati wa kuunda tena faili za usanidi na kuziweka kwenye faili maalum karibu na faili kuu ya usanidi. Ingizo katika logi yake inaonekana kama hii: "Mali iliyohifadhiwa inabadilika kuwa order/diff-application.yaml" Hii inakuwezesha kutambua haraka mabadiliko kwenye faili kubwa za usanidi.

Kuondoa sehemu za kawaida za usanidi hukuruhusu kuondoa nakala nyingi zisizohitajika, lakini hukuruhusu kuunda usanidi wa mazingira tofauti - mwisho wa huduma zetu ni za kipekee na zilizowekwa ngumu, hii ni mbaya. Hebu jaribu kuondoa hii.

Suluhisho zuri litakuwa kuweka miisho yote katika usanidi mmoja ambao wengine wanaweza kurejelea. Kwa madhumuni haya, usaidizi kwa vishika nafasi umeanzishwa kwenye mfumo. Hivi ndivyo faili ya usanidi itabadilika eureka:

 client:
   serviceUrl:
     defaultZone: http://${endpoints@eurekaip}:6782/eureka/

Sasa hebu tuone jinsi kishika nafasi hiki kinavyofanya kazi. Mfumo hupata sehemu inayoitwa endpoints na kutafuta maana ndani yake eurekaip, na kisha kuibadilisha katika usanidi wetu. Lakini vipi kuhusu mazingira tofauti? Ili kufanya hivyo, tengeneza faili ya mipangilio endpoints aina ifuatayo application.dev.yaml. Mfumo kwa kujitegemea, kulingana na kiendelezi cha faili, huamua ni mazingira gani ya usanidi huu na kuipakia:

Dhibiti usanidi wa huduma ndogo kwa urahisi ukitumia microconfig.io

Yaliyomo kwenye faili ya Dev:

eurekaip: 192.89.89.111
dbip: 192.168.0.100

Tunaweza kuunda usanidi sawa wa bandari za huduma zetu:

server.port: ${ports@order}.

Mipangilio yote muhimu iko katika sehemu moja, na hivyo kupunguza uwezekano wa makosa kwa sababu ya vigezo vilivyotawanyika katika faili za usanidi.

Mfumo hutoa vishikilia nafasi vingi vilivyotengenezwa tayari, kwa mfano, unaweza kupata jina la saraka ambayo faili ya usanidi iko na kuikabidhi:

#include eureka, oracle
server.port: ${ports@order}
spring.application.name: ${this@name}

Shukrani kwa hili, hakuna haja ya kuongeza jina la maombi katika usanidi na inaweza pia kuwekwa kwenye moduli ya kawaida, kwa mfano, katika eureka sawa:

client:
   serviceUrl:
     defaultZone: http://${endpoints@eurekaip}:6782/eureka/
 spring.application.name: ${this@name}

Faili ya usanidi ili itapunguzwa kwa mstari mmoja:

#include eureka, oracle
server.port: ${ports@order}

Ikiwa hatuhitaji mpangilio wowote kutoka kwa usanidi wa mzazi, tunaweza kuubainisha katika usanidi wetu na utatumika wakati wa utayarishaji. Hiyo ni, ikiwa kwa sababu fulani tunahitaji jina la kipekee kwa huduma ya utaratibu, tutaacha tu parameter spring.application.jina.

Wacha tuseme unahitaji kuongeza mipangilio maalum ya ukataji kwenye huduma, ambayo imehifadhiwa kwenye faili tofauti, kwa mfano, logback.xml. Wacha tuunde kikundi tofauti cha mipangilio yake:

Dhibiti usanidi wa huduma ndogo kwa urahisi ukitumia microconfig.io

Katika usanidi wa kimsingi, tutaambia mfumo mahali pa kuweka faili ya mipangilio ya kumbukumbu tunayohitaji kwa kutumia kishikilia nafasi. @ConfigDir:

microconfig.template.logback.fromFile: ${logback@configDir}/logback.xml

Katika faili logback.xml tunasanidi viambatanisho vya kawaida, ambavyo vinaweza pia kuwa na vishikilia nafasi ambavyo mfumo utabadilika wakati wa uundaji wa usanidi, kwa mfano:

<file>logs/${this@name}.log</file>

Kwa kuongeza uagizaji kwa usanidi wa huduma kurudi nyuma, tunapata ukataji miti uliosanidiwa kiotomatiki kwa kila huduma:

#include eureka, oracle, logback
server.port: ${ports@order}

Ni wakati wa kufahamiana kwa undani zaidi na vishikilia nafasi vyote vinavyopatikana vya mfumo:

${this@env} - inarudi jina la mazingira ya sasa.
${...@name} - inarudisha jina la sehemu.
${...@configDir} - inarudisha njia kamili kwenye saraka ya usanidi wa sehemu.
${…@resultDir} - inarudisha njia kamili kwenye saraka ya marudio ya sehemu (faili zitakazopatikana zitawekwa kwenye saraka hii).
${this@configRoot} - inarudisha njia kamili kwenye saraka ya mizizi ya duka la usanidi.

Mfumo pia hukuruhusu kupata anuwai za mazingira, kwa mfano njia ya java:
${env@JAVA_HOME}
Ama, kwa kuwa mfumo umeandikwa ndani JAVA, tunaweza kupata vigezo vya mfumo sawa na simu Mfumo::getProperty kwa kutumia muundo kama huu:
${[barua pepe inalindwa]}
Inafaa kutaja msaada kwa lugha ya ugani Spring EL. Maneno yafuatayo yanatumika katika usanidi:

connection.timeoutInMs: #{5 * 60 * 1000}
datasource.maximum-pool-size: #{${[email protected]} + 10} 

na unaweza kutumia anuwai za kawaida katika faili za usanidi kwa kutumia usemi #var:

#var feedRoot: ${[email protected]}/feed
folder:
 root: ${this@feedRoot}
 success: ${this@feedRoot}/archive
 error: ${this@feedRoot}/error

Kwa hivyo, mfumo ni zana yenye nguvu ya kurekebisha vizuri na usanidi rahisi wa huduma ndogo. Mfumo huo unatimiza kikamilifu kazi yake kuu - kuondoa nakala-kuweka katika mipangilio, kuunganisha mipangilio na, kwa sababu hiyo, kupunguza makosa iwezekanavyo, huku kuruhusu kuchanganya kwa urahisi usanidi na kubadilisha kwa mazingira tofauti.

Ikiwa una nia ya mfumo huu, napendekeza kutembelea ukurasa wake rasmi na kufahamiana na kamili nyaraka, au kuchimba kwenye vyanzo hapa.

Chanzo: mapenzi.com

Kuongeza maoni