+13

Giới thiệu về Java RMI(Remote Method Invocation)

Lập trình đối tượng phân tán là một vấn đề nóng bỏng của công nghệ phân tán phần mềm ngày này. Java là ngôn ngữ đi tiên phong với RMI(Remote Method Invocation), một kỹ thuật cài đặt các đối tượng phân tán vô cùng hiệu vô cùng hiệu quả và linh động

Thông thường các chương trình của chúng ta được viết dưới dạng thủ tục hàm và việc các hàm gọi lẫn nhau và truyền tham số chỉ xảy ra ở máy cục bộ. Kỹ thuật RMI - mang ý nghĩa là triệu gọi phương thức từ xa là cách thức giao tiếp giữa các đối tượng trong Java có mã lệnh cài đặt nằm ở trên các máy khác nhau có thể triệu gọi lẫn nhau.

rmi.png

Để giải quyết một số vấn đề trong việc truyền thông giữa client <-> Server. RMI không gọi trực tiếp mà thông qua lớp trung gian. Lớp này tồn tại ở cả 2 phía client và server.

-> Lớp Client gọi là Stub

-> Lớp ở máy Server gọi là Skel(Skeleton)

  1. Các đặc tính của RMI
  • RMI là mô hình đối tượng phân tán của Java, nó giúp cho việc truyền thông giữa các đối tượng phân tán được dễ dàng hơn
  • RMI là API bậc cao được xây dựng dựa trên việc lập trình socket
  • RMI không những cho phép chúng ta truyền dữ liệu giữa các đối tượng trên các hệ thống máy tính khác nhau và còn gọi được các phương thức trong các đối tượng ở xa.
  • Việc truyền dữ liệu giữa các máy khác nhau được sử lý một cách trong suốt bởi máy ảo Java(Java virtual machine)
  • RMI cung cấp cơ chế callback, nó cho phép Server triệu gọi các phương thức ở Client
  1. Kiến trúc cơ bản của RMI Untitled_2.png

3.Truyền tin trong RMI:

  • RMI sử dụng lớp trung gian để truyền tin Skeleton và Stub
  • Lớp Stub dùng ở client
  • Lớp Skeleton dùng ở Server
  • Java sử dụng rmic.exe để tạo ra các lớp trung gian
  • TCP Socket

4.Cách thức hoạt động của RMI:

  • Server RMI phải đăng ký với 1 dịch vụ tra tìm và đăng ký tên miền.
  • Sau khi server được đăng ký, nó sẽ chờ các yêu cầu của RMI client.
  • Các client RMI sẽ gửi thông điệp RMI để gọi một phương thức trên một đối tượng từ xa.
  • Ứng dụng client yêu cần một tên dịch vụ cụ thể và nhận một URL trỏ tới tài nguyên từ xa.
  1. Hướng dẫn cài đặt một ứng dụng RMI:

5.1. Định nghĩa một Interface dùng chung Interface này như là một thông điệp cho cả Server và Client, cả client và server đều phải tuân thủ nó, chỉ được triển khai và gọi các phương thức cho phép. Các phương thức đều kèm theo throws RemoteException

IAccount.java

package com.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;

import com.bean.User;

/**
 * @author framgiavn
 */
public interface IAccount extends Remote {

    /**
     * @return
     * @throws RemoteException
     */
    public User getUser() throws RemoteException;
}

5.2. Cài đặt trên server

Tạo một lớp thực thi Implement cho Interface

AccountServiceImpl.java

package com.sept.server.impl;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import com.bean.User;
import com.rmi.IAccount;

/**
 *
 * @author framgiavn
 *
 */
public class AccountServiceImpl extends UnicastRemoteObject implements IAccount {
    private static final long serialVersionUID = 1L;

    public AccountServiceImpl() throws RemoteException {
    }

    public User getUser() {
        User u = new User();
        u.setId(23);
        u.setUname("framgia");
        u.setPasswd("222");
        return u;
    }
}

Cài đặt cho đối tượng trên Server: RMIServer.java

package com.sept.server.impl;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

import com.rmi.IAccount;

/**
 * @author framgiavn
 */
public class RMIServer {
    public static void main(String args[]) {

        try {
            IAccount rAccount = new AccountServiceImpl();

            LocateRegistry.createRegistry(6789);

			// Đăng ký đối tượng này với rmiregistry
            Naming.bind("rmi://192.168.1.230:6789/SeptemberRMI", rAccount);

            System.out.println(">>>>>INFO: RMI Server started!!!!!!!!");
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (AlreadyBoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

5.3 Cài đặt đối tượng trên client: RMIClient.java

package com.sept.client.impl;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import com.rmi.IAccount;

/**
 *
 * @author framgiavn
 *
 */
public class RMIClient {
    public static void main(String args[]) {
        try {
            //Xác định RMI máy chủ.
            IAccount iAccount = (IAccount) Naming.lookup("rmi://192.168.1.230:6789/SeptemberRMI");
            System.out.println("Name: " + iAccount.getUser().getUname());
        } catch (NotBoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

6.Thực thi ứng dụng

  • Khởi động server:

Screen Shot 2015-09-28 at 09.14.39.png

  • Thực thi client, gọi hàm từ server RMI

Screen Shot 2015-09-28 at 09.36.29.png

Trên là giới thiệu cơ bản về Java RMI hy vọng các bạn hứng thú với việc lập trình ứng dụng phân tán

Thông tin thêm về Java RMI các bạn có thể tham khảo ở đây RMI

Source code ví dụ các bạn có thể tham khảo tại đây Code


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí