Дар ин дастур шумо хоҳед фаҳмид, ки хидматҳои микросервисҳои Java чӣ гунаанд, чӣ гуна тарроҳӣ ва сохтани онҳо. Он инчунин саволҳоро дар бораи китобхонаҳои микросервисҳои Java ва имконпазирии истифодаи микросервисҳоро дар бар мегирад. Тарҷума ва мутобиқсозии Microservices Java: Дастури амалӣ .
Microservices Java: Асосҳо
Барои фаҳмидани хидматҳои хурд, шумо аввал бояд муайян кунед, ки онҳо чӣ нестанд. Оё ин "монолит" нест - монолит Java: он чист ва афзалиятҳо ё нуқсонҳои он чист?Монолити Java чист?
Тасаввур кунед, ки шумо дар бонк ё стартапи финтех кор мекунед. Шумо ба корбарон барномаи мобorро пешкаш мекунед, ки онҳо метавонанд барои кушодани суратҳисоби нави бонкӣ истифода баранд. Дар codeи Java ин ба мавҷудияти синфи контроллер оварда мерасонад. Соддашуда чунин менамояд:@Controller
class BankController {
@PostMapping("/users/register")
public void register(RegistrationForm form) {
validate(form);
riskCheck(form);
openBankAccount(form);
// etc..
}
}
Ба шумо контроллер лозим аст, ки:
- Шакли бақайдгирӣ тасдиқ карда шуд.
- Хавфҳои суроғаи корбарро санҷида, тасмим гирифт, ки ба ӯ суратҳисоби бонкӣ диҳад.
- Ҳисоби бонкӣ кушод.
BankController
дар якҷоягӣ бо боқимондаи манобеъи шумо ба файли bank.jar ё bank.war барои ҷойгиркунӣ бастабандӣ карда мешавад - ин як монолити хуби кӯҳнаест, ки дорои тамоми рамзи зарурӣ барои идоракунии бонки шумо мебошад. Ҳамчун тахмини тахминӣ, андозаи ибтидоии файли .jar (ё .war) аз 1 то 100 МБ хоҳад буд. Акнун шумо метавонед танҳо файли .jar-ро дар serverи худ иҷро кунед... ва ин ҳама ба шумо барои ҷойгиркунии барномаи Java-и худ лозим аст. Тасвир, росткунҷаи чапи боло: ҷойгиркунии бонки моно(литикӣ) java -jar bank.jar (cp .war/.ear ба appserver). Росткунҷаи рост: браузери кушода.
Мушкилот бо монолитҳои Java чист?
Дар монолитҳои Java ҳеҷ чизи нодуруст вуҷуд надорад. Аммо, таҷриба нишон дод, ки агар дар лоиҳаи шумо:- Бисёр барномасозон / дастаҳо / мушовирон кор мекунанд ...
- ...бар болои ҳамон монолит зери фишори муштариён бо талаботи хеле норавшан...
- дар давоми якчанд сол ...
Чӣ тавр андозаи монолитии Java-ро кам кардан мумкин аст?
Саволи табиӣ ба миён меояд: чӣ гуна монолитро хурдтар кардан мумкин аст? Ҳоло bank.jar-и шумо дар як JVM, як раванд дар як server кор мекунад. На бештар, на камтар. Ва худи ҳозир шояд як андешаи мантиқӣ ба сарам меояд: «Аммо хидмати санҷиши хатарро дигар шӯъбаҳои ширкати ман истифода бурда метавонанд! Ин бевосита ба барномаи монолитии бонкии ман алоқаманд нест! Шояд он бояд аз монолит бурида шавад ва ҳамчун маҳсулоти алоҳида ҷойгир карда шавад? Яъне, аз ҷиҳати техникӣ, онро ҳамчун як раванди алоҳидаи Java иҷро мекунад."Микросервиси Java чист?
Дар амал, ин ибора маънои онро дорад, ки ҳоло занги методӣriskCheck()
аз BankController анҷом дода намешавад: ин усул ё ҷузъи лӯбиё бо ҳама синфҳои ёрирасон ба лоиҳаи худ Maven ё Gradle интиқол дода мешавад. Он инчунин новобаста аз монолитии бонкӣ ҷойгир ва таҳти назорати version ҷойгир карда мешавад. Аммо, ин тамоми раванди истихроҷ модули нави RiskCheck-и шуморо ба хидматрасонии хурд табдил намедиҳад, зеро таърифи хидматрасонии хурд барои тафсир боз аст. Ин боиси баҳсҳои зуд-зуд дар дохor гурӯҳҳо ва ширкатҳо мегардад.
- Оё 5-7 синфҳо дар лоиҳаи микро ё чӣ?
- 100 ё 1000 синф ... ҳанӯз ҳам микро?
- Оё микросервис умуман ба шумораи синфҳо алоқаманд аст ё не?
- Биёед ҳамаи хидматҳои алоҳида ҷойгиршударо новобаста аз андоза ё ҳудуди домени онҳо, микросервисҳо даъват кунем.
- Биёед дар бораи чӣ гуна ташкor алоқаи байнихизматӣ фикр кунем. Микросервисҳои мо ба роҳҳои иртибот бо ҳамдигар ниёз доранд.
Чӣ тавр иртиботро байни микросервисҳои 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 лозим аст: танҳо ба ҷои як монолитӣ қисмҳои хурдтарро (файлҳои .jar ё .war) созед ва ҷойгир кунед. Ҷавоб ба савол норавшан боқӣ мемонад: чӣ гуна мо бояд монолитро ба микросервисҳо бурем? Ин қисмҳо бояд чӣ қадар хурд бошанд, андозаи дурустро чӣ гуна бояд муайян кард? Биёед тафтиш кунем.
Меъмории Java Microservices
Дар амал ширкатҳо лоиҳаҳои микросервисро бо роҳҳои гуногун таҳия мекунанд. Равиш аз он вобаста аст, ки оё шумо кӯшиши табдил додани як монолитии мавҷударо ба лоиҳаи хидматрасонии микроэлементҳо доред ё лоиҳаро аз сифр оғоз мекунед.Аз монолит то хидматрасонии микро
Яке аз ғояҳои мантиқӣ ин истихроҷи микросервисҳо аз монолитҳои мавҷуда мебошад. Аҳамият диҳед, ки префикси "микро" дар ин ҷо воқеан маънои онро надорад, ки хидматҳои истихроҷшуда воқеан хурд хоҳанд буд; ин ҳатман чунин нест. Биёед заминаи назариявиро дида бароем.Идея: монолитро ба микросервисҳо шикастед
Равиши микросервисро метавон ба лоиҳаҳои кӯҳна татбиқ кард. Ва барои ҳамин:- Аксар вақт, чунин лоиҳаҳоро нигоҳдорӣ/тағйир додан/васеъ кардан душвор аст.
- Ҳама, аз таҳиягарон то менеҷмент, содда кардан мехоҳанд.
- Шумо (нисбатан) сарҳадҳои доменҳои равшан доред, яъне шумо медонед, ки нармафзори шумо бояд чӣ кор кунад.
- Ҳамин тавр, коркарди маълумоти корбарро (ба монанди номҳо, суроғаҳо, рақамҳои телефонӣ) ба микросервиси алоҳидаи "Идоракунии ҳисоб" ҷудо кардан оқилона мебуд.
- Ё ин ки "Модули тафтиши хатар" -и дар боло зикршуда, ки сатҳи хатари корбарро тафтиш мекунад ва метавонад аз ҷониби бисёр лоиҳаҳои дигар ё ҳатто шӯъбаҳои ширкат истифода шавад.
- Ё модули ҳисоббарорӣ, ки ҳисобнома-фактураҳоро дар формати PDF ё тавассути почта мефиристад.
Татбиқи идея: бигзор каси дигар ин корро кунад
Равиши дар боло тавсифшуда дар коғаз ва диаграммаҳои ба UML монанд ба назар мерасад. Бо вуҷуди ин, он қадар оддӣ нест. Татбиқи амалии он омодагии ҷиддии техникиро талаб мекунад: фарқияти байни фаҳмиши мо дар бораи он, ки чӣ гуна аз монолит истихроҷ кардан хуб аст ва худи раванди истихроҷ хеле калон аст. Аксарияти лоиҳаҳои корхона ба марҳилае мерасанд, ки таҳиягарон метарсанд, ки versionи 7-солаи Hibernate-ро ба versionи навтар навсозӣ кунанд. Дар баробари он китобхонаҳо нав карда мешаванд, аммо хатари воқеии шикастани чизе вуҷуд дорад. Ҳамин тавр, ҳамон таҳиягарон акнун бояд codeи қадимии қадимиро бо сарҳадҳои транзаксияҳои норавшани махзани маълумот кобед ва хидматрасониҳои хуб муайяншударо истихроҷ кунанд? Аксар вакт ин масъала хеле мураккаб аст ва онро дар тахтаи сафед ва дар мачлисхои меъморй «хал кардан» мумкин нест. Барои иқтибос аз таҳиягари Twitter @simonbrown: Ман инро такрор ба такрор мегӯям... агар одамон монолитҳоро дуруст сохта натавонанд, микросервисҳо кӯмак намекунанд. Саймон БраунЛоиҳа аз сифр дар асоси меъмории микросервис
Дар мавриди лоиҳаҳои нави Java, се нуқтаи рақамӣ аз қисми қаблӣ каме фарқ мекунанд:- Шумо бо як варақи тоза оғоз мекунед, бинобар ин, нигоҳ доштани "бағоҷ" вуҷуд надорад.
- Таҳиягарон мехоҳанд дар оянда чизҳоро оддӣ нигоҳ доранд.
- Мушкилот: Шумо тасвири хеле норавшани сарҳадҳои домен доред: шумо намедонед, ки нармафзори шумо воқеан чӣ кор кардан лозим аст (ишора: agile;))
Меъмории микросервиси техникӣ
Ба назар чунин мерасад, ки нуқтаи аввал барои таҳиягарон равшантар аст, аммо онҳое низ ҳастанд, ки онро сахт рӯҳафтода мекунанд. Ҳодӣ Ҳарирӣ рефакторинги "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 нигоҳ мекунад ва (соддашуда):- Санҷед, ки оё файли дурусти XML гирифта шудааст.
- Он дурустии расмиётро месанҷад: бигӯем, кӯдаки яксолае, ки дар як рӯз аз гинеколог се дандон тоза кардааст, то андозае шубҳанок менамояд.
- XML-ро бо баъзе дигар маълумоти бюрократӣ муттаҳид мекунад.
- Файли XML-ро ба ширкати суғурта мефиристад, то пардохтҳоро оғоз кунад.
- Ва он натиҷаро ба духтур мефиристад ва ба ӯ паёми "муваффақият" ё "лутфан, ин сабтро ҳарчӣ маъно дорад, дубора ирсол кунед."
- Оё барои коркарди як файли XML шаш барнома лозим аст?
- Оё ин микросервисҳо воқеан аз ҳамдигар мустақиланд? Оё онҳоро новобаста аз ҳамдигар ҷойгир кардан мумкин аст? Бо versionҳои гуногун ва схемаҳои API?
- Агар микросервиси санҷиш кор накунад, микросервиси эътимоднокӣ чӣ кор мекунад? Оё система ҳоло ҳам кор мекунад?
- Оё ин микросервисҳо як махзани маълумотро мубодила мекунанд (онҳо албатта ба баъзе маълумоти умумӣ дар ҷадвалҳои МД ниёз доранд) ё ҳар кадоми онҳо худашон доранд?
- ... ва бисёр чизҳои дигар.
- Ба шумо на танҳо як барнома, балки ҳадди аққал шаш барнома лозим аст.
- Ба шумо ҳатто шояд лозим ояд, ки якчанд пойгоҳи додаҳоро ҷойгир кунед, вобаста аз он ки шумо то чӣ андоза мехоҳед ба меъмории хидматрасонии микросервис ворид шавед.
- Шумо бояд боварӣ ҳосил кунед, ки ҳар як система онлайн аст ва дуруст кор мекунад.
- Шумо бояд боварӣ ҳосил кунед, ки зангҳои шумо байни хидматҳои микросервис воқеан устуворанд (ниг. Чӣ тавр микросервиси Java-ро устувор кардан мумкин аст?).
- Ва ҳама чизи дигаре, ки ин танзимот дар назар дорад - аз танзимоти рушди маҳаллӣ то санҷиши ҳамгироӣ.
- Агар шумо Netflix набошед (имконият аст, шумо Netflix нестед)...
- Агар шумо малакаҳои хеле пурқуввати корӣ надошта бошед, ки дар он муҳити рушдро мекушоед ва он боиси маймуни бесарусомонӣ мегардад, ки базаи истеҳсолии шуморо мепартояд, ки дар 5 сония ба осонӣ барқарор карда мешавад.
- ё шумо худро мисли @monzo ҳис мекунед ва омодаед, ки 1500 хидматрасонии хурдро санҷед, зеро шумо метавонед.
GO TO FULL VERSION