簡體   English   中英

Java RMI:用於不傳遞對象,僅將其方法公開給客戶端實例的體系結構

[英]Java RMI: Architecture for NOT passing an object, just exposing its methods to a client-side instance

我有一個大型的基於Java的API,並且出於安全原因,我試圖將其划分為客戶端到應用程序服務器體系結構。 我已經確定沒有現成的所謂“ Java應用服務器”(框架)可以在這里為我提供幫助,但是如果我錯了,請指出一個不限於面向Web的應用程序。 也就是說,我正在“滾動自己的”應用程序服務器。

現有的API已經通過方法調用訪問了單個“對象”的實例化實例,該實例實現了需要完成的工作。

IIUC(如果我理解正確的話),我可以設置一個RMI服務器,以實例化API對象的各個實例-可能實例化它們的池-然后將它們作為對象實例“傳遞給”來自請求客戶端請求的客戶端的入站RMI調用。實例。 然后,他們可以調用該實例的任何方法,並且這些方法的所有實際處理都在服務器端進行,並且任何結果都是通過RMI機制返回的。

我認為到目前為止,一切都很好。 現在,對於我想澄清的棘手部分,請:

如果我做對了,我會進一步理解,所有方法和屬性都是公開的(通過“擴展UnicastRemoteObject”,或者我可以通過創建一個中間類定義其方法來限制希望遠程使用的屬性和方法)都在接口中定義。

我是否正確理解,使用這種方法之后就可以擁有原始的API,並且只需要創建一個“封裝類”即可公開需要公開的內容?

轉向更高級的設計,因為實例化是昂貴的,我想擁有一組預先實例化的實例。 我是否需要另一個實例化一堆這些可暴露對象,然后將它們“返回”給調用客戶端的類? 還是可以在現有的RMI機制中或在我的封裝API-Server類本身中以某種方式進行?

擴展UnicastRemoteObject (或導出Remote對象)並實現擴展Remote的接口時,將公開在該Remote接口中聲明的方法以進行遠程調用。 當客戶端調用這些方法時,該方法的執行在服務器上進行。 僅將方法結果中包含的數據(如果有)公開給客戶端。

如果需要遠程對象的多個實例,則可以將它們綁定到注冊表中的不同名稱下,也可以創建另一個返回Remote服務實例的遠程類型。 這是一個簡單的草圖:

interface MyService extends Remote {
  void doStuff() throws RemoteException;
}

interface MyServiceManager extends Remote {
  MyService getService() throws RemoteException;
}

然后,您將在RMI注冊表中綁定單個MyServiceManager實例,以便客戶端可以找到它。 MyService實例不應在注冊表中綁定; 匿名實例將通過MyServiceManager返回。 由於這些對象也是Remote ,因此僅存根將返回給客戶端,並且當客戶端在其上調用方法時,該方法將在服務器上執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM