Bosh sahifa Wiki RMI

RMI

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:

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:

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