Ing pandhuan iki, sampeyan bakal sinau apa microservices Java, carane ngrancang lan nggawe. Iki uga nyakup pitakonan babagan perpustakaan microservice Java lan kemungkinan nggunakake layanan mikro. Terjemahan lan adaptasi Java Microservices: A Practical Guide .
Java Microservices: Dasar
Kanggo ngerti layanan mikro, sampeyan kudu nemtokake apa sing dudu. Apa ora "monolit" - monolit Jawa: apa iku lan apa kaluwihan utawa cacat?Apa iku monolit Jawa?
Bayangake sampeyan kerja ing bank utawa startup fintech. Sampeyan menehi pangguna aplikasi seluler sing bisa digunakake kanggo mbukak akun bank anyar. Ing kode Jawa iki bakal nyebabake ana kelas controller. Disederhanakake, katon kaya iki:@Controller
class BankController {
@PostMapping("/users/register")
public void register(RegistrationForm form) {
validate(form);
riskCheck(form);
openBankAccount(form);
// etc..
}
}
Sampeyan mbutuhake controller kanggo:
- Dikonfirmasi formulir registrasi.
- Priksa risiko alamat pangguna kanggo mutusake manawa bakal menehi akun bank.
- Mbukak akun bank.
BankController
bakal rangkep bebarengan karo liyane saka sumber menyang bank.jar utawa bank.war file kanggo penyebaran prajurit - iki monolit lawas apik ngemot kabeh kode needed kanggo mbukak bank. Minangka perkiraan kasar, ukuran awal file .jar (utawa .war) bakal ana saka 1 nganti 100 MB. Saiki sampeyan mung bisa mbukak file .jar ing server sampeyan ... lan iku kabeh sing perlu kanggo masang aplikasi Java. Gambar, persegi dowo kiwa ndhuwur: penyebaran mono(lithic) bank java -jar bank.jar (cp .war/.ear menyang appserver). persegi dowo tengen: mbukak browser.
Apa masalah karo monolit Jawa?
Ora ana sing salah karo monolit Jawa. Nanging, pengalaman wis nuduhake yen ing proyek sampeyan:- Ana akeh programer / tim / konsultan sing kerja ...
- ... liwat monolit padha ing meksa saka pelanggan karo syarat banget samar ...
- ing sawetara taun ...
Carane nyuda ukuran monolit Jawa?
Pitakonan alami muncul: carane nggawe monolith luwih cilik? Saiki bank.jar sampeyan mlaku ing siji JVM, siji proses ing siji server. Ora luwih, ora kurang. Lan saiki ana pikiran sing logis: "Nanging layanan verifikasi risiko bisa digunakake dening departemen liyane ing perusahaanku! Ora ana hubungane langsung karo aplikasi perbankan monolitik! Mbok iku kudu Cut metu saka monolith lan tugasaken minangka produk kapisah? Yaiku, kanthi teknis, mlaku minangka proses Jawa sing kapisah.Apa iku microservice Java?
Ing laku, tembung iki tegese saiki telpon carariskCheck()
ora bakal digawe saka BankController: cara iki utawa komponen kacang karo kabeh kelas tambahan bakal dipindhah menyang Maven utawa Gradle project dhewe. Uga bakal disebarake lan diselehake ing kontrol versi independen saka monolit banking. Nanging, kabeh proses ekstraksi iki ora ngowahi modul RiskCheck anyar sampeyan dadi layanan mikro, amarga definisi layanan mikro mbukak kanggo interpretasi. Iki nyebabake diskusi asring ing tim lan perusahaan.
- Apa 5-7 kelas ing mikro proyek utawa apa?
- 100 utawa 1000 kelas ... isih mikro?
- Apa microservice umume ana hubungane karo jumlah kelas utawa ora?
- Ayo nelpon kabeh layanan microservice sing disebar kanthi kapisah, preduli saka ukuran utawa wates domain.
- Ayo dipikirake carane ngatur komunikasi antar layanan. Layanan mikro kita butuh cara kanggo komunikasi karo siji liyane.
Kepiye carane nggawe komunikasi antarane layanan mikro Jawa?
Umumé lan umum, ana rong pilihan - komunikasi sinkron lan asinkron.Komunikasi sinkron: (HTTP)/REST
Biasane, komunikasi sing disinkronake antarane layanan mikro dumadi liwat layanan kaya HTTP lan REST sing ngasilake XML utawa JSON. Mesthi wae, bisa uga ana pilihan liyane - njupuk paling ora Google Protocol Buffers . Yen sampeyan butuh respon langsung, luwih becik nggunakake komunikasi REST. Ing conto kita, iki persis sing kudu ditindakake, amarga verifikasi risiko dibutuhake sadurunge mbukak akun. Yen ora ana mriksa risiko, ora ana akun. Kita bakal ngrembug alat ing ngisor iki, ing bagean " Pustaka sing paling apik kanggo telpon REST Java sinkron ".Pesen - Komunikasi Asynchronous
Komunikasi layanan mikro asinkron biasane ditindakake kanthi ijol-ijolan pesen karo implementasi JMS lan/utawa nggunakake protokol kayata AMQP . Kita nulis "biasane" ing kene kanthi alasan: ayo ngomong jumlah integrasi email / SMTP ora bisa disepelekake. Gunakake nalika sampeyan ora mbutuhake respon langsung. Contone, pangguna ngeklik tombol "tuku saiki", lan sampeyan uga pengin nggawe invoice. Proses iki mesthi ora kedadeyan ing siklus panjalukan-respon tuku pangguna. Ing ngisor iki kita bakal njlèntrèhaké alat sing paling apik kanggo olahpesen Jawa asinkron .Conto: REST API telpon ing Jawa
Ayo kita nganggep kita milih komunikasi microservice sinkron. Ing kasus iki, kode Jawa kita (sing kita presented ndhuwur) ing tingkat kurang bakal katon kaya iki. (kanthi tingkat sing kurang ing kene tegese kasunyatan manawa kanggo komunikasi microservice, perpustakaan klien biasane digawe sing abstrak saka telpon HTTP sing nyata).@Controller
class BankController {
@Autowired
private HttpClient httpClient;
@PostMapping("/users/register")
public void register(RegistrationForm form) {
validate(form);
httpClient.send(riskRequest, responseHandler());
setupAccount(form);
// etc..
}
}
Adhedhasar kode kasebut, dadi jelas yen saiki kita kudu nggunakake rong layanan Java (mikro), Bank lan RiskCheck. Akibaté, kita bakal duwe loro pangolahan JVM mlaku. Iku kabeh sing perlu kanggo ngembangaken project Java microservices: mung mbangun lan masang potongan cilik (.jar utawa .war file) tinimbang siji monolithic. Jawaban kanggo pitakonan kasebut tetep ora jelas: kepiye carane ngethok monolit dadi layanan mikro? Sepira cilik potongan kasebut, kepiye carane nemtokake ukuran sing bener? Ayo priksa.
Arsitektur Microservices Jawa
Ing praktik, perusahaan ngembangake proyek layanan mikro kanthi cara sing beda-beda. Pendekatan kasebut gumantung apa sampeyan nyoba ngowahi monolit sing wis ana dadi proyek microservice utawa miwiti proyek kasebut saka awal.Saka monolith kanggo microservices
Salah sawijining ide sing paling logis yaiku ngekstrak layanan mikro saka monolit sing ana. Elinga yen awalan "mikro" ing kene ora ateges layanan sing diekstrak bakal dadi cilik; iki ora mesthi kedadeyan. Ayo ndeleng latar mburi teoritis.Idea: break monolith menyang microservices
Pendekatan layanan mikro bisa ditrapake kanggo proyek warisan. Lan mulane:- Paling asring, proyek kasebut angel dijaga / diganti / dikembangake.
- Saben uwong, saka pangembang nganti manajemen, pengin nyederhanakake.
- Sampeyan duwe (relatif) wates domain sing jelas, tegese sampeyan ngerti persis apa sing kudu ditindakake piranti lunak sampeyan.
- Dadi, bakal cukup kanggo misahake pangolahan data pangguna (kayata jeneng, alamat, nomer telpon) menyang layanan mikro sing kapisah "Manajemen Akun".
- Utawa "Modul Pemeriksa Risiko" sing kasebut ing ndhuwur sing mriksa tingkat risiko pangguna lan bisa digunakake dening akeh proyek liyane utawa malah departemen perusahaan.
- Utawa modul invoice sing ngirim invoice ing format PDF utawa liwat mail.
Implementasi gagasan: supaya wong liya nindakake
Pendekatan sing diterangake ing ndhuwur katon apik ing kertas lan diagram kaya UML. Nanging, kabeh ora dadi prasaja. Implementasi praktis mbutuhake persiapan teknis sing serius: jurang antarane pangerten babagan apa sing bakal diekstrak saka monolit lan proses ekstraksi dhewe gedhe banget. Umume proyek perusahaan tekan tahap ing ngendi pangembang wedi, ucapake, nganyarke versi Hibernate sing umur 7 taun dadi sing luwih anyar. Pustaka bakal dianyari bebarengan karo, nanging ana bebaya nyata bejat soko. Dadi pangembang sing padha saiki kudu nggali kode warisan kuno kanthi wates transaksi database sing ora jelas lan ngekstrak layanan mikro sing wis ditemtokake? Paling asring, masalah iki rumit banget lan ora bisa "ditanggulangi" ing papan tulis utawa ing rapat arsitektur. Kanggo ngutip pangembang Twitter @simonbrown: Aku bakal ngomong maneh lan maneh ... yen wong ora bisa mbangun monolith kanthi bener, microservices ora bakal mbantu. Simon BrownProyek saka awal adhedhasar arsitektur microservice
Ing kasus proyèk Jawa anyar, telu angka saka bagéan sadurungé katon rada beda:- Sampeyan miwiti karo slate resik, supaya ora ana "bagasi" kanggo njaga.
- Pangembang pengin tetep prasaja ing mangsa ngarep.
- Masalah: Sampeyan duwe gambar wates domain sing luwih kabur: sampeyan ora ngerti apa sing kudu ditindakake piranti lunak sampeyan (petunjuk: agile ;))
Arsitektur microservice teknis
Titik pisanan katon sing paling jelas kanggo pangembang, nanging ana uga sing ora kuwatir. Hadi Hariri nyaranake "Extract Microservice" refactoring ing IntelliJ. Lan sanajan conto ing ngisor iki gampang banget, implementasine sing diamati ing proyek nyata, sayangé, ora adoh banget. Sadurunge microservices@Service
class UserService {
public void register(User user) {
String email = user.getEmail();
String username = email.substring(0, email.indexOf("@"));
// ...
}
}
Kanthi substring 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());
// ...
}
}
Dadi sampeyan pancen mbungkus panggilan metode Java ing telpon HTTP, tanpa alesan sing jelas. Siji alesan, Nanging, iki: kurang pengalaman lan nyoba kanggo meksa pendekatan microservices Jawa. Rekomendasi: Aja nindakake iki.
Arsitektur microservice berorientasi alur kerja
Pendekatan umum sabanjure yaiku mbagi microservices Java menyang modul adhedhasar alur kerja. Conto nyata: Ing Jerman, nalika sampeyan menyang dhokter (umum), dheweke kudu ngrekam kunjungan sampeyan ing sistem CRM medis. Kanggo entuk pembayaran saka asuransi, dheweke bakal ngirim data babagan perawatan sampeyan (lan perawatan pasien liyane) menyang perantara liwat XML. Broker bakal ndeleng file XML iki lan (disederhanakake):- Bakal mriksa yen file XML sing bener ditampa.
- Iku bakal mriksa plausibility saka tata cara: ngomong, bocah umur setaun sing nampa telung prosedur reresik untu ing sawijining dina saka gynecologist katon rada curiga.
- Bakal nggabungake XML karo sawetara data birokrasi liyane.
- Bakal nerusake file XML menyang perusahaan asuransi kanggo miwiti pembayaran.
- Lan bakal ngirim asil menyang dhokter, menehi pesen "sukses" utawa "monggo kirim maneh rekaman iki sanalika bisa."
- Apa perlu masang enem aplikasi kanggo ngolah siji file XML?
- Apa layanan mikro iki pancen bebas saka saben liyane? Apa bisa disebarake kanthi bebas saka saben liyane? Kanthi macem-macem versi lan skema API?
- Apa sing ditindakake microservice plausibility informasi yen microservice verifikasi ora bisa digunakake? Apa sistem isih bisa digunakake?
- Apa microservices iki nuduhake database padha (padha mesthi mbutuhake sawetara data umum ing tabel DB), utawa padha duwe dhewe?
- … lan akeh liyane.
- Sampeyan ora mung kudu masang siji aplikasi, nanging paling sethithik enem.
- Sampeyan bisa uga kudu nyebarake pirang-pirang basis data, gumantung sepira sampeyan pengin mlebu ing arsitektur layanan mikro.
- Sampeyan kudu nggawe manawa saben sistem online lan bisa digunakake kanthi bener.
- Sampeyan kudu mesthekake yen telpon ing antarane layanan mikro pancen tahan banting (pirsani Kepiye carane nggawe layanan mikro Jawa dadi tahan banting?).
- Lan liya-liyane sing ditrapake persiyapan iki - saka setelan pangembangan lokal nganti tes integrasi.
- Yen sampeyan dudu Netflix (kemungkinan, sampeyan dudu Netflix) ...
- Kajaba sing duwe skills karya super kuwat ngendi sampeyan mbukak lingkungan pembangunan lan nyebabake monkey lam sing mbuwang adoh database produksi kang gampang dibalèkaké ing 5 detik.
- utawa sampeyan aran kaya @monzo lan gelem nyoba 1500 microservices mung amarga sampeyan bisa.
GO TO FULL VERSION