• RMI 实现的rpc 远程过程调用 Java



    在前面一片文章里面 ,简单的实现了keras  深度学习的数字识别程序代码 后 ,一直就在想 训练出来的模型怎么包装成SOA 服务使用,咨询了下京东 金融的同事 ,他们使用的是京东自己的soa 框架 jsf  ,还有就是当当网的dubbox  ,这个是源于阿里的dubbo。最近也看到一个朋友的简历上有很多关于dubbo 的描述 ,看来业界对这个还是情有独钟的 。


    搭建前面的jsf  和 dubbox  看起来不容易实现,所以想尝试 使用最简单的rpc 实现 ,因此才有了今天的rmi 的 codes  。这个code  还没有实现读取模型的操作 。是一个建议版本

    。未来是想实现server 端读取model ,client 读取一个28*28 的数字 ,调用server端的模型,计算数字本身的真实值 。



    定义一个借口 ,未来是要读取model的

    package com.jd.rmi.interfaces;
    
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    
    public interface  IService extends Remote{
        public String queryName(String no) throws RemoteException;
    }
    

    借口的实现codes


    package com.jd.rmi.Impl;
    
    import com.jd.rmi.interfaces.IService;
    
    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;
    
    public class ServiceImpl extends UnicastRemoteObject implements IService{
    
    
        /**
         * @throws RemoteException
         */
    
        public ServiceImpl() throws RemoteException {
            super();
        }
    
        public String queryName(String no) throws RemoteException{
            // 方法的具体实现
            System.out.println("hello " + no);
            return String.valueOf("current timestamp is :"+ System.currentTimeMillis());
        }
    }
    

    上面的操作都是针对业务处理的逻辑

    下面是实现一个服务器端的server服务

    package com.jd.rmi.server;
    
    import com.jd.rmi.Impl.ServiceImpl;
    
    import java.rmi.AlreadyBoundException;
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    
    public class Server {
    
        /**
         * RMI (Remote Method Invocation)
    
         RMI 采用stubs 和 skeletons 来进行远程对象(remote object)的通讯。
         stub 充当远程对象的客户端代理,有着和远程对象相同的远程接口,
         远程对象的调用实际是通过调用该对象的客户端代理对象stub来完成的,
         通过该机制RMI就好比它是本地工作,采用tcp/ip协议,
         客户端直接调用服务端上的一些方法。
         优点是强类型,编译期可检查错误,缺点是只能基于JAVA语言,客户机与服务器紧耦合
         * @param args
         */
    
        public static void main(String[] args){
    
            //Registration manager
            Registry registry = null;
    
            try {
               // registry = LocateRegistry.getRegistry("127.0.0.1" ,8088);
                registry = LocateRegistry.createRegistry(8088);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
    
            try {
                //create a server
                ServiceImpl server = new ServiceImpl();
                //server bind to registry
                registry.bind("Ethan",server);
                System.out.println("bind to server...");
            } catch (RemoteException e) {
                e.printStackTrace();
            } catch (AlreadyBoundException e) {
                e.printStackTrace();
            }
    
        }
    }
    

    有了服务器端,也就少不了client 端了


    package com.jd.rmi.client;
    
    import com.jd.rmi.interfaces.IService;
    
    import java.rmi.NotBoundException;
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    
    public class client {
    
        public static void main(String[] args){
    
            Registry registry = null;
    
            try {
                //get server manager from host server
                registry = LocateRegistry.getRegistry("127.0.0.1",8088);
                // try list all registry
    
                String[] list = registry.list();
                for(String s : list){
                    System.out.println(s);
                }
    
            } catch (RemoteException e) {
                e.printStackTrace();
            }
    
            try {
               IService server = (IService)registry.lookup("Ethan");
               String resutl = server.queryName("beautiful moon 1");
               System.out.println("result from remote - " + resutl);
            } catch (RemoteException e) {
                e.printStackTrace();
            } catch (NotBoundException e) {
                e.printStackTrace();
            }
    
    
        }
    }
    



  • 相关阅读:
    会话 终端
    linux 守护进程(daemon process)代码-详细注释
    linux进程及进程控制
    POSIX 消息队列 之 概述 链接方式
    管道和FIFO 一
    菜鸟从零学编程(七)——搭建一个完整的Java开发环境
    谈《赢》之慧眼识人
    kgdb接收一个数据包详解
    MapReduce调度与执行原理之作业初始化
    System Request 进入KDB模式过程详解
  • 原文地址:https://www.cnblogs.com/TendToBigData/p/10501206.html
Copyright © 2020-2023  润新知