使用 RMI 实现方法的远程调用

RMI 介绍

RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。

 

服务提供者实现

创建 rmi-provider 项目

 

创建 UserService 接口

package com.bjsxt.service;

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

public interface UserService extends Remote {
    public String helloRmi(String name) throws RemoteException;
}

 

创建 UserServiceImpl 实现类

package com.bjsxt.service.impl;

import com.bjsxt.service.UserService;

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

public class UserServiceImpl extends UnicastRemoteObject implements UserService {

    public UserServiceImpl() throws RemoteException {
        super();
    }

    @Override
    public String helloRmi(String name) throws RemoteException {
        return "hello "+name;
    }
}

 

发布远程服务

package com.bjsxt.app;

import com.bjsxt.service.UserService;
import com.bjsxt.service.impl.UserServiceImpl;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

public class ProviderApp {
    public static void main(String[] args) {
        try {
            //将远程服务发布在本地的 8888 端口
            LocateRegistry.createRegistry(8888);
            //发布的远程服务的访问 url
            String name="rmi://localhost:8888/rmi";
            //创建一个提供具体服务的远程对象
            UserService userService=new UserServiceImpl();
            //给提供远程服务的对象绑定一个 url
            Naming.bind(name,userService);
            System.out.println("=============发布 rmi 远程服务============");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

 

服务消费者实现

创建 rmi-consumer 项目

拷贝 UserService 接口

消费远程服务

package com.bjsxt.app;

import com.bjsxt.service.UserService;

import java.rmi.Naming;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

public class ConsumerApp {
    public static void main(String[] args) {

        List<String> urls = new ArrayList<>();
        urls.add("rmi://localhost:7777/rmi");
        urls.add("rmi://localhost:8888/rmi");
        urls.add("rmi://localhost:9999/rmi");

        String url = null;
        while (true) {
            try {
                //通过随机的负载均衡算法,产生随机的访问地址
                int index = ThreadLocalRandom.current().nextInt(urls.size());
                url = urls.get(index);

                //通过发布的远程服务的 url,获得远程服务的代理对象
                UserService userService = (UserService) Naming.lookup(url);
                System.out.println("获得的远程服务的代理对象:" + userService.getClass().getName());
                //通过远程服务的代理对象调用远程服务方法
                String result = userService.helloRmi("=======" + url + "==== rmi");
                System.out.println("result" + result);
                Thread.sleep(3000);
            } catch (Exception e) {
                urls.remove(url); //剔除不可用的服务的地址
                e.printStackTrace();
            }

        }
    }
}

 

RMI 相关 API 总结

 

代码结构重构

建立 rmi-resource 公共资源项目

 

拷贝 UserService 接口

删除 rmi-provider UserService 接口

删除 rmi-consumer UserService 接口

rmi-provider 添加依赖

 

rmi-consumer 添加依赖

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值