Бұл нұсқаулықта сіз Java микросервистерінің не екенін, оларды қалай жобалау және жасау керектігін білесіз. Ол сонымен қатар Java микросервис кітапханалары және микросервистерді пайдалану мүмкіндігі туралы сұрақтарды қамтиды. Java микросервистерін аудару және бейімдеу : практикалық нұсқаулық .
Java микросервистері: негіздері
Микросервистерді түсіну үшін алдымен олардың не емес екенін анықтау керек. Бұл «монолит» емес пе - Java монолиті: бұл не және оның артықшылықтары немесе кемшіліктері қандай?Java монолиті дегеніміз не?
Сіз банкте немесе финтех стартапында жұмыс істеп жатырсыз деп елестетіңіз. Сіз пайдаланушыларға жаңа банк шотын ашу үшін пайдалана алатын мобильді қолданбаны бересіз. Java codeында бұл контроллер класының болуына әкеледі. Жеңілдетілген, ол келесідей көрінеді:@Controller
class BankController {
@PostMapping("/users/register")
public void register(RegistrationForm form) {
validate(form);
riskCheck(form);
openBankAccount(form);
// etc..
}
}
Сізге контроллер қажет:
- Тіркеу формасын растады.
- Пайдаланушы мекенжайының тәуекелдерін тексеріп, оған банктік шот беру керек пе деген шешім қабылдады.
- Банк шотын ашты.
BankController
сіздің қалған көздеріңізбен бірге орналастыру үшін bank.jar немесе bank.war файлына жинақталады - бұл банкіңізді басқаруға қажетті барлық codeты қамтитын жақсы ескі монолит. Шамамен бағалау ретінде .jar (немесе .war) файлының бастапқы өлшемі 1 мен 100 МБ аралығында болады. Енді сіз жай ғана serverіңізде .jar файлын іске қоса аласыз... және Java қолданбасын орналастыру үшін мұның бәрі қажет. Сурет, жоғарғы сол жақ тіктөртбұрыш: моно(литтік) банк java -jar bank.jar (cp .war/.ear қолданба serverіне) орналастыру. Оң жақ төртбұрыш: браузерді ашыңыз.
Java монолиттерімен қандай мәселе бар?
Java монолиттерінде дұрыс емес ештеңе жоқ. Дегенмен, тәжірибе көрсеткендей, егер сіздің жобаңызда:- Көптеген бағдарламашылар/командалар/кеңесшілер жұмыс істейді...
- ...өте түсініксіз талаптары бар тұтынушылардың қысымымен сол монолиттің үстінде...
- бір-екі жыл ішінде...
Java монолитінің өлшемін қалай азайтуға болады?
Табиғи сұрақ туындайды: монолитті қалай кішірейту керек? Дәл қазір bank.jar бір JVM жүйесінде, бір serverде бір процесс жұмыс істейді. Артық емес, кем емес. Дәл қазір ойға логикалық ой келуі мүмкін: «Бірақ тәуекелді тексеру қызметін менің компаниямның басқа бөлімшелері де пайдалана алады! Бұл менің монолитті банктік қосымшама тікелей қатысты емес! Мүмкін оны монолиттен кесіп алып, жеке өнім ретінде орналастыру керек пе? Яғни, техникалық тілмен айтқанда, оны жеке Java процесі ретінде іске қосу.Java микросервисі дегеніміз не?
Іс жүзінде бұл сөз тіркесі енді әдісті шақыруriskCheck()
BankController қолданбасынан жасалмайтынын білдіреді: бұл әдіс немесе бұршақ құрамдас бөлігі өзінің барлық көмекші сыныптарымен өзінің Maven немесе Gradle жобасына ауыстырылады. Ол сондай-ақ банктік монолитке тәуелсіз түрде орналастырылады және нұсқалық бақылауға орналастырылады. Дегенмен, бұл бүкіл шығару процесі жаңа RiskCheck модуліңізді микросервиске айналдырмайды, өйткені микросервис анықтамасы түсіндіруге ашық. Бұл командалар мен компаниялар ішінде жиі талқылауларға әкеледі.
- Микро жобада 5-7 сынып бар ма немесе не?
- 100 немесе 1000 сынып... әлі де микро?
- Микросервис әдетте сыныптар санына байланысты ма, жоқ па?
- Өлшеміне немесе домен шекараларына қарамастан, барлық бөлек орналастырылған қызметтерді микросервис деп атайық.
- Қызметаралық байланысты қалай ұйымдастыру керектігі туралы ойланайық. Біздің микросервистерге бір-бірімен байланысу тәсілдері қажет.
Java микросервистері арасындағы байланысты қалай орнатуға болады?
Жалпы және жалпы екі нұсқа бар - синхронды және асинхронды байланыс.Синхронды байланыс: (HTTP)/REST
Әдетте, микросервистер арасындағы синхрондалған байланыс HTTP және XML немесе JSON қайтаратын REST тәрізді қызметтер арқылы жүзеге асады. Әрине, басқа опциялар болуы мүмкін - кем дегенде Google Protocol Buffers алыңыз . Егер сізге дереу жауап қажет болса, REST байланысын қолданған дұрыс. Біздің мысалда дәл осылай істеу керек, өйткені шот ашпас бұрын тәуекелді тексеру қажет. Тәуекелді тексеру болмаса, шот жоқ. Төмендегі құралдарды « Java REST синхронды қоңыраулары үшін қай кітапханалар жақсы » бөлімінде талқылаймыз .Хабарлама – асинхронды байланыс
Асинхронды микросервис байланысы әдетте JMS енгізуімен және/немесе AMQP сияқты хаттамамен алмасу арқылы жүзеге асырылады . Біз мұнда бір себеппен «әдетте» деп жаздык: электрондық пошта/SMTP интеграцияларының санын елемеуге болмайды делік. Оны дереу жауап қажет болмаған кезде пайдаланыңыз. Мысалы, пайдаланушы «қазір сатып алу» түймесін басады, ал сіз өз кезегінде шот-фактураны жасағыңыз келеді. Бұл процесс, әрине, пайдаланушының сатып алу сұрауы-жауап циклі ішінде болмауы керек. Төменде біз асинхронды Java хабарламалары үшін қай құралдар жақсы екенін сипаттаймыз .Мысал: Java тіліндегі REST API шақыруы
Синхронды микросервис байланысын таңдаймыз делік. Бұл жағдайда біздің Java codeымыз (жоғарыда біз ұсынған) төмен деңгейде келесідей болады. (төмен деңгей дегенде біз микросервис байланысы үшін әдетте сізді нақты 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..
}
}
Кодқа сүйене отырып, бізге енді екі Java (микро) қызметтерді, Банк және RiskCheck қолдану керек екені белгілі болды. Нәтижесінде бізде екі JVM процесі іске қосылады. Java микросервис жобасын әзірлеу үшін осының бәрі қажет: бір монолитті бөліктің орнына кішірек бөліктерді (.jar немесе .war файлдары) жасап, орналастырыңыз. Сұрақтың жауабы әлі белгісіз: монолитті микросервистерге қалай кесу керек? Бұл бөліктер қаншалықты кішкентай болуы керек, дұрыс өлшемді қалай анықтауға болады? Тексерейік.
Java микросервистерінің архитектурасы
Іс жүзінде компаниялар микросервис жобаларын әртүрлі тәсілдермен әзірлейді. Әдіс бұрыннан бар монолитті микросервис жобасына түрлендіруге немесе жобаны нөлден бастауға әрекеттеніп жатқаныңызға байланысты.Монолиттен микросервистерге дейін
Ең қисынды идеялардың бірі - бар монолиттен микросервистерді шығару. Мұндағы «микро» префиксі шын мәнінде шығарылатын қызметтердің шын мәнінде аз болатынын білдірмейтінін ескеріңіз; бұл міндетті емес. Теориялық негізді қарастырайық.Идея: монолитті микросервистерге бөлу
Микросервис тәсілін бұрынғы жобаларға қолдануға болады. Және сол себепті:- Көбінесе мұндай жобаларды қолдау/өзгерту/кеңейту қиын.
- Әзірлеушілерден бастап менеджментке дейін барлығы оңайлатуды қалайды.
- Сізде (салыстырмалы түрде) нақты домен шекаралары бар, яғни сіз бағдарламалық жасақтама не істеу керектігін нақты білесіз.
- Сонымен, пайдаланушы деректерін өңдеуді (мысалы, атаулар, мекенжайлар, телефон нөмірлері) «Тіркелгіні басқару» жеке микросервисіне бөлу орынды болар еді.
- Немесе жоғарыда аталған «Тәуекелдерді тексеру модулі» пайдаланушының тәуекел деңгейлерін тексереді және оны көптеген басқа жобалар немесе тіпті компанияның бөлімдері пайдалана алады.
- Немесе шот-фактураларды PDF пішімінде немесе пошта арқылы жіберетін шот-фактура модулі.
Идеяның жүзеге асуы: басқа біреу жасасын
Жоғарыда сипатталған тәсіл қағазда және UML тәрізді диаграммаларда тамаша көрінеді. Дегенмен, бәрі соншалықты қарапайым емес. Оны іс жүзінде жүзеге асыру күрделі техникалық дайындықты қажет етеді: монолиттен нені алу жақсы болатынын түсінуіміз бен өндіру процесінің өзі арасындағы алшақтық өте үлкен. Көптеген кәсіпорын жобалары әзірлеушілер күту режимінің 7 жылдық нұсқасын жаңасына жаңартудан қорқатын кезеңге жетеді. Кітапханалар онымен бірге жаңартылады, бірақ бір нәрсені бұзу қаупі бар. Сонымен, дәл сол әзірлеушілер енді дерекқор транзакцияларының шекаралары анық емес көне codeты зерттеп, жақсы анықталған микросервистерді шығаруы керек пе? Көбінесе бұл мәселе өте күрделі және оны тақтада немесе сәулет жиналыстарында «шешу» мүмкін емес. Twitter әзірлеушісі @simonbrown сөзін келтіретін болсақ: Мен мұны қайта-қайта айтамын... егер адамдар монолиттерді дұрыс құра алмаса, микросервистер көмектеспейді. Саймон БраунМикросервис архитектурасына негізделген нөлден бастап жоба
Жаңа Java жобалары үшін алдыңғы бөліктегі үш нөмірленген элемент сәл басқаша көрінеді:- Сіз таза парақтан бастайсыз, сондықтан күтетін «жүк» жоқ.
- Әзірлеушілер болашақта қарапайым нәрселерді сақтағысы келеді.
- Мәселе: Сізде домен шекараларының әлдеқайда анық емес суреті бар: сіз бағдарламалық жасақтаманың не істеу керек екенін білмейсіз (кеңес: agile;))
Техникалық микросервис архитектурасы
Бірінші тармақ әзірлеушілер үшін ең айқын болып көрінеді, бірақ оны қатты тоқтататындар да бар. Хади Харири IntelliJ жүйесінде «Extract Microservice» рефакторингін ұсынады. Келесі мысал өте жеңілдетілген болса да, нақты жобаларда байқалған енгізулер, өкінішке орай, одан тым алыс кетпейді. Микросервистерге дейін@Service
class UserService {
public void register(User user) {
String email = user.getEmail();
String username = email.substring(0, email.indexOf("@"));
// ...
}
}
Ішкі Java микросервисімен
@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 файлының қабылданғанын тексереді.
- Ол proceduresалардың орындылығын тексереді: айталық, гинекологтан бір күнде үш тіс тазалау proceduresасын алған бір жасар бала біршама күдікті көрінеді.
- XML-ді басқа бюрократиялық деректермен біріктіреді.
- Төлемдерді бастау үшін XML файлын сақтандыру компаниясына жібереді.
- Ол нәтижені дәрігерге жіберіп, оған «сәттілік» немесе «бұл жазбаны мағынасы болған кезде қайта жіберуіңізді өтінемін» деген хабарды береді.
- Бір XML файлын өңдеу үшін алты қолданбаны қолдану қажет пе?
- Бұл микросервистер бір-бірінен шынымен тәуелсіз ме? Оларды бір-бірінен тәуелсіз орналастыруға бола ма? Әртүрлі нұсқалармен және API схемаларымен?
- Тексеру микросервисі жұмыс істемесе, сенімділік микросервисі не істейді? Жүйе әлі жұмыс істеп жатыр ма?
- Бұл микросервистер бірдей дерекқорды ортақ пайдаланады ма (олар, әрине, ДҚ кестелеріндегі кейбір жалпы деректерге мұқтаж) немесе олардың әрқайсысында өздерінің бар ма?
- … және тағы басқалар.
- Сізге бір қолданбаны ғана емес, кем дегенде алты қолданбаны орналастыру қажет.
- Микросервис архитектурасына қаншалықты кіргіңіз келетініне байланысты бірнеше дерекқорды орналастыру қажет болуы мүмкін.
- Әрбір жүйенің желіде екеніне және дұрыс жұмыс істейтініне көз жеткізу керек.
- Микросервистер арасындағы қоңырауларыңыз шынымен төзімді екеніне көз жеткізуіңіз керек (Java микросервисін қалай төзімді ету керек? бөлімін қараңыз).
- Бұл орнатуды білдіретін барлық нәрсе - жергілікті әзірлеу параметрлерінен интеграциялық тестілеуге дейін.
- Егер сіз Netflix болмасаңыз (мүмкін, сіз Netflix емессіз)...
- Егер сізде әзірлеу ортасын ашатын өте күшті жұмыс дағдылары болмаса және ол 5 секундта оңай қалпына келтірілетін өндірістік дерекқорыңызды лақтырып жіберетін хаос маймылын тудырмаса.
- немесе сіз @monzo сияқты сезінесіз және 1500 микросервисті қолданып көруге дайынсыз.
GO TO FULL VERSION