RMI方式でRPCリモートコールを実現

3476 ワード

RPC:
RPCとは,以前に我々自身がメソッドをローカルで宣言して呼び出し,メソッド宣言を他のサーバで行い,リモート呼び出しメソッドの実行,メソッドの実行をリモートサーバで行う.ここで、リモートメソッドを呼び出すのはサービス消費者と呼ばれ、リモートメソッドが実行するサーバと呼ばれるプロバイダを提供する.
RMI方式:
  • は、サービス消費開始要求をサーバプロバイダに実現する、サービスプロバイダは、メソッドを呼び出して機能処理
  • を完了する.
  • 後、処理結果はサーバ消費者に応答する.
  • 準拠プロトコル:RMIプロトコル
  • の特徴:RMI方式はJavaが持参した方式である.
  • 使用:参照ソース
  • まとめ:
  • RMI実装RPCは、動的エージェント方式に基づいて実装される.(JDKダイナミックエージェント)
  • リアルオブジェクトは、サービスプロバイダ
  • にある.
  • エージェントは、サービス消費者に存在する.
  • であり、エージェントオブジェクト内のエージェントメソッドは、リモートコールリアルメソッドを実現する.

  • 注意:
  • RMIを使用する場合、リモートアクセスのインタフェースに基づいて、サービス消費者サービスプロバイダに宣言する必要があります.
  • Mavenツールを使用して、異なるプロジェクトで使用するクラスリソースを個別にパッケージ化する必要があります.


  • コード#コード#
    1.サービスインタフェースは単独でmavenプロジェクトとする
    package com.bjsxt.service;
    
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    /**
     *                    Remote  。
     * 
     * @author Administrator
     *
     */
    public interface UserService extends Remote{
        /**
         *              ,           
         * @param name
         * @return
         * @throws RemoteException
         */
        public String sayHello(String name) throws RemoteException;
    }
    

    2.サービス提供者
    サービス実装クラス
    package com.bjsxt.service.impl;
    
    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;
    
    import com.bjsxt.service.UserService;
    
    public class UserServiceImpl extends UnicastRemoteObject  implements UserService{
    
        public UserServiceImpl() throws RemoteException {
            super();
        }
    
        @Override
        public String sayHello(String name) throws RemoteException {
            
            return "Hello"+name;
        }
        
    }
    

    サービスの開始
    package com.bjsxt.main;
    
    import java.rmi.Naming;
    import java.rmi.registry.LocateRegistry;
    
    import com.bjsxt.service.UserService;
    import com.bjsxt.service.impl.UserServiceImpl;
    
    public class RmiProviderApp {
        public static void main(String[] args) {
            /****
             *   jvm,      
             */
            try {
                //              
                LocateRegistry.createRegistry(8888);
                
                //         URL
                String name="rmi://localhost:8888/rmi";
                
                //  UserServiceImpl     ,         
                UserService userService = new UserServiceImpl();
                
                //          ,    URL
                Naming.bind(name, userService);
                
                System.out.println("===========  rmi    ============");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }
    

    3.サービス消費者
    package com.bjsxt.main;
    
    import java.rmi.Naming;
    
    import com.bjsxt.service.UserService;
    
    public class RmiConsumerApp {
        public static void main(String[] args) {
            /***
             *   jvm,       
             */
            
            try {
                
                //         URL
                String name="rmi://localhost:8888/rmi";
                //  url           
                UserService userService=(UserService) Naming.lookup(name);
                
                System.out.println("---"+userService.getClass());
    
                //      
                String result = userService.sayHello("  ");
                
                System.out.println("result="+result);
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
    }