JavaRush /Блоги Java /Random-TG /Дастур оид ба Microservices Java. Қисми 1: Асосҳои Micros...

Дастур оид ба Microservices Java. Қисми 1: Асосҳои Microservices ва меъморӣ

Дар гурӯҳ нашр шудааст
Дар ин дастур шумо хоҳед фаҳмид, ки хидматҳои микросервисҳои Java чӣ гунаанд, чӣ гуна тарроҳӣ ва сохтани онҳо. Он инчунин саволҳоро дар бораи китобхонаҳои микросервисҳои Java ва имконпазирии истифодаи микросервисҳоро дар бар мегирад. Тарҷума ва мутобиқсозии Microservices Java: Дастури амалӣ .

Microservices Java: Асосҳо

Барои фаҳмидани хидматҳои хурд, шумо аввал бояд муайян кунед, ки онҳо чӣ нестанд. Оё ин "монолит" нест - монолит Java: он чист ва афзалиятҳо ё нуқсонҳои он чист? Дастур оид ба Microservices Java.  Қисми 1: Асосҳои хидматрасонии хурд ва меъморӣ - 1

Монолити Java чист?

Тасаввур кунед, ки шумо дар бонк ё стартапи финтех кор мекунед. Шумо ба корбарон барномаи мобorро пешкаш мекунед, ки онҳо метавонанд барои кушодани суратҳисоби нави бонкӣ истифода баранд. Дар codeи Java ин ба мавҷудияти синфи контроллер оварда мерасонад. Соддашуда чунин менамояд:
@Controller
class BankController {

    @PostMapping("/users/register")
    public void register(RegistrationForm form) {
        validate(form);
        riskCheck(form);
        openBankAccount(form);
        // etc..
    }
}
Ба шумо контроллер лозим аст, ки:
  1. Шакли бақайдгирӣ тасдиқ карда шуд.
  2. Хавфҳои суроғаи корбарро санҷида, тасмим гирифт, ки ба ӯ суратҳисоби бонкӣ диҳад.
  3. Ҳисоби бонкӣ кушод.
Синф BankControllerдар якҷоягӣ бо боқимондаи манобеъи шумо ба файли bank.jar ё bank.war барои ҷойгиркунӣ бастабандӣ карда мешавад - ин як монолити хуби кӯҳнаест, ки дорои тамоми рамзи зарурӣ барои идоракунии бонки шумо мебошад. Ҳамчун тахмини тахминӣ, андозаи ибтидоии файли .jar (ё .war) аз 1 то 100 МБ хоҳад буд. Акнун шумо метавонед танҳо файли .jar-ро дар serverи худ иҷро кунед... ва ин ҳама ба шумо барои ҷойгиркунии барномаи Java-и худ лозим аст. Дастур оид ба Microservices Java.  Қисми 1: Асосҳои хидматрасонии хурд ва меъморӣ - 2Тасвир, росткунҷаи чапи боло: ҷойгиркунии бонки моно(литикӣ) java -jar bank.jar (cp .war/.ear ба appserver). Росткунҷаи рост: браузери кушода.

Мушкилот бо монолитҳои Java чист?

Дар монолитҳои Java ҳеҷ чизи нодуруст вуҷуд надорад. Аммо, таҷриба нишон дод, ки агар дар лоиҳаи шумо:
  • Бисёр барномасозон / дастаҳо / мушовирон кор мекунанд ...
  • ...бар болои ҳамон монолит зери фишори муштариён бо талаботи хеле норавшан...
  • дар давоми якчанд сол ...
... пас дар ин ҳолат файли хурди bank.jar-и шумо танҳо ба як гигаbyteи азими code мубаддал мешавад, ки ҳатто наздик шудан, бигзор ҷойгир кардан даҳшатнок аст.

Чӣ тавр андозаи монолитии Java-ро кам кардан мумкин аст?

Саволи табиӣ ба миён меояд: чӣ гуна монолитро хурдтар кардан мумкин аст? Ҳоло bank.jar-и шумо дар як JVM, як раванд дар як server кор мекунад. На бештар, на камтар. Ва худи ҳозир шояд як андешаи мантиқӣ ба сарам меояд: «Аммо хидмати санҷиши хатарро дигар шӯъбаҳои ширкати ман истифода бурда метавонанд! Ин бевосита ба барномаи монолитии бонкии ман алоқаманд нест! Шояд он бояд аз монолит бурида шавад ва ҳамчун маҳсулоти алоҳида ҷойгир карда шавад? Яъне, аз ҷиҳати техникӣ, онро ҳамчун як раванди алоҳидаи Java иҷро мекунад."

Микросервиси Java чист?

Дар амал, ин ибора маънои онро дорад, ки ҳоло занги методӣ riskCheck()аз BankController анҷом дода намешавад: ин усул ё ҷузъи лӯбиё бо ҳама синфҳои ёрирасон ба лоиҳаи худ Maven ё Gradle интиқол дода мешавад. Он инчунин новобаста аз монолитии бонкӣ ҷойгир ва таҳти назорати version ҷойгир карда мешавад. Аммо, ин тамоми раванди истихроҷ модули нави RiskCheck-и шуморо ба хидматрасонии хурд табдил намедиҳад, зеро таърифи хидматрасонии хурд барои тафсир боз аст. Ин боиси баҳсҳои зуд-зуд дар дохor гурӯҳҳо ва ширкатҳо мегардад.
  • Оё 5-7 синфҳо дар лоиҳаи микро ё чӣ?
  • 100 ё 1000 синф ... ҳанӯз ҳам микро?
  • Оё микросервис умуман ба шумораи синфҳо алоқаманд аст ё не?
Биёед мулоҳизаҳои назариявиро паси сар кунем ва ба ҷои он ба мулоҳизаҳои прагматикӣ часпида, ин корро кунем:
  1. Биёед ҳамаи хидматҳои алоҳида ҷойгиршударо новобаста аз андоза ё ҳудуди домени онҳо, микросервисҳо даъват кунем.
  2. Биёед дар бораи чӣ гуна ташкor алоқаи байнихизматӣ фикр кунем. Микросервисҳои мо ба роҳҳои иртибот бо ҳамдигар ниёз доранд.
Ҳамин тавр, барои ҷамъбаст кардан: қаблан шумо як раванди JVM доштед, як монолит барои идоракунии бонк. Ҳоло шумо як раванди монолитии JVM-и бонкӣ ва як хидмати алоҳидаи RiskCheck доред, ки дар доираи раванди JVM-и худ кор мекунад. Ва ҳоло, барои санҷидани хатарҳо, монолити шумо бояд ин хидматрасонии хурдро даъват кунад. Инро чй тавр бояд кард?

Чӣ тавр иртиботро байни микросервисҳои Java барқарор кардан мумкин аст?

Дар маҷмӯъ ва умуман, ду вариант вуҷуд дорад - алоқаи синхронӣ ва асинхронӣ.

Муоширати синхронӣ: (HTTP)/REST

Одатан, иртиботи ҳамоҳангшуда байни хидматрасониҳои хурд тавассути хидматҳои ба монанди HTTP ва REST, ки XML ё JSON-ро бармегардонанд, сурат мегирад. Албатта, шояд имконоти дигар вуҷуд дошта бошанд - ҳадди аққал Google Protocol Buffers -ро гиред . Агар ба шумо посухи фаврӣ лозим бошад, беҳтар аст, ки алоқаи REST-ро истифода баред. Дар мисоли мо, ин маҳз ҳамон чизест, ки бояд анҷом дода шавад, зеро пеш аз кушодани суратҳисоб санҷиши хавф талаб карда мешавад. Агар санҷиши хатар вуҷуд надошта бошад, ҳисоб вуҷуд надорад. Мо асбобҳои зерро дар қисмати " Кадом китобхонаҳо барои зангҳои синхронии Java REST беҳтаранд " муҳокима хоҳем кард.

Паёмнависӣ - Муоширати асинхронӣ

Муоширати микросервисии асинхронӣ одатан тавассути табодули паёмҳо бо татбиқи JMS ва/ё бо истифода аз протокол ба монанди AMQP анҷом дода мешавад . Мо бо як сабаб дар ин ҷо "одатан" навиштем: биёед бигӯем, ки шумораи ҳамгироии почтаи электронӣ/SMTP-ро нодида гирифтан мумкин нест. Онро вақте истифода баред, ки ба шумо посухи фаврӣ лозим нест. Масалан, корбар тугмаи "ҳоло харед" -ро клик мекунад ва шумо дар навбати худ мехоҳед ҳисобнома-фактура эҷод кунед. Ин раванд бешубҳа набояд дар доираи давраи дархости харидории корбар-ҷавоб ба амал ояд. Дар зер мо тавсиф хоҳем кард, ки кадом асбобҳо барои паёмнависии асинхронии Java беҳтаранд .

Мисол: занги REST API дар Java

Фарз мекунем, ки мо иртиботи синхронии микросервисро интихоб мекунем. Дар ин ҳолат, codeи Java-и мо (онеро, ки мо дар боло пешниҳод кардем) дар сатҳи паст чунин менамояд. (дар ин ҷо сатҳи паст маънои онро дорад, ки барои иртиботи микросервис, китобхонаҳои мизоҷ одатан эҷод мешаванд, ки шуморо аз зангҳои воқеии HTTP абстракт мекунанд).
@Controller
class BankController {

    @Autowired
    private HttpClient httpClient;

    @PostMapping("/users/register")
    public void register(RegistrationForm form) {
        validate(form);
        httpClient.send(riskRequest, responseHandler());
        setupAccount(form);
        // etc..
    }
}
Дар асоси code, маълум мешавад, ки мо ҳоло бояд ду хидмати Java (микро) - Бонк ва RiskCheck -ро ҷойгир кунем. Дар натиҷа, мо ду раванди JVM иҷро хоҳем кард. Дастур оид ба Microservices Java.  Қисми 1: Асосҳои хидматрасонии хурд ва меъморӣ - 3Ин ҳама чизест, ки ба шумо барои таҳияи лоиҳаи microservices Java лозим аст: танҳо ба ҷои як монолитӣ қисмҳои хурдтарро (файлҳои .jar ё .war) созед ва ҷойгир кунед. Ҷавоб ба савол норавшан боқӣ мемонад: чӣ гуна мо бояд монолитро ба микросервисҳо бурем? Ин қисмҳо бояд чӣ қадар хурд бошанд, андозаи дурустро чӣ гуна бояд муайян кард? Биёед тафтиш кунем.

Меъмории Java Microservices

Дар амал ширкатҳо лоиҳаҳои микросервисро бо роҳҳои гуногун таҳия мекунанд. Равиш аз он вобаста аст, ки оё шумо кӯшиши табдил додани як монолитии мавҷударо ба лоиҳаи хидматрасонии микроэлементҳо доред ё лоиҳаро аз сифр оғоз мекунед.

Аз монолит то хидматрасонии микро

Яке аз ғояҳои мантиқӣ ин истихроҷи микросервисҳо аз монолитҳои мавҷуда мебошад. Аҳамият диҳед, ки префикси "микро" дар ин ҷо воқеан маънои онро надорад, ки хидматҳои истихроҷшуда воқеан хурд хоҳанд буд; ин ҳатман чунин нест. Биёед заминаи назариявиро дида бароем.

Идея: монолитро ба микросервисҳо шикастед

Равиши микросервисро метавон ба лоиҳаҳои кӯҳна татбиқ кард. Ва барои ҳамин:
  1. Аксар вақт, чунин лоиҳаҳоро нигоҳдорӣ/тағйир додан/васеъ кардан душвор аст.
  2. Ҳама, аз таҳиягарон то менеҷмент, содда кардан мехоҳанд.
  3. Шумо (нисбатан) сарҳадҳои доменҳои равшан доред, яъне шумо медонед, ки нармафзори шумо бояд чӣ кор кунад.
Бозгашт ба мисоли мо, ин маънои онро дорад, ки шумо метавонед ба монолитии бонкии Java назар кунед ва кӯшиш кунед, ки онро дар сарҳадҳои домен вайрон кунед.
  • Ҳамин тавр, коркарди маълумоти корбарро (ба монанди номҳо, суроғаҳо, рақамҳои телефонӣ) ба микросервиси алоҳидаи "Идоракунии ҳисоб" ҷудо кардан оқилона мебуд.
  • Ё ин ки "Модули тафтиши хатар" -и дар боло зикршуда, ки сатҳи хатари корбарро тафтиш мекунад ва метавонад аз ҷониби бисёр лоиҳаҳои дигар ё ҳатто шӯъбаҳои ширкат истифода шавад.
  • Ё модули ҳисоббарорӣ, ки ҳисобнома-фактураҳоро дар формати PDF ё тавассути почта мефиристад.

Татбиқи идея: бигзор каси дигар ин корро кунад

Равиши дар боло тавсифшуда дар коғаз ва диаграммаҳои ба UML монанд ба назар мерасад. Бо вуҷуди ин, он қадар оддӣ нест. Татбиқи амалии он омодагии ҷиддии техникиро талаб мекунад: фарқияти байни фаҳмиши мо дар бораи он, ки чӣ гуна аз монолит истихроҷ кардан хуб аст ва худи раванди истихроҷ хеле калон аст. Аксарияти лоиҳаҳои корхона ба марҳилае мерасанд, ки таҳиягарон метарсанд, ки versionи 7-солаи Hibernate-ро ба versionи навтар навсозӣ кунанд. Дар баробари он китобхонаҳо нав карда мешаванд, аммо хатари воқеии шикастани чизе вуҷуд дорад. Ҳамин тавр, ҳамон таҳиягарон акнун бояд codeи қадимии қадимиро бо сарҳадҳои транзаксияҳои норавшани махзани маълумот кобед ва хидматрасониҳои хуб муайяншударо истихроҷ кунанд? Аксар вакт ин масъала хеле мураккаб аст ва онро дар тахтаи сафед ва дар мачлисхои меъморй «хал кардан» мумкин нест. Дастур оид ба Microservices Java.  Қисми 1: Асосҳои хидматрасонии хурд ва меъморӣ - 4Барои иқтибос аз таҳиягари Twitter @simonbrown: Ман инро такрор ба такрор мегӯям... агар одамон монолитҳоро дуруст сохта натавонанд, микросервисҳо кӯмак намекунанд. Саймон Браун

Лоиҳа аз сифр дар асоси меъмории микросервис

Дар мавриди лоиҳаҳои нави Java, се нуқтаи рақамӣ аз қисми қаблӣ каме фарқ мекунанд:
  1. Шумо бо як варақи тоза оғоз мекунед, бинобар ин, нигоҳ доштани "бағоҷ" вуҷуд надорад.
  2. Таҳиягарон мехоҳанд дар оянда чизҳоро оддӣ нигоҳ доранд.
  3. Мушкилот: Шумо тасвири хеле норавшани сарҳадҳои домен доред: шумо намедонед, ки нармафзори шумо воқеан чӣ кор кардан лозим аст (ишора: agile;))
Ин боиси он мегардад, ки ширкатҳое, ки лоиҳаҳои навро бо микросервисҳои Java кӯшиш мекунанд.

Меъмории микросервиси техникӣ

Ба назар чунин мерасад, ки нуқтаи аввал барои таҳиягарон равшантар аст, аммо онҳое низ ҳастанд, ки онро сахт рӯҳафтода мекунанд. Ҳодӣ Ҳарирӣ рефакторинги "Extract Microservice" -ро дар IntelliJ тавсия медиҳад. Ва гарчанде мисоли зерин хеле содда карда шудааст, аммо татбиқи дар лоиҳаҳои воқеӣ мушоҳидашуда, мутаассифона, аз он дур намераванд. Пеш аз хидматрасонии хурд
@Service
class UserService {

    public void register(User user) {
        String email = user.getEmail();
        String username =  email.substring(0, email.indexOf("@"));
        // ...
    }
}
Бо зерсатри Java microservice
@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());
        // ...
    }
}
Ҳамин тавр, шумо аслан занги усули Java-ро дар занги HTTP мепечонед, бе ягон сабаб барои ин кор. Аммо як сабаб ин аст: набудани таҷриба ва кӯшиши маҷбур кардани равиши микросервисҳои Java. Тавсия: Ин корро накунед.

Меъмории микросервис, ки ба ҷараёни корӣ нигаронида шудааст

Равиши навбатии маъмул ин тақсимоти микросервисҳои Java ба модулҳои ба ҷараёни корӣ асосёфта мебошад. Мисоли воқеии ҳаёт: Дар Олмон, вақте ки шумо ба духтур (ҷамъиятӣ) меравед, ӯ бояд ташрифи шуморо дар системаи CRM тиббии худ сабт кунад. Барои гирифтани пардохт аз суғурта, ӯ маълумотро дар бораи табобати шумо (ва табобати беморони дигар) ба миёнарав тавассути XML мефиристад. Брокер ба ин файли XML нигоҳ мекунад ва (соддашуда):
  1. Санҷед, ки оё файли дурусти XML гирифта шудааст.
  2. Он дурустии расмиётро месанҷад: бигӯем, кӯдаки яксолае, ки дар як рӯз аз гинеколог се дандон тоза кардааст, то андозае шубҳанок менамояд.
  3. XML-ро бо баъзе дигар маълумоти бюрократӣ муттаҳид мекунад.
  4. Файли XML-ро ба ширкати суғурта мефиристад, то пардохтҳоро оғоз кунад.
  5. Ва он натиҷаро ба духтур мефиристад ва ба ӯ паёми "муваффақият" ё "лутфан, ин сабтро ҳарчӣ маъно дорад, дубора ирсол кунед."
Шарҳ. Дар ин мисол, иртибот байни микросервисҳо нақш намебозад, аммо метавонад аз ҷониби брокери паёмӣ (масалан, RabbitMQ) асинхронӣ анҷом дода шавад, зеро духтур ба ҳар ҳол фикру мулоҳизаҳои фаврӣ қабул намекунад. Дастур оид ба Microservices Java.  Қисми 1: Асосҳои хидматрасонии хурд ва меъморӣ - 5Боз ҳам, ин дар рӯи коғаз олиҷаноб менамояд, аммо саволҳои табиӣ ба миён меоянд:
  • Оё барои коркарди як файли XML шаш барнома лозим аст?
  • Оё ин микросервисҳо воқеан аз ҳамдигар мустақиланд? Оё онҳоро новобаста аз ҳамдигар ҷойгир кардан мумкин аст? Бо versionҳои гуногун ва схемаҳои API?
  • Агар микросервиси санҷиш кор накунад, микросервиси эътимоднокӣ чӣ кор мекунад? Оё система ҳоло ҳам кор мекунад?
  • Оё ин микросервисҳо як махзани маълумотро мубодила мекунанд (онҳо албатта ба баъзе маълумоти умумӣ дар ҷадвалҳои МД ниёз доранд) ё ҳар кадоми онҳо худашон доранд?
  • ... ва бисёр чизҳои дигар.
Ҷолиб он аст, ки диаграммаи дар боло овардашуда соддатар менамояд, зеро ҳар як хидмат ҳоло ҳадафи дақиқ ва дақиқи худро дорад. Он пештар ба монанди ин монолити даҳшатовар ба назар мерасид: Дастур оид ба Microservices Java.  Қисми 1: Асосҳои хидматрасонии хурд ва меъморӣ - 6Гарчанде ки шумо метавонед дар бораи соддагии ин диаграммаҳо баҳс кунед, шумо бешубҳа ҳоло бояд ин мушкилоти иловагии амалиётиро ҳал кунед.
  • Ба шумо на танҳо як барнома, балки ҳадди аққал шаш барнома лозим аст.
  • Ба шумо ҳатто шояд лозим ояд, ки якчанд пойгоҳи додаҳоро ҷойгир кунед, вобаста аз он ки шумо то чӣ андоза мехоҳед ба меъмории хидматрасонии микросервис ворид шавед.
  • Шумо бояд боварӣ ҳосил кунед, ки ҳар як система онлайн аст ва дуруст кор мекунад.
  • Шумо бояд боварӣ ҳосил кунед, ки зангҳои шумо байни хидматҳои микросервис воқеан устуворанд (ниг. Чӣ тавр микросервиси Java-ро устувор кардан мумкин аст?).
  • Ва ҳама чизи дигаре, ки ин танзимот дар назар дорад - аз танзимоти рушди маҳаллӣ то санҷиши ҳамгироӣ.
Пас, тавсия чунин хоҳад буд:
  • Агар шумо Netflix набошед (имконият аст, шумо Netflix нестед)...
  • Агар шумо малакаҳои хеле пурқуввати корӣ надошта бошед, ки дар он муҳити рушдро мекушоед ва он боиси маймуни бесарусомонӣ мегардад, ки базаи истеҳсолии шуморо мепартояд, ки дар 5 сония ба осонӣ барқарор карда мешавад.
  • ё шумо худро мисли @monzo ҳис мекунед ва омодаед, ки 1500 хидматрасонии хурдро санҷед, зеро шумо метавонед.
→ Ин корро накунед. Ва ҳоло он камтар гипербола аст. Кӯшиши моделсозии хидматрасониҳои хурд дар сарҳадҳои домен хеле оқилона ба назар мерасад. Аммо ин маънои онро надорад, ки шумо бояд як ҷараёни корро гиред ва онро ба қисмҳои хурди инфиродӣ тақсим кунед (XML-ро қабул кунед, XML-ро тасдиқ кунед, XML-ро пеш баред). Аз ин рӯ, вақте ки шумо лоиҳаи навро бо microservices Java оғоз мекунед ва ҳудуди домен то ҳол хеле норавшан аст, кӯшиш кунед, ки андозаи хидматрасонии микросервисҳои худро дар сатҳи паст нигоҳ доред. Шумо ҳамеша метавонед модулҳои бештарро дертар илова кунед. Ва боварӣ ҳосил кунед, ки шумо DevOps-и пешрафтаро дар даста/ширкат/шӯъба барои дастгирии инфрасохтори нави худ доред.

Меъмории микросервиси полиглот ё ба даста нигаронидашуда

Равиши сеюм, қариб либертарӣ барои таҳияи хидматрасонии хурд вуҷуд дорад: имкон медиҳад, ки ба гурӯҳҳо ва ҳатто ба шахсони алоҳида бо истифода аз ҳама гуна забонҳо ё хидматҳои хурд ҳикояҳои корбаронро амалӣ кунанд (маркетингҳо ин равишро “барномасозии полиглотӣ” меноманд). Ҳамин тариқ, хидмати санҷиши XML-ро, ки дар боло тавсиф шудааст, метавон дар Java навишт, дар ҳоле ки микросервиси санҷишро ҳамзамон бо Haskell навиштан мумкин аст (барои он ки он аз ҷиҳати математикӣ дуруст бошад). Барои микросервиси интиқоли суғурта, шумо метавонед Erlang-ро истифода баред (зеро он воқеан миқёс кардан лозим аст;)). Он чизе, ки аз нуқтаи назари таҳиягар шавқовар ба назар мерасад (таҳияи системаи комил бо забони комor худ дар муҳити ҷудогона) дар асл, ҳеҷ гоҳ он чизест, ки созмон мехоҳад: гомогенизатсия ва стандартизатсия. Ин маънои онро дорад, ки маҷмӯи нисбатан стандартишудаи забонҳо, китобхонаҳо ва асбобҳо, то ки дигар таҳиягарон дар оянда ҳангоми гузаштан ба чарогоҳҳои сабзтар хидматрасонии микросервиси Haskell-и шуморо дастгирӣ кунанд. Дастур оид ба Microservices Java.  Қисми 1: Асосҳои хидматрасонии хурд ва меъморӣ - 8Таърих нишон медиҳад, ки стандартизатсия одатан хеле амиқ реша мегирад. Масалан, таҳиягарон дар ширкатҳои бузурги Fortune 500 баъзан ҳатто иҷозат намедоданд, ки Spring-ро истифода баранд, зеро он "як қисми харитаи технологияи ширкат набуд". Аммо гузаштан пурра ба равиши полиглот кариб як чиз, тарафи дигари хамон танга аст. Тавсия: Агар шумо хоҳед, ки барномасозии полиглотро истифода баред, дар як экосистемаи забони барномасозӣ камтар гуногунрангро санҷед. Пас, беҳтар аст, ки Kotlin ва Java якҷоя истифода шаванд (ҳарду забон ба JVM асос ёфтаанд ва 100% бо ҳамдигар мувофиқанд), на Java ва, масалан, Ҳаскелл. Дар қисми навбатӣ, шумо дар бораи ҷобаҷогузорӣ ва озмоиши микросервисҳои Java маълумот хоҳед гирифт.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION