伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

RPC实战与核心原理

来源:本站原创 浏览:100次 时间:2022-03-31

通过一个CalculatorRemoteImpl,我们把RPC的逻辑封装进去了,客户端调用时感知不到远程调用的麻烦。

download:《极客时间》RPC实战与核心原理

下面再来看看CalculatorRemoteImpl,代码有些多,但是其实就是把上面的2、3、4几个步骤用代码实现了而已,CalculatorRemoteImpl:

public class CalculatorRemoteImpl implements Calculator {    public int add(int a, int b) {        List<String> addressList = lookupProviders("Calculator.add");        String address = chooseTarget(addressList);        try {            Socket socket = new Socket(address, PORT);            // 将请求序列化            CalculateRpcRequest calculateRpcRequest = generateRequest(a, b);            ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());            // 将请求发给服务提供方            objectOutputStream.writeObject(calculateRpcRequest);            // 将响应体反序列化            ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());            Object response = objectInputStream.readObject();            if (response instanceof Integer) {                return (Integer) response;            } else {                throw new InternalError();            }        } catch (Exception e) {            log.error("fail", e);            throw new InternalError();        }    }}

add方法的前面两行,lookupProviders和chooseTarget,可能大家会觉得不明觉厉。

分布式应用下,一个服务可能有多个实例,比如Service B,可能有ip地址为198.168.1.11和198.168.1.13两个实例,lookupProviders,其实就是在寻找要调用的服务的实例列表。在分布式应用下,通常会有一个服务注册中心,来提供查询实例列表的功能。

查到实例列表之后要调用哪一个实例呢,只时候就需要chooseTarget了,其实内部就是一个负载均衡策略。

由于我们这里只是想实现一个简单的RPC,所以暂时不考虑服务注册中心和负载均衡,因此代码里写死了返回ip地址为127.0.0.1。

代码继续往下走,我们这里用到了Socket来进行远程通讯,同时利用ObjectOutputStream的writeObject和ObjectInputStream的readObject,来实现序列化和反序列化。

最后再来看看Server端的实现,和Client端非常类似,ProviderApp:

public class ProviderApp {    private Calculator calculator = new CalculatorImpl();    public static void main(String[] args) throws IOException {        new ProviderApp().run();    }    private void run() throws IOException {        ServerSocket listener = new ServerSocket(9090);        try {            while (true) {                Socket socket = listener.accept();                try {                    // 将请求反序列化                    ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());                    Object object = objectInputStream.readObject();                    log.info("request is {}", object);                    // 调用服务                    int result = 0;                    if (object instanceof CalculateRpcRequest) {                        CalculateRpcRequest calculateRpcRequest = (CalculateRpcRequest) object;                        if ("add".equals(calculateRpcRequest.getMethod())) {                            result = calculator.add(calculateRpcRequest.getA(), calculateRpcRequest.getB());                        } else {                            throw new UnsupportedOperationException();                        }                    }                    // 返回结果                    ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());                    objectOutputStream.writeObject(new Integer(result));                } catch (Exception e) {                    log.error("fail", e);                } finally {                    socket.close();                }            }        } finally {            listener.close();        }    }}

Server端主要是通过ServerSocket的accept方法,来接收Client端的请求,接着就是反序列化请求->执行->序列化执行结果,最后将二进制格式的执行结果返回给Client。

就这样我们实现了一个简陋而又详细的RPC。  
说它简陋,是因为这个实现确实比较挫,在下一小节会说它为什么挫。
说它详细,是因为它一步一步的演示了一个RPC的执行流程,方便大家了解RPC的内部机制。




  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net