JavaRush /Java Blog /Random-TK /Java mikroservisleri üçin gollanma. 1-nji bölüm: Mikroser...

Java mikroservisleri üçin gollanma. 1-nji bölüm: Mikroservis esaslary we arhitektura

Toparda çap edildi
Bu gollanmada, Java mikroservisleriniň nämedigini, olary dizaýn etmegiň we döretmegiň usullaryny öwrenersiňiz. Şeýle hem, Java mikroservis kitaphanalary we mikroservisleri ulanmagyň mümkinçiligi baradaky soraglary öz içine alýar. Java mikroservisleriniň terjimesi we uýgunlaşmagy : Amaly gollanma .

Java mikroservisleri: esaslar

Mikroservislere düşünmek üçin ilki bilen olaryň nämedigini kesgitlemeli. "Monolit" dälmi - Java monolit: bu näme we artykmaçlyklary ýa-da kemçilikleri näme? Java mikroservisleri üçin gollanma.  1-nji bölüm: Mikroservis esaslary we arhitektura - 1

Java monolit näme?

Bankda ýa-da fintech başlangyjy üçin işleýändigiňizi göz öňüne getiriň. Ulanyjylara täze bank hasaby açmak üçin ulanyp boljak ykjam programma üpjün edýärsiňiz. Java kodunda bu gözegçilik ediji synpyň bolmagyna getirer. Plönekeýleşdirilen ýaly:
@Controller
class BankController {

    @PostMapping("/users/register")
    public void register(RegistrationForm form) {
        validate(form);
        riskCheck(form);
        openBankAccount(form);
        // etc..
    }
}
Gözegçi gerek:
  1. Hasaba alyş blankasyny tassyklady.
  2. Bank hasaby bilen üpjün etmek ýa-da bermezlik barada ulanyjynyň salgysynyň töwekgelçiligini barlady.
  3. Bank hasaby açdy.
Synp BankController, beýleki çeşmeleriňiz bilen bilelikde bank.jar ýa-da bank.war faýlyna ýerleşdiriler - bu bankyňyzy dolandyrmak üçin zerur bolan ähli kodlary öz içine alýan gowy köne monolit. Takmynan çaklama hökmünde .jar (ýa-da .war) faýlyň başlangyç ululygy 1-den 100 MB aralygynda bolar. Indi .jar faýlyny serweriňizde işledip bilersiňiz ... we Java programmaňyzy ýerleşdirmek üçin etmeli zadyňyz. Java mikroservisleri üçin gollanma.  1-nji bölüm: Mikroservis esaslary we arhitektura - 2Surat, ýokarky çep gönüburçluk: mono (litiki) bank java -jar bank.jar (cp .war / .ear programma üpjünçiligine) ýerleşdirmek. Sag gönüburçluk: açyk brauzer.

Java monolitlerinde näme problema bar?

Java monolitlerinde düýbünden ýalňyşlyk ýok. Şeýle-de bolsa, taslamaňyzda bolsa, tejribe görkezdi:
  • Köp programmistler / toparlar / geňeşçiler işleýär ...
  • ... gaty düşnüksiz talaplary bolan müşderileriň basyşy astynda şol bir monolitden ...
  • bir-iki ýylyň içinde ...
... onsoň bu ýagdaýda kiçi bank.jar faýlyňyz ägirt uly gigabaýt koda öwrülýär, hatda ýakynlaşmak hem gorkunç, ýerleşdirmesin.

Java monolitiniň ululygyny nädip azaltmaly?

Tebigy sorag ýüze çykýar: monoliti nädip kiçeltmeli? Häzirki wagtda bank.jar bir JVM-de, bir serwerde bir amal işleýär. Indi ýok, az däl. Häzirki wagtda logiki pikir kelläme gelip biler: “risköne töwekgelçiligi barlamak hyzmatyny kompaniýamdaky beýleki bölümler ulanyp biler! Bu meniň monolit bank programmam bilen gönüden-göni baglanyşykly däl! Belki monolitden kesilip, aýratyn önüm hökmünde ýerleşdirilmelidir? Technagny, tehniki taýdan aýdanymyzda, ony aýratyn Java prosesi hökmünde işlediň. ”

Java mikroservisi näme?

Iş ýüzünde bu jümle indi usul jaňynyň riskCheck()BankController-den edilmejekdigini aňladýar: bu usul ýa-da ähli kömekçi synplary bolan noýba komponenti öz Maven ýa-da Gradle taslamasyna geçiriler. Şeýle hem, bank monolitine garaşsyz ýerleşdiriler we wersiýa gözegçiligi astynda ýerleşdiriler. Şeýle-de bolsa, bu çykarmak prosesi täze RiskCheck modulyňyzy mikroservise öwürmeýär, sebäbi mikroservisiň kesgitlemesi açyk. Bu toparlaryň we kompaniýalaryň arasynda ýygy-ýygydan diskussiýalara sebäp bolýar.
  • Taslama mikro-da 5-7 synp barmy ýa-da näme?
  • 100 ýa-da 1000 synp ... henizem mikro?
  • Mikroservis, köplenç synplaryň sany bilen baglanyşyklymy ýa-da ýok?
Nazary pikirlenmäni yzda goýalyň we ýerine pragmatiki pikirlere ýapyşalyň we muny ýerine ýetireliň:
  1. Ululygyna ýa-da domen araçäklerine garamazdan, aýratyn ýerleşdirilen hyzmatlaryň mikroservislerine jaň edeliň.
  2. Serwis aragatnaşygyny nädip tertipleşdirmelidigi barada pikir edeliň. Mikroservislerimiz biri-biri bilen aragatnaşyk saklamagyň ýollaryna mätäç.
Şeýlelik bilen, jemläp aýtsak: ozal sizde bir JVM prosesi bardy, banky dolandyrmak üçin berk monolit. Indi sizde bank monolit JVM prosesi we öz JVM prosesinde işleýän aýratyn RiskCheck mikroservisi bar. Indi töwekgelçilikleri barlamak üçin monolitiňiz bu mikroservise jaň etmeli. Muny nädip etmeli?

Java mikroservisleriniň arasynda aragatnaşygy nädip ýola goýmaly?

Umuman we umuman, iki wariant bar - sinhron we asynkron aragatnaşyk.

Sinhron aragatnaşyk: (HTTP) / REST

Adatça, mikroservisleriň arasynda sinhron aragatnaşygy, XML ýa-da JSON-y yzyna gaýtarýan HTTP we REST ýaly hyzmatlar arkaly ýüze çykýar. Elbetde, başga wariantlar hem bolup biler - iň bolmanda Google Protocol Buferlerini alyň . Derrew jogap gerek bolsa, REST aragatnaşygyny ulanmak has gowudyr. Mysalymyzda, edil şu edilmeli zat, sebäbi hasap açmazdan ozal töwekgelçiligi barlamak zerur. Töwekgelçiligi barlamak ýok bolsa, hasap ýok. Aşakdaky gurallary, “ Sinhron Java REST jaňlary üçin haýsy kitaphanalar iň gowusy ” bölüminde ara alyp maslahatlaşarys .

Habarlaşma - Asynkron aragatnaşyk

Asynkron mikroservis aragatnaşygy, adatça JMS ýerine ýetirilmegi bilen habar alyşmak we / ýa-da AMQP ýaly protokol ulanmak arkaly amala aşyrylýar . Bir sebäbe görä bu ýerde "adatça" ýazdyk: geliň, e-poçta / SMTP integrasiýasynyň sanyna kembaha garap bolmaz. Gyssagly jogap gerek däl wagty ulanyň. Mysal üçin, ulanyjy “Häzir satyn al” düwmesine basýar, siz bolsa öz gezeginde hasap-faktura döretmek isleýärsiňiz. Bu amal, elbetde, ulanyjynyň satyn almak haýyşyna jogap siklinde bolup geçmeli däldir. Aşakda asynkron Java habarlaşma üçin haýsy gurallaryň iň amatlydygyny düşündireris .

Mysal: Java-da REST API jaňy

Sinhron mikroservis aragatnaşygyny saýlaýarys diýip pikir edeliň. Bu ýagdaýda pes derejedäki Java kodumyz (ýokarda hödürlän kodumyz) şuňa meňzeýär. (bu ýerde pes derejede, mikroservis aragatnaşygy üçin müşderi kitaphanalarynyň adatça hakyky HTTP jaňlaryndan abstrakt döredilýändigini aňladýarys).
@Controller
class BankController {

    @Autowired
    private HttpClient httpClient;

    @PostMapping("/users/register")
    public void register(RegistrationForm form) {
        validate(form);
        httpClient.send(riskRequest, responseHandler());
        setupAccount(form);
        // etc..
    }
}
Kod esasynda indi iki sany Java (mikro) hyzmaty, Bank we RiskCheck ýerleşdirmelidigimiz belli bolýar. Netijede, iki sany JVM prosesi işleýär. Java mikroservisleri üçin gollanma.  1-nji bölüm: Mikroservis esaslary we arhitektura - 3Java mikroservis taslamasyny ösdürmek üçin zerur zat: diňe bir monolit däl-de, has kiçi bölekleri (.jar ýa-da .war faýllaryny) guruň we ýerleşdiriň. Soragyň jogaby düşnüksiz bolup galýar: monoliti mikroservislere nädip kesmeli? Bu bölekler näçe kiçi bolmaly, dogry ululygyny nädip kesgitlemeli? Barlap göreliň.

Java mikroservis arhitekturasy

Iş ýüzünde kompaniýalar mikroservis taslamalaryny dürli usullar bilen ösdürýärler. Bu çemeleşme, bar bolan monoliti mikroservis taslamasyna öwürmäge synanyşýandygyňyza ýa-da taslamany noldan başlajakdygyňyza baglydyr.

Monolitden mikroservislere çenli

Iň logiki pikirleriň biri, bar bolan monolitden mikroservisleri çykarmakdyr. Üns beriň, bu ýerdäki "mikro" prefiksi aslynda alnan hyzmatlaryň hakykatdanam az boljakdygyny aňlatmaýar, bu hökman beýle däldir. Nazary esaslara seredeliň.

Pikir: monoliti mikroservislere bölüň

Miras taslamalaryna mikroservis çemeleşmesi ulanylyp bilner. Şol sebäpli:
  1. Köplenç şeýle taslamalary goldamak / üýtgetmek / giňeltmek kyn.
  2. Döredijilerden başlap dolandyryşa çenli her kim ýönekeýleşdirmek isleýär.
  3. Programma üpjünçiligiňiziň näme etmelidigini anyk bilýändigiňizi aňladýan domen araçäkleri bar.
Mysalymyza gaýdyp gelsek, bu Java bank monolitiňize seredip, ony domen çäklerinden çykarmaga synanyşyp bilersiňiz.
  • Şeýlelik bilen, ulanyjy maglumatlarynyň gaýtadan işlenişini (atlar, salgylar, telefon belgileri ýaly) aýratyn hasap hyzmatyny “Hasap dolandyryşy” diýip bölmek ýerlikli bolar.
  • Ora-da ulanyjynyň töwekgelçilik derejesini barlaýan we beýleki köp sanly taslama ýa-da kompaniýanyň bölümleri tarapyndan ulanylyp bilinýän ýokarda agzalan "Töwekgelçilik barlaýjy moduly".
  • PDFa-da hasap-fakturalary PDF formatda ýa-da poçta bilen iberýän hasap-faktura moduly.

Bir ideýanyň durmuşa geçirilmegi: başga biri etsin

Aboveokarda beýan edilen çemeleşme kagyz we UML ýaly diagrammalarda ajaýyp görünýär. Emma, ​​hemme zat beýle bir ýönekeý däl. Ony amaly ýerine ýetirmek çynlakaý tehniki taýýarlygy talap edýär: monolitden nämäni çykaryp boljakdygyna düşünmegimiz bilen gazyp almak prosesiniň arasyndaky boşluk gaty uludyr. Kärhana taslamalarynyň köpüsi, döredijileriň 7 ýyllyk “Hibernate” wersiýasyny täzesine täzelemekden gorkýan derejesine ýetýärler. Kitaphanalar hem onuň bilen täzelener, ýöne bir zady döwmek üçin hakyky howp bar. Şeýlelik bilen, şol bir döredijiler indi maglumatlar bazasynyň amal çäkleri bilen gadymy miras koduny gözlemeli we gowy kesgitlenen mikroservisleri çykarmalymy? Bu mesele köplenç çylşyrymly we tagtada ýa-da binagärlik ýygnaklarynda “çözülip bilinmez”. Java mikroservisleri üçin gollanma.  1-nji bölüm: Mikroservis esaslary we arhitektura - 4Twitter döredijisi @simonbrown-dan sitat getirmek üçin: Muny gaýtalap aýdaryn ... adamlar monolitleri dogry gurup bilmese, mikroservisler kömek etmez. Simon Brown

Mikroservis arhitekturasyna esaslanan taslama

Täze “Java” taslamalarynda öňki bölümdäki üç sanly nokat birneme üýtgeşik görünýär:
  1. Arassa şifer bilen başlaýarsyňyz, şonuň üçin saklamak üçin “goşlar” ýok.
  2. Işläp düzüjiler geljekde ýönekeý zatlary saklamak isleýärler.
  3. Mesele: Domen araçäkleriniň has çylşyrymly suraty bar: programma üpjünçiligiňiziň aslynda näme etmelidigini bilmeýärsiňiz (yşarat: çeýel;))
Bu, Java mikroservisleri bilen täze taslamalary synap görýän kompaniýalara sebäp bolýar.

Tehniki mikroservis arhitekturasy

Birinji nokat döredijiler üçin iň düşnükli ýaly bolup görünýär, ýöne muny berk pese gaçyrýanlaram bar. Hadi Hariri “IntelliJ” -de “Extract Microservice” gaýtadan işlemegi maslahat berýär. Aşakdaky mysal gaty ýönekeýleşdirilen hem bolsa, gynansak-da, hakyky taslamalarda ýerine ýetirilen işler ondan uzaklaşmaýar. Mikroservislerden öň
@Service
class UserService {

    public void register(User user) {
        String email = user.getEmail();
        String username =  email.substring(0, email.indexOf("@"));
        // ...
    }
}
Substring Java mikroservisi bilen
@Service
class UserService {

    @Autowired
    private HttpClient client;

    public void register(User user) {
        String email = user.getEmail();
        //теперь вызываем substring microservice via http
        String username =  httpClient.send(substringRequest(email), responseHandler());
        // ...
    }
}
Şeýlelik bilen, Java sebäbini jaňy HTTP jaňyna baglaýarsyňyz, hiç hili sebäpsiz. Muňa garamazdan, munuň bir sebäbi: tejribäniň ýoklugy we Java mikroservis çemeleşmesini mejbur etmek. Teklip: Muny etme.

Iş akymyna gönükdirilen mikroservis arhitekturasy

Indiki umumy çemeleşme, Java mikroservislerini iş akymyna esaslanýan modullara bölmekdir. Hakyky durmuş mysaly: Germaniýada (köpçülige) lukmanyň ýanyna baranyňyzda, saparyňyzy lukmançylyk CRM ulgamynda ýazmaly. Insurancetiýaçlandyryşdan töleg almak üçin, bejergiňiz (we beýleki näsaglaryň bejergisi) barada maglumatlary XML arkaly araçy iberer. Dellal bu XML faýlyna sereder we (ýönekeýleşdirilen):
  1. Dogry XML faýlynyň alnandygyny ýa-da ýokdugyny barlar.
  2. Bu proseduralaryň dogrudygyny barlar: ginekolog lukmanyndan bir günde üç diş arassalamak prosedurasyny alan bir ýaşly çaga birneme şübheli görünýär.
  3. XML-i käbir beýleki býurokratik maglumatlar bilen birleşdirer.
  4. Tölegleri başlamak üçin XML faýlyny ätiýaçlandyryş kompaniýasyna iberer.
  5. Netijäni lukmana iberer, oňa "üstünlik" ýa-da "bu ýazgyny manyly bolansoň täzeden iberiň".
Bellik. Bu mysalda, mikroservisleriň arasyndaky aragatnaşyk rol oýnamaýar, ýöne habar dellaly (meselem, RabbitMQ) asynkron görnüşde edilip bilner, sebäbi lukman haýsydyr bir jogap almaýar. Java mikroservisleri üçin gollanma.  1-nji bölüm: Mikroservis esaslary we arhitektura - 5Againene-de bu kagyz ýüzünde gaty gowy görünýär, ýöne tebigy soraglar ýüze çykýar:
  • Bir XML faýly gaýtadan işlemek üçin alty programma ýerleşdirmek zerurmy?
  • Bu mikroservisler hakykatdanam biri-birine garaşlymy? Biri-birine garaşsyz ýerleşdirip bolarmy? Dürli wersiýalary we API shemalary bilen?
  • Barlag mikroservisi işlemese, ygtybarly mikroservis näme eder? Ulgam henizem işleýärmi?
  • Bu mikroservisler şol bir maglumat bazasyny paýlaşýarmy (elbetde DB tablisalarynda käbir umumy maglumatlar gerek) ýa-da hersiniň özleri barmy?
  • ... we başga-da köp zatlar.
Gyzykly tarapy, ýokardaky diagramma has ýönekeý görünýär, sebäbi indi her hyzmatyň öz takyk, kesgitlenen maksady bar. Öň bu gorkunç monolit ýaly bir zat görünýärdi: Java mikroservisleri üçin gollanma.  1-nji bölüm: Mikroservis esaslary we arhitektura - 6Bu diagrammalaryň ýönekeýligi barada jedel edip bilersiňiz, indi bu goşmaça amaly kynçylyklary hökman çözmeli bolarsyňyz.
  • Diňe bir programmany ýerleşdirmek hökman däl, azyndan alty.
  • Hatda mikroservis arhitekturasyna näçe girmek isleýändigiňize baglylykda birnäçe maglumat bazasyny ýerleşdirmeli bolmagyňyz mümkin.
  • Her ulgamyň onlaýn we dogry işleýändigine göz ýetirmeli.
  • Mikroservisleriň arasyndaky jaňlaryňyzyň hakykatdanam çydamlydygyna göz ýetirmeli (Java mikroservisini nädip çydamly edip bilersiňiz?).
  • Bu sazlamanyň göz öňünde tutýan beýleki zatlary - ýerli ösüş sazlamalaryndan başlap integrasiýa synagyna çenli.
Şonuň üçin maslahat şeýle bolar:
  • Netflix däl bolsaňyz (ähtimal, Netflix dälsiňiz) ...
  • Ösüş gurşawyny açýan we gaty güýçli iş ukybyňyz bolmasa, 5 sekuntda aňsatlyk bilen dikeldilýän önümçilik maglumatlar bazasyny taşlaýan bulam-bujar maýmyn döredýär.
  • ýa-da özüňizi @monzo ýaly duýýarsyňyz we mümkin boldugyça 1500 mikroservisi synap görmek isleýärsiňiz.
This Muny etme. Indi bolsa giperboliki däl. Domen araçäklerinden mikroservisleri modelirlemäge synanyşmak gaty ýerlikli bolup görünýär. Thatöne bu, bir iş prosesini alyp, ony ownuk böleklere bölmek zerurlygyny aňlatmaýar (XML alyň, XML tassyklaň, XML öňe sürüň). Şonuň üçin, haçan-da Java mikroservisleri bilen täze bir taslama başlasaňyz we domen araçäkleri henizem düşnüksiz bolsa, mikroservisleriňiziň göwrümini pes derejede saklamaga synanyşyň. Soňra has köp modul goşup bilersiňiz. Täze infrastrukturany goldamak üçin topar / kompaniýa / bölümde öňdebaryjy DevOps-yň bardygyna göz ýetiriň.

Poliglot ýa-da topara gönükdirilen mikroservis arhitekturasy

Mikroservisleri ösdürmäge üçünji, liberal diýen ýaly çemeleşme bar: toparlara ýa-da hatda adamlara islendik dil ýa-da mikroservis ulanyp ulanyjy hekaýalaryny durmuşa geçirmäge mümkinçilik bermek (marketologlar bu çemeleşmäni “poliglot programmirleme” diýip atlandyrýarlar). Şeýlelik bilen, ýokarda beýan edilen XML tassyklama hyzmaty Java-da ýazylyp bilner, şol bir wagtyň özünde tassyklama mikroservisi Haskellde (matematiki taýdan dogry bolmagy üçin) ýazylyp bilner. Thetiýaçlandyryş ugrukdyryjy mikroservis üçin Erlang ulanyp bilersiňiz (sebäbi hakykatdanam ulalmaly;)). Öndürijiniň nukdaýnazaryndan gyzykly bolup görünýän zat (izolirlenen gurşawda kämil diliňiz bilen ajaýyp ulgamy ösdürmek) aslynda guramanyň islän zady däl: birmeňzeşleşmek we standartlaşdyrmak. Bu, beýleki işläp düzüjileriň geljekde has ýaşyl öri meýdanlaryna geçeniňizde Haskell mikroservisiňizi goldamagyny dowam etdirmegi üçin birneme standartlaşdyrylan dilleriň, kitaphanalaryň we gurallaryň toplumyny aňladýar. Java mikroservisleri üçin gollanma.  1-nji bölüm: Mikroservis esaslary we arhitektura - 8Taryh, standartlaşdyrmagyň adatça gaty çuňňur ornaşýandygyny görkezýär. Mysal üçin, “Fortune 500” iri kompaniýalaryny döredijiler käwagt “Baharyň” tehnologiýa ýol kartasynyň bir bölegi däldigi sebäpli Bahary ulanmaga-da rugsat berilmedi. Şeýle-de bolsa, poliglot çemeleşmesine doly geçiş, şol bir teňňäniň beýleki tarapy diýen ýaly bir zat. Teklip: Poliglot programmirlemegi ulanjak bolsaňyz, şol bir programmirleme diliniň ekosistemasynda az dürlüligi synap görüň. Şeýlelik bilen, Kotlin bilen Java-ny bilelikde ulanmak has gowudyr (iki dil hem JVM esaslanýar we biri-biri bilen 100% gabat gelýär), Java we Haskell däl-de, has gowudyr. Indiki bölümde Java mikroservislerini ýerleşdirmek we synagdan geçirmek barada öwrenersiňiz.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION