Java mikroservislarini tarjima qilish va moslashtirish : amaliy qo'llanma . Qo'llanmaning oldingi qismlari:
- mikroservis asoslari va ularning arxitekturasi ;
- mikroservislarni joylashtirish va sinovdan o'tkazish .
Java mikroxizmatini qanday qilib barqaror qilish mumkin?
Eslatib o'tamiz, siz mikroservislarni yaratganingizda, siz sinxron HTTP qo'ng'iroqlari yoki asinxron xabarlar uchun JVM usuli qo'ng'iroqlarini sotasiz. Usul chaqiruvi asosan yakunlanishi kafolatlangan bo'lsa-da (kutilmagan JVM yopilishidan tashqari), tarmoq qo'ng'irog'i sukut bo'yicha ishonchsizdir. U ishlashi mumkin, lekin u turli sabablarga ko'ra ishlamasligi mumkin: tarmoq haddan tashqari yuklangan, yangi xavfsizlik devori qoidasi joriy qilingan va hokazo. Bu qanday farq qilishini ko'rish uchun, keling, BillingService misolini ko'rib chiqaylik.HTTP/REST chidamlilik namunalari
Aytaylik, mijozlar kompaniyangiz veb-saytida elektron kitoblarni sotib olishlari mumkin. Buni amalga oshirish uchun siz haqiqiy PDF hisob-fakturalarini yaratish uchun onlayn-do'koningizga qo'ng'iroq qila oladigan hisob-kitob mikroxizmatini joriy qildingiz. Hozircha biz ushbu qo‘ng‘iroqni HTTP orqali sinxron tarzda amalga oshiramiz (garchi bu xizmatni sinxron tarzda chaqirish mantiqiyroq bo‘lsa-da, chunki PDF yaratish foydalanuvchi nuqtai nazaridan bir zumda bo‘lishi shart emas. Keyingi misolda ham xuddi shu misoldan foydalanamiz. bo'limga o'ting va farqlarga qarang).@Service
class BillingService {
@Autowired
private HttpClient client;
public void bill(User user, Plan plan) {
Invoice invoice = createInvoice(user, plan);
httpClient.send(invoiceRequest(user.getEmail(), invoice), responseHandler());
// ...
}
}
Xulosa qilib aytganda, bu HTTP chaqiruvining uchta mumkin bo'lgan natijasidir.
- OK: qo'ng'iroq amalga oshirildi, hisob muvaffaqiyatli yaratildi.
- Kechikish: Qo'ng'iroq amalga oshdi, lekin uni bajarish uchun juda uzoq vaqt ketdi.
- XATO. Qo'ng'iroq amalga oshmadi, siz mos kelmaydigan so'rov yuborgan bo'lishingiz mumkin yoki tizim ishlamayotgan bo'lishi mumkin.
Xabar almashish chidamliligi namunalari
Keling, asinxron aloqani batafsil ko'rib chiqaylik. Bizning BillingService dasturimiz xabar almashish uchun Spring va RabbitMQ dan foydalanayotgan bo'lsak, endi shunday ko'rinishi mumkin. Hisob qaydnomasini yaratish uchun biz RabbitMQ xabar brokerimizga xabar yuboramiz, u erda bir nechta ishchilar yangi xabarlarni kutmoqda. Ushbu ishchilar PDF hisob-fakturalarini yaratadilar va ularni tegishli foydalanuvchilarga yuboradilar.@Service
class BillingService {
@Autowired
private RabbitTemplate rabbitTemplate;
public void bill(User user, Plan plan) {
Invoice invoice = createInvoice(user, plan);
// преобразует счет, например, в json и использует его How тело messages
rabbitTemplate.convertAndSend(exchange, routingkey, invoice);
// ...
}
}
Potensial xatolar endi biroz boshqacha ko'rinadi, chunki siz sinxron HTTP ulanishi kabi darhol OK yoki XATO javoblarini olmaysiz. Buning o'rniga, bizda quyidagi savollar tug'ilishi mumkin bo'lgan noto'g'ri bo'lishi mumkin bo'lgan uchta potentsial stsenariy bo'lishi mumkin:
- Mening xabarim xodim tomonidan yetkazildi va foydalanildimi? Yoki yo'qolganmi? (Foydalanuvchi hisob-fakturani olmaydi).
- Mening xabarim faqat bir marta yetkazilganmi? Yoki bir necha marta yetkazib berilgan va faqat bir marta qayta ishlanganmi? (Foydalanuvchi bir nechta hisob-fakturalarni oladi).
- Konfiguratsiya: "Men almashish uchun to'g'ri marshrutlash kalitlari/nomlaridan foydalandimmi" dan "Mening xabarlar brokerim to'g'ri sozlanganmi va saqlanganmi yoki uning navbatlari to'lganmi?" (Foydalanuvchi hisob-fakturani olmaydi).
- Agar siz ActiveMQ kabi JMS ilovalaridan foydalansangiz, ikki fazali (XA) majburiyatlar kafolati uchun tezlikni almashishingiz mumkin.
- Agar siz RabbitMQ dan foydalanayotgan bo'lsangiz, avval ushbu qo'llanmani o'qing, so'ngra tasdiqlar, nosozliklarga chidamlilik va umuman xabar ishonchliligi haqida yaxshilab o'ylab ko'ring.
- Ehtimol, kimdir Active yoki RabbitMQ serverlarini sozlashni yaxshi biladi, ayniqsa klasterlash va Docker bilan birgalikda (har kim? ;))
Qaysi ramka Java mikroservislari uchun eng yaxshi yechim bo'ladi?
Bir tomondan, siz Spring Boot kabi juda mashhur variantni o'rnatishingiz mumkin . Bu .jar fayllarini yaratishni juda oson qiladi, Tomcat yoki Jetty kabi o'rnatilgan veb-server bilan birga keladi va tez va istalgan joyda ishga tushirilishi mumkin. Mikroservis dasturlarini yaratish uchun ideal. Yaqinda qisman reaktiv dasturlashdan ilhomlangan Kubernetes yoki GraalVM ixtisoslashgan bir nechta mikroservis ramkalari paydo bo'ldi. Mana yana bir nechta qiziqarli da'vogarlar: Quarkus , Micronaut , Vert.x , Helidon . Oxir-oqibat, siz o'zingiz uchun tanlov qilishingiz kerak bo'ladi, lekin biz sizga mutlaqo standart bo'lmasligi mumkin bo'lgan bir nechta tavsiyalarni berishimiz mumkin: Spring Boot bundan mustasno, barcha mikroservislar ramkalari odatda deyarli bir lahzada ishga tushirish bilan nihoyatda tez sotiladi. , kam xotiradan foydalanish, cheksizgacha miqyoslash. Marketing materiallari odatda platformani begemot Spring Boot yonida yoki bir-biriga ko'rsatadigan ta'sirchan grafikalarga ega. Bu, nazariy jihatdan, ba'zan yuklash uchun bir necha daqiqa davom etadigan eski loyihalarni qo'llab-quvvatlovchi ishlab chiquvchilarning asablarini saqlaydi. Yoki bulutda ishlaydigan ishlab chiquvchilar 50 ms ichida hozir kerak bo'lganda shuncha mikrokonteynerni ishga tushirish/to'xtatish. Ammo muammo shundaki, bu (sun'iy) yalang'och metallni ishga tushirish vaqtlari va qayta joylashtirish vaqtlari loyihaning umumiy muvaffaqiyatiga deyarli hissa qo'shmaydi. Hech bo'lmaganda ular kuchli ramka infratuzilmasi, kuchli hujjatlar, hamjamiyat va kuchli ishlab chiquvchi qobiliyatlariga qaraganda kamroq ta'sir qiladi. Demak, bunga shunday qarash yaxshidir: Agar hozirgacha:- Siz oddiy ish oqimlari uchun yuzlab so'rovlarni yaratib, ORM-larning keng tarqalishiga ruxsat berasiz.
- O'rtacha murakkab monolitni ishlatish uchun sizga cheksiz gigabaytlar kerak bo'ladi.
- Sizda shunchalik ko'p kod bor va murakkablik shunchalik yuqoriki (biz hozir Hibernate kabi potentsial sekin boshlanuvchilar haqida gapirmayapmiz), ilovangizni yuklash uchun bir necha daqiqa vaqt ketadi.
Qaysi kutubxonalar sinxron Java REST qo'ng'iroqlari uchun eng yaxshisidir?
Past darajadagi texnik tomondan, siz quyidagi HTTP mijozlar kutubxonalaridan biriga ega bo'lishingiz mumkin: Java-ning mahalliy HttpClient (Java 11-dan beri), Apache-ning HttpClient yoki OkHttp . E'tibor bering, men bu erda "ehtimol" deyapman, chunki eski yaxshi JAX-RS mijozlaridan zamonaviy WebSocket mijozlarigacha bo'lgan boshqa variantlar mavjud . Har qanday holatda, tendentsiya HTTP mijozini yaratish, HTTP qo'ng'iroqlari bilan shug'ullanishdan voz kechishdir. Buning uchun siz OpenFeign loyihasini va uning hujjatlarini keyingi o'qish uchun boshlang'ich nuqtasi sifatida ko'rib chiqishingiz kerak .Asinxron Java xabar almashish uchun eng yaxshi brokerlar qaysilar?
Katta ehtimol bilan siz mashhur ActiveMQ (Classic yoki Artemis) , RabbitMQ yoki Kafka bilan uchrashasiz .- ActiveMQ va RabbitMQ an'anaviy, to'liq huquqli xabar brokerlaridir. Ular "aqlli broker" va "ahmoq foydalanuvchilar" ning o'zaro ta'sirini o'z ichiga oladi.
- Tarixan, ActiveMQ RabbitMQ/Docker/TestContainer sozlamalari bilan yumshatilishi mumkin bo'lgan oson inlining (sinov uchun) afzalliklariga ega edi.
- Kafkani an'anaviy "aqlli" broker deb atash mumkin emas. Buning o'rniga, bu aqlli iste'molchilarni qayta ishlashni talab qiladigan nisbatan "soqov" xabarlar do'koni (jurnal fayli).
Mikroservislarni sinab ko'rish uchun qanday kutubxonalardan foydalanishim mumkin?
Bu sizning to'plamingizga bog'liq. Agar sizda Spring ekotizimingiz o'rnatilgan bo'lsa, ramkaning maxsus vositalaridan foydalanish oqilona bo'lardi . Agar JavaEE Arquillian kabi bo'lsa . Mahalliy ishlab chiqish yoki integratsiya testlari uchun Oracle ma'lumotlar bazasini osongina va tez o'rnatishga yordam beradigan Docker va haqiqatan ham yaxshi Testcontainers kutubxonasini ko'rib chiqishga arziydi . Butun HTTP serverlarini soxta sinovdan o'tkazish uchun Wiremock ni tekshiring . Asinxron xabar almashishni sinab ko'rish uchun ActiveMQ yoki RabbitMQ-ni qo'llang va keyin Awaitility DSL yordamida testlarni yozing . Bundan tashqari, barcha odatiy vositalaringiz ishlatiladi - Junit , TestNG for AssertJ va Mockito . E'tibor bering, bu to'liq ro'yxat emas. Agar siz o'zingiz yoqtirgan vositani bu erda topmasangiz, uni sharhlar bo'limiga qo'ying.Barcha Java mikroservislari uchun jurnalni qanday yoqish mumkin?
Mikroservislar uchun tizimga kirish qiziqarli va juda murakkab mavzu. Kamroq yoki grep buyruqlari bilan boshqarishingiz mumkin bo'lgan bitta jurnal fayliga ega bo'lish o'rniga, endi sizda n ta jurnal fayli bor va ular juda tarqoq bo'lmasligini xohlaysiz. Yog'ochni kesish ekotizimining xususiyatlari ushbu maqolada yaxshi tasvirlangan (ingliz tilida). Uni o'qib chiqishga ishonch hosil qiling va mikroservislar nuqtai nazaridan markazlashtirilgan ro'yxatga olish bo'limiga e'tibor bering . Amalda siz turli xil yondashuvlarga duch kelasiz: tizim ma'muri turli serverlardagi jurnal fayllarini to'playdigan va birlashtiradigan ma'lum skriptlarni yozadi va ularni FTP serverlariga yuklab olish uchun joylashtiradi. Parallel SSH seanslarida cat/grep/unig/sort kombinatsiyalarini ishga tushirish. Amazon AWS aynan shunday qiladi va bu haqda menejeringizga xabar berishingiz mumkin. Graylog yoki ELK Stack (Elasticsearch, Logstash, Kibana) kabi vositalardan foydalaning.Mening mikroservislarim bir-birini qanday topadi?
Hozirgacha biz mikroservislarimiz bir-biri haqida biladi va tegishli IPS-ni biladi deb taxmin qildik. Keling, statik konfiguratsiya haqida gapiraylik. Shunday qilib, bizning bank monolitimiz [ip = 192.168.200.1] xususiyatlar faylida qattiq kodlangan risk serveri [ip = 192.168.200.2] bilan gaplashish kerakligini biladi. Biroq, siz narsalarni yanada dinamik qilishingiz mumkin:- Bulutga asoslangan konfiguratsiya serveridan foydalaning, undan barcha mikroservislar oʻz mikroservislarida application.properties fayllarini joylashtirish oʻrniga oʻz konfiguratsiyalarini oladi.
- Sizning xizmat ko'rsatish namunalaringiz o'z joylashuvini dinamik ravishda o'zgartirishi mumkinligi sababli, sizning xizmatlaringiz qayerda yashashi, ularning IP manzillari va ularni qanday yo'naltirish kerakligini biladigan xizmatlarni ko'rib chiqishga arziydi.
- Endi hamma narsa dinamik, yangi muammolar paydo bo'ladi, masalan, rahbarni avtomatik tanlash: masalan, ikki marta qayta ishlamaslik uchun muayyan vazifalarni bajaradigan usta kim? Rahbar muvaffaqiyatsizlikka uchraganida uni kim almashtiradi? Qanday asosda almashtirish amalga oshiriladi?
Java mikroservislari yordamida avtorizatsiya va autentifikatsiyani qanday tashkil qilish mumkin?
Bu mavzu ham alohida hikoya qilishga arziydi. Shunga qaramay, variantlar maxsus xavfsizlik tizimlari bilan qattiq kodlangan asosiy HTTPS autentifikatsiyasidan tortib, o'zining avtorizatsiya serveri bilan Oauth2 o'rnatilishini ishga tushirishgacha.Barcha muhitlarim bir xil ko'rinishiga qanday ishonch hosil qilishim mumkin?
Mikroservissiz o'rnatishlar uchun to'g'ri bo'lgan narsa bittasi bilan tarqatish uchun ham amal qiladi. Docker/Testcontainers va Scripting/Ansible kombinatsiyasini sinab ko'ring.Savol yo'q: YAML haqida qisqacha
Keling, kutubxonalar va tegishli masalalardan bir lahzaga uzoqlashamiz va Yamlni tezda ko'rib chiqamiz. Ushbu fayl formati de-fakto "konfiguratsiyani kod sifatida yozish" formati sifatida ishlatiladi. Bundan tashqari, Ansible kabi oddiy vositalar va Kubernetes kabi gigantlar tomonidan qo'llaniladi. YAML indentatsiyasining og'rig'ini boshdan kechirish uchun oddiy Ansible faylini yozib ko'ring va kutilgandek ishlashidan oldin faylni qanchalik tahrirlashingiz kerakligini ko'ring. Va bu format barcha asosiy IDElar tomonidan qo'llab-quvvatlansa ham! Shundan so'ng, ushbu qo'llanmani o'qishni tugatish uchun qaytib keling.Yaml:
- is:
- so
- great
Taqsimlangan tranzaktsiyalar haqida nima deyish mumkin? Ishlash testi? Boshqa mavzular?
Ehtimol, bir kun kelib, qo'llanmaning keyingi nashrlarida. Hozircha hammasi shu. Biz bilan qoling!Mikroservislar bilan bog'liq kontseptual muammolar
Java-da mikroservislarning o'ziga xos muammolaridan tashqari, boshqa muammolar ham mavjud, aytaylik, har qanday mikroservis loyihasida paydo bo'ladigan muammolar. Ular asosan tashkilot, jamoa va boshqaruv bilan bog'liq.Frontend va Backend nomuvofiqligi
Frontend va Backend nomuvofiqligi ko'plab mikroservis loyihalarida juda keng tarqalgan muammodir. Bu nima degani? Faqat eski yaxshi monolitlarda veb-interfeys ishlab chiquvchilari ma'lumotlarni olish uchun ma'lum bir manbaga ega edilar. Mikroservis loyihalarida front-end ishlab chiquvchilari to'satdan ma'lumot olish uchun n ta manbaga ega bo'lishadi. Tasavvur qiling-a, siz Java-da IoT (Internet of Things) mikroservislari loyihasini yaratyapsiz. Aytaylik, siz butun Evropa bo'ylab geodeziya mashinalari va sanoat pechlarini boshqarasiz. Va bu pechlar sizga o'zlarining haroratlari va shunga o'xshash narsalar bilan muntazam yangilanishlarni yuboradi. Ertami-kechmi siz administrator interfeysida pechlarni topishni xohlashingiz mumkin, ehtimol "o'choq qidirish" mikroservislaridan foydalaning. Backend hamkasblaringiz domenga asoslangan dizayn yoki mikroservis qonunlarini qanchalik qat'iy qo'llashiga qarab , "pechni top" mikroxizmati turi, modeli yoki joylashuvi kabi boshqa ma'lumotlarni emas, balki faqat pech identifikatorlarini qaytarishi mumkin. Buning uchun frontend ishlab chiquvchilari birinchi mikroservisdan olgan identifikatorlari bilan "o'choq ma'lumotlarini olish" mikroxizmatida bitta yoki qo'shimcha qo'ng'iroqlarni (peyjingni amalga oshirishga qarab) amalga oshirishlari kerak bo'ladi. Va bu oddiy misol bo'lsa ham, haqiqiy (!) loyihadan olingan bo'lsa ham, u quyidagi muammoni ko'rsatadi: supermarketlar juda mashhur bo'lib ketdi. Sababi, ular bilan sabzavot, limonad, muzlatilgan pitsa va hojatxona qog‘ozi sotib olish uchun 10 ta turli joyga borishingiz shart emas. Buning oʻrniga siz bir joyga borasiz. Bu osonroq va tezroq. Xuddi shu narsa front-end va mikroservis ishlab chiquvchilari uchun ham amal qiladi.Boshqaruv umidlari
Rahbariyat endi (umumiy) loyiha uchun cheksiz sonli ishlab chiquvchilarni yollashlari kerak degan noto'g'ri taassurotda, chunki endi ishlab chiquvchilar bir-biridan mutlaqo mustaqil, har biri o'z mikroservislarida ishlashi mumkin. Oxirida faqat bir oz integratsiya ishlari talab qilinadi (ishga tushirishdan biroz oldin). Aslida, bu yondashuv juda muammoli. Keyingi paragraflarda nima uchun buni tushuntirishga harakat qilamiz."Kichikroq bo'laklar" "yaxshiroq bo'laklarga" teng emas
20 qismga bo'lingan kod bir butun bo'lakdan ko'ra yuqori sifatga ega bo'ladi deb o'ylash katta xato bo'ladi. Sifatni faqat texnik nuqtai nazardan oladigan bo'lsak ham, bizning shaxsiy xizmatlarimiz hali ham qo'llab-quvvatlanmaydigan kod qatlamlarini bosib o'tib, ma'lumotlar bazasidan foydalanuvchi tanlash uchun 400 Hibernate so'rovini bajarishi mumkin. Yana bir bor Saymon Braun iqtibosiga qaytamiz: agar siz monolitlarni to'g'ri qura olmasangiz, to'g'ri mikroservislarni yaratish qiyin bo'ladi. Mikroservis loyihalarida xatolarga chidamlilik haqida gapirish ko'pincha juda kech. Shunday qilib, ba'zida mikroservislarning haqiqiy loyihalarda qanday ishlashini ko'rish qo'rqinchli. Buning sababi shundaki, Java dasturchilari xatolarga chidamlilik, tarmoq va boshqa tegishli mavzularni kerakli darajada o'rganishga har doim ham tayyor emaslar. "Bo'laklar" ning o'zlari kichikroq, ammo "texnik qismlar" kattaroqdir. Tasavvur qiling-a, sizning mikroservislar jamoasidan ma'lumotlar bazasi tizimiga kirish uchun texnik mikroservis yozish so'raladi, masalan:@Controller
class LoginController {
// ...
@PostMapping("/login")
public boolean login(String username, String password) {
User user = userDao.findByUserName(username);
if (user == null) {
// обработка варианта с несуществующим пользователем
return false;
}
if (!user.getPassword().equals(hashed(password))) {
// обработка неверного пароля
return false;
}
// 'Ю-ху, залогинorсь!';
// установите cookies, делайте, что угодно
return true;
}
}
Endi sizning jamoangiz bu juda oddiy va zerikarli ekanligiga qaror qilishi mumkin (va, ehtimol, ishbilarmonlarni ham ishontirishi mumkin), login xizmatini yozish o'rniga, hech qanday haqiqiy va aniq biznes talablarisiz haqiqatan ham foydali UserStateChanged mikroservisni yozish yaxshiroqdir. Va hozirda ba'zi odamlar Java-ga dinozavr kabi munosabatda bo'lganligi sababli, keling, UserStateChanged mikroservisimizni zamonaviy Erlang tilida yozaylik. Va keling, bir joyda qizil-qora daraxtlardan foydalanishga harakat qilaylik, chunki Stiv Yegge Google'ga murojaat qilish uchun ularni ichkaridan bilish kerakligini yozgan. Integratsiya, texnik xizmat ko'rsatish va umumiy dizayn nuqtai nazaridan, bu bitta monolit ichida spagetti kodining qatlamlarini yozish kabi yomon. Sun'iy va oddiy misol? Ha shunaqa. Biroq, bu haqiqatda sodir bo'lishi mumkin.
Kamroq qismlar - kamroq tushunish
Shunda tabiiy ravishda tizimni, uning jarayonlarini va ish oqimlarini tushunish haqida savol tug'iladi, lekin shu bilan birga siz ishlab chiquvchi sifatida faqat izolyatsiya qilingan mikroservisingizda ishlash uchun javobgarsiz [95: login-101: updateUserProfile]. Bu avvalgi xatboshiga mos keladi, lekin tashkilotingizga, ishonch va aloqa darajasiga qarab, bu mikroservis zanjirida tasodifiy buzilish sodir bo'lsa, bu juda ko'p chalkashliklarga, yelka qisishga va ayblashga olib kelishi mumkin. Va sodir bo'lgan voqea uchun to'liq javobgarlikni o'z zimmasiga oladigan hech kim yo'q. Va bu umuman insofsizlik masalasi emas. Aslida, turli qismlarni ulash va ularning loyihaning umumiy rasmidagi o'rnini tushunish juda qiyin.Aloqa va xizmat ko'rsatish
Aloqa va xizmat ko'rsatish darajasi kompaniya hajmiga qarab juda farq qiladi. Biroq, umumiy munosabatlar aniq: qanchalik ko'p bo'lsa, shunchalik muammoli.- №47 mikroservisni kim boshqaradi?
- Ular hozirgina mikroservisning yangi, mos kelmaydigan versiyasini o'rnatdimi? Bu qayerda hujjatlashtirilgan?
- Yangi xususiyatni so'rash uchun kim bilan gaplashishim kerak?
- Bu tilni bilgan yagona odam kompaniyadan ketganidan keyin Erlangdagi mikroservisni kim qo'llab-quvvatlaydi?
- Bizning barcha mikroservis jamoalarimiz nafaqat turli dasturlash tillarida, balki turli vaqt zonalarida ham ishlaydi! Bularning barchasini qanday qilib to'g'ri muvofiqlashtiramiz?
GO TO FULL VERSION