RMI — Java dasturlarida bir Java Virtual Machine ichidagi obyektga boshqa JVM yoki tarmoqdagi processdan method chaqirish imkonini beradigan remote object texnologiyasi. To‘liq nomi Remote Method Invocation.
RMI RPC g‘oyasini object-oriented model bilan birlashtiradi. Client remote object interface’i orqali method chaqiradi, framework argument va return qiymatlarni tarmoq bo‘ylab uzatadi.
Remote interface
Remote service Java interface orqali belgilanadi.
Interface odatda remote marker va remote exception semantikasiga ega bo‘ladi.
Masalan:
public interface UserService extends Remote {
User findUser(long id) throws RemoteException;
}
Client va server ayni contractni biladi.
Remote object
Server remote interface’ni amalga oshiradigan obyekt yaratadi.
Bu object remote invocationlarni qabul qilish uchun export qilinadi.
Framework kelgan requestni tegishli Java methodga yo‘naltiradi.
Stub
Client remote object bilan stub orqali ishlaydi.
Stub lokal objectga o‘xshash ko‘rinadi, ammo har method:
- serialization;
- network;
- remote execution;
- response;
- exception
jarayonini bajaradi.
Remote chaqiriqning qimmatligi interface design’da hisobga olinadi.
Registry
RMI Registry remote object nomi va reference’sini saqlaydigan lookup service.
Server objectni ma’lum nom bilan registryga bog‘laydi:
UserService
Client registrydan shu nomni qidirib remote reference oladi.
Registry production service discoveryning to‘liq o‘rnini bosmasligi mumkin.
Naming
Remote object lookup odatda host, port va service nomiga tayanadi.
Client qaysi registryga ishonishini bilishi kerak.
Noto‘g‘ri yoki zararli registry clientga attacker object reference’ini berishi mumkin.
Transport security va deployment tarmog‘i muhim.
Serialization
RMI Java objectlarini serialize qilib tarmoq orqali yuborishi mumkin.
Serializable object graph:
ni o‘z ichiga oladi.
Untrusted Java deserialization tarixan katta security xavf yaratgan.
By value
Oddiy serializable object argument yoki return qiymat sifatida yuborilganda nusxa sifatida uzatiladi.
Serverdagi object va clientdagi nusxa keyinchalik mustaqil bo‘ladi.
Bu pass-by-valuega yaqin semantika.
By reference
Remote objectning o‘zi serializable data sifatida emas, remote reference orqali uzatilishi mumkin.
Client keyin shu reference orqali boshqa remote methodlarni chaqiradi.
Bu distributed object graph yaratishi mumkin.
Lifecycle va failure murakkablashadi.
RemoteException
Network yoki remote server xatosi lokal business exceptiondan farq qiladi.
Remote method:
- connection failure;
- timeoutga yaqin holat;
- server unavailable;
- serialization xatosi;
- remote exception
qaytarishi mumkin.
Client bu holatlarni alohida boshqaradi.
Distributed garbage collection
RMI remote object reference’lari uchun distributed garbage collection mexanizmiga ega bo‘lishi mumkin.
Client reference’dan foydalanmay qo‘ysa server object lifecycle’iga signal beriladi.
Network uzilishi va lease modeli sabab remote resource darhol yo‘q qilinmasligi mumkin.
Callback
Client o‘z remote objectini serverga reference sifatida berishi mumkin.
Server keyin client methodini chaqiradi.
Bu callback, notification yoki distributed listener uchun ishlatiladi.
Firewall, NAT va client availability bunday modelni murakkablashtiradi.
Activation
Tarixiy RMI mexanizmlarida remote object talab bo‘lganda ishga tushirilishi mumkin edi.
Modern deployment ko‘proq application server, container yoki service orchestratorga tayanadi.
Lifecycle alohida platforma tomonidan boshqariladi.
Security manager va policy
Eski Java RMI deploymentlari security manager va policy file bilan permissionlarni cheklagan.
Java platformasi evolyutsiyasi sabab bu modelning holati versiyaga bog‘liq.
Zamonaviy tizim process isolation, network policy va minimal JVM permissionga tayanadi.
TLS
Default RMI transporti har deploymentda avtomatik TLS bermasligi mumkin.
Custom socket factory yoki himoyalangan tunnel ishlatilishi mumkin.
Client va server authenticationi, certificate validation va hostname verification to‘g‘ri sozlanadi.
Firewall
RMI registry uchun ma’lum port ishlatilsa ham remote object boshqa dynamic portda tinglashi mumkin.
Bu firewall va NAT konfiguratsiyasini qiyinlashtiradi.
Fixed port yoki proxy architecture ishlatilishi mumkin.
RMI va RPC
RPC umumiy remote procedure modelidir.
RMI Java object, interface va serialization bilan chambarchas bog‘langan.
RMI Java-to-Java muhitida qulay, polyglot microservice uchun gRPC yoki HTTP API ko‘proq mos bo‘lishi mumkin.
RMI-IIOP
RMI interface’larini CORBA/IIOP bilan ishlatishga mo‘ljallangan tarixiy integration mavjud bo‘lgan.
Bu enterprise Java va boshqa CORBA tizimlari orasida interoperability yaratishga qaratilgan.
Zamonaviy yangi tizimlarda kamroq uchraydi.
Security xavfi
RMI endpoint internetga nazoratsiz ochilmasligi kerak.
Risklar:
- unsafe deserialization;
- noma’lum registry;
- weak authentication;
- exposed management;
- codebase loadingga oid tarixiy imkoniyat;
- remote method abuse.
Faqat ishonchli type va qat’iy network boundary ishlatiladi.
Object versioni
Client va server bir xil class nomiga ega bo‘lsa ham field va serialization versiyasi farq qilishi mumkin. serialVersionUIDga oid moslik va shared contract deploymentda boshqariladi. Java class’larini to‘liq domain object sifatida uzatish ikki tomon release’ini qattiq bog‘laydi.
Class loading
Tarixiy RMI imkoniyatlarida remote codebase’dan class yuklash bilan bog‘liq mexanizmlar mavjud bo‘lgan. Zamonaviy xavfsiz deployment untrusted remote class loadingga tayanmaydi. Classpath va allowed serialization type’lar oldindan nazorat qilinadi.
Migration
Legacy RMI service HTTP yoki gRPCga ko‘chirilganda avval adapter va aniq DTO contract yaratilishi mumkin. Bu Java-specific object reference va serializationni tashqi API’dan ajratadi.
Bog‘liq tushunchalar
Remote Method Invocation, Java, Remote interface, Stub, RMI Registry, Java serialization, RPC, Remote object, Distributed garbage collection, RemoteException