RMI方式实现RPC远程调用

本文介绍如何使用Java自带的RMI方式实现RPC远程过程调用。通过实例展示服务接口、服务提供者和服务消费者的实现过程,包括接口声明、服务实现、远程服务启动与消费等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.服务提供方

service实现类

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();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值