Ăks peamisi probleeme mikroteenuste vĂ€ljatöötamisel ja edasises kasutamises on nende instantside korralik ja hoolikas seadistamine. Arvan, et uue raamistikuga saab sellel osas palju aidata. . See vĂ”imaldab ĂŒsna elegantselt lahendada mĂ”ned rakenduste seadistamise rutiinsed ĂŒlesanded.
Kui teil on palju mikroteenuseid, millest igaĂŒhel on oma seadistusefailid, on vĂ€ga suur tĂ”enĂ€osus, et teete ĂŒhes neist vea, mida ilma piisava oskuse ja logimisĂŒsteemita vĂ”ib olla vĂ€ga keeruline avastada. Raamistiku peamine ĂŒlesanne on vĂ€hendada instantsi seadistuse dubleerivate parameetrite arvu, vĂ€hendades seelĂ€bi vea lisamise tĂ”enĂ€osust.
Vaatame nĂ€itena. Oletame, et meil on lihtne rakendus koos konfiguratsioonifailiga yaml. See vĂ”ib olla ĂŒkskĂ”ik milline mikroteenus, mis on kirjutatud mis tahes keeles. Vaatame, kuidas saab seda raamistikku rakendada sellele teenusele.
Kuid kĂ”igepealt loome Idea IDE-s tĂŒhja projekti, pĂ€rast microconfig.io plugina paigaldamist:

Seame plugina kĂ€ivitamise konfiguratsiooni, saab kasutada vaike konfiguratsiooni, nagu ĂŒlaltoodud ekraanipildil.
Meie teenus nimega order, siis loome uues projektis sarnase struktuuri:

Seadmega nimega kaustas asetame konfiguratsioonifaili â application.yaml. KĂ”ik mikroteenused kĂ€ivitatakse mingis keskkonnas, seega lisaks teenuse enda konfiguratsioonifaili loomisele on vaja kirjeldada keskkonda: selleks loome kausta envs ja lisame sinna faili, mille nimi on meie töö keskkonna nimi. Nii loob raamistik konfiguratsioonifaile teenustele keskkonnas dev, kuna plugina seadetes on mÀÀratud just see parameeter.
Faili struktuur dev.yaml oleks ĂŒsna lihtne:
mainorder:
components:
- orderRaamistik töötab seadistustega, mis on ĂŒhendatud rĂŒhmadeks. Meie teenuse jaoks valime grupi nime mainorder. Raamistik leiab iga sellise rakenduste grupi keskkonna failist ja loob neile konfiguratsioonid, mis asuvad vastavates kaustades.
Oma teenuse seadistusfailis order mĂ€rkime esialgu ainult ĂŒhe parameetri:
spring.application.name: orderNĂŒĂŒd kĂ€ivitame plugina ja see genereerib meie teenuse vajalikud konfiguratsioonid esitatud teede pĂ”hjal:

Saame ja ilma plugina installimist, lihtsalt laadides alla raamistikku ja kÀivitades seda kÀsurealt.
Selline lahendus sobib ehitusserverile kasutamiseks.
Tuleb mĂ€rkida, et raamistik mĂ”istab suurepĂ€raselt property sĂŒntaksit, mis tĂ€hendab tavalisi property faile, mida saab koos kasutada yaml konfiguratsioonidega.
Lisame veel ĂŒhe teenuse payment ja keerukaks olemasolevat.
Uues order:
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.100Uues payment:
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.100Peamine probleem nende konfiguratsioonide juures on suur hulk kopeerimist ja kleepimist teenuste seadetes. Vaatame, kuidas raamistik aitab selle probleemiga toime tulla. Alustame kÔige ilmsemast - konfiguratsiooni olemasolust eureka iga mikroteenuse kirjelduse juures. Loome uue katalooge seadistusfailiga ja lisame sinna uue konfiguratsiooni:

Ja iga meie projekti lisame nĂŒĂŒd rea #include eureka.
Raamistik leiab automaatselt konfiguratsiooni eureka ja kopeerib selle teenuste konfiguratsioonifailidesse, samas eraldi konfiguratsiooni eureka ei luleta, kuna me ei nÀita seda keskkonna failis. dev.yaml. Teenus order:
#include eureka
server.port: 9999
spring.application.name: order
db.url: 192.168.0.100Samuti saame andmebaasi seadistused vÀlja tuua eraldi konfiguratsiooni, muutes impordi rea #include eureka, oracle.
Tuleb mĂ€rkida, et iga muudatuse korral jĂ€lgib raamistik konfiguratsioonifailide regeneratsiooni ja paneb need peamise seadistuse faili kĂ”rvale eraldi faili. Logis nĂ€eb kirje vĂ€lja selline: âSalvestati 1 atribuut muudatus order/diff-application.yamlâ. See vĂ”imaldab kiiresti avastada muudatusi suurtes konfiguratsioonifailides.
Ăldiste konfiguratsiooniosade vĂ€lja toomine vĂ”imaldab vabaneda suurest hulgast tarbetust kopeerimisest, kuid ei vĂ”imalda paindlikult luua konfiguratsiooni erinevate keskkondade jaoks - meie teenuste lĂ”pp-punktid on ainsad ja kĂ”vasti kodeeritud, see on halb. Proovime seda eemaldada.
Hea lahendus oleks hoida kĂ”ik lĂ”pp-punktid ĂŒhes ainus konfiguratsioonis, millele saaksid viidata teised. Selle jaoks on raamistikku integreeritud plaanide toe. Nii muutub konfiguratsioonifail eureka:
client:
serviceUrl:
defaultZone: http://${endpoints@eurekaip}:6782/eureka/NĂŒĂŒd vaatame, kuidas see plaan toimib. SĂŒsteem leiab komponendi nimega endpoints ja otsib sellest vÀÀrtust eurekaip, see, it inserts into our configuration. But how to deal with different environments? To address this, we'll create a settings file in endpoints the following format application.dev.yaml. The framework automatically decides which environment this configuration belongs to based on the file extension and loads it:

Contents of the dev file:
eurekaip: 192.89.89.111
dbip: 192.168.0.100We can create the same configuration for the ports of our services:
server.port: ${ports@order}.All important settings are located in one place, thus reducing the likelihood of errors due to scattered parameters across configuration files.
The framework provides many ready-made placeholders, for example, you can get the name of the directory where the configuration file is located and assign it:
#include eureka, oracle
server.port: ${ports@order}
spring.application.name: ${this@name}As a result, there's no need to specify the application name in the configuration, and it can also be extracted into a common module, for example, into Eureka itself:
client:
serviceUrl:
defaultZone: http://${endpoints@eurekaip}:6782/eureka/
spring.application.name: ${this@name}The configuration file order will be reduced to one line:
#include eureka, oracle
server.port: ${ports@order}If any setting from the parent configuration is not needed, we can specify it in our configuration, and that will be applied during generation. That is, if for some reason we need a unique name for the order service, we simply leave the parameter spring.application.name.
Let's say we need to add customized logging settings, which are stored in a separate file, for example, logback.xml. We'll create a separate group of settings for it:

In the basic configuration, we will specify to the framework where to place the necessary logging settings file using the placeholder @ConfigDir:
microconfig.template.logback.fromFile: ${logback@configDir}/logback.xmlFailis logback.xml Configuring standard appenders, which can also contain placeholders, which the framework will replace during config generation, for example:
logs/${this@name}.logBy adding imports in the configuration of services logback, we automatically get configured logging for each service:
#include eureka, oracle, logback
server.port: ${ports@order}It's time to learn more about all available placeholders in the framework:
${this@env} â returns the name of the current environment.
${âŠ@name} â returns the name of the component.
${âŠ@configDir} â returns the full path to the config directory of the component.
${âŠ@resultDir} â tagastab tĂ€ispika tee sihtkausta (saadud failid paigutatakse sellesse kausta).
${this@configRoot} â tagastab tĂ€ispika tee konfiguratsioonide salvestuskausta.
SĂŒsteem vĂ”imaldab ka saada keskkonnamuutujate, nĂ€iteks java tee:
${env@JAVA_HOME}
VĂ”i, kuna raamistik on kirjutatud JAVA, saame saada sĂŒsteemi muutujad sarnaste kĂ”nede abil System::getProperty kasutades sellist konstruktsiooni:
${system@os.name}
Tasub mainida laienduskeele toetust Spring EL. Konfiguratsioonis kehtivad sarnased vÀljendid:
connection.timeoutInMs: #{5 * 60 * 1000}
datasource.maximum-pool-size: #{${this@datasource.minimum-pool-size} + 10} ja kohalikke muutujaid saab kasutada konfiguratsioonifailides vÀljendi kaudu. #var:
#var feedRoot: ${system@user.home}/feed
folder:
root: ${this@feedRoot}
success: ${this@feedRoot}/archive
error: ${this@feedRoot}/errorNii et raamistik on ĂŒsna vĂ”imas tööriist mikroteenuste konfiguratsioonide peenus ja paindlikkus. Raamistik tĂ€idab oma pĂ”hifunktsiooni hĂ€sti â taandab kopeerimist konfiguratsioonides, konsolideerib seadeid ja vĂ€hendab seelĂ€bi vĂ”imalikke vigu, vĂ”imaldades samal ajal lihtsat kombinatsiooni ja kohandamist erinevatesse keskkondadesse.
Kui see raamistik teid huvitab, soovitan kĂŒlastada selle ametlikku lehte ja tutvuda tĂ€ieliku , vĂ”i kaevuda allikakoode. .
Allikas: habr.com
