Dubbo(一) 使用Java RMI 实现RPC(远程过程调用)

Java RMI(Remote Method Invocation) 是jdk1.2 引入的一套Java自带 RPC实现方案。

实现过程如下:

一、远程服务端

  1. 编写远程接口继承java.rmi.Remote 接口
  2. 编写远程接口实现类并继承java.rmi.server.UnicastRemoteObject 类
  3. 编写远程启动类,实现指定注册服务端口并注册实例到rmi注册服务器上

二、客户端

  1. 编写本地接口继承java.rmi.Remote 接口,与远程服务端接口保持包名参数等一致。
  2. 使用Naming.lookup 返回与指定名称关联的远程对象的引用
  3. 使用引用对象进行调用远程方法

三、代码实现

3.1 远程接口 service.HelloService.java

该接口需要继承java.rmi.Remote 接口

package service;

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

public interface HelloService extends Remote {
    public String sayHello(String name)  throws RemoteException;
}

 3.2 远程接口实现service.impl.HelloServiceImpl

该实现类需要实现远程接口以及继承java.rmi.server.UnicastRemoteObject 类,实现序列化。

package service.impl;

import service.HelloService;

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

/**
 * @author huizi
 */
public class HelloServiceImpl  extends UnicastRemoteObject implements HelloService {

    public HelloServiceImpl() throws RemoteException {
    }

    public String sayHello(String name)throws RemoteException {
        System.out.println("这是远程方法执行逻辑.........");
        return name+"执行了远程方法 SayHello";
    }
}

3.3 远程启动类(重点)

在该类中需要指定注册服务器的端口,以及将需要进行注册的实例进行注册操作。

package app;

import service.HelloService;
import service.impl.HelloServiceImpl;

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

public class ServiceMain {

    public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {

        //1 启动RMI注册服务,指定端口号
        LocateRegistry.createRegistry(9999);
        //2,创建要被访问的远程对象实例
        HelloService service = new HelloServiceImpl();

        //3,把远程对象实例注册到RMI注册服务器上
        Naming.bind("rmi://127.0.0.1:9999/HelloService",service);

        System.out.println("服务端启动运行中....");

    }
}

3.4 客户端接口 

package service;

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

public interface HelloService extends Remote {
    public String sayHello(String name)  throws RemoteException;
}

3.5 客户端调用类

在该类中使用Naming.lookup("rmi://127.0.0.1:9999/HelloService") 获取远程对象引用,并使用客户端接口类进行远程调用。

package app;

import service.HelloService;

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

public class ClientMain {

    public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
        HelloService helloService = (HelloService) Naming.lookup("rmi://127.0.0.1:9999/HelloService");
        String resultStr = helloService.sayHello("PC客户端 ");
        System.out.println(resultStr);
    }
}

四、启动运行 先启动远程短,在启动客户端调用,打印如下:

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值