前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >手写RPC之基于TCP

手写RPC之基于TCP

原创
作者头像
用户10198968
发布于 2023-01-02 09:10:50
发布于 2023-01-02 09:10:50
4980
举报

手写RPC之基于TCP

0x01_解决服务在远端问题

image-20221227140546836
image-20221227140546836

代码结构:

代码语言:shell
AI代码解释
复制
│   │   ├── main
│   │   │   ├── java
│   │   │   │   └── com
│   │   │   │       └── bones
│   │   │   │           └── rpc
│   │   │   │               ├── IUserService.java
│   │   │   │               ├── User.java
│   │   │   │               ├── client
│   │   │   │               │   └── FgClient.java
│   │   │   │               └── server
│   │   │   │                   ├── FgServer.java
│   │   │   │                   └── UserServiceImpl.java

实体类User

代码语言:java
AI代码解释
复制
package com.bones.rpc;

import java.io.Serializable;

public class User implements Serializable {

    private static final long serialVersionUID = -1189354900598453538L;
    private Integer id;
    private String name;

    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

接口IUserService

代码语言:java
AI代码解释
复制
package com.bones.rpc;

public interface IUserService {
    User findUserById(Integer id);
}

接口的实现server/UserServiceImpl

代码语言:java
AI代码解释
复制
package com.bones.rpc.server;

import com.bones.rpc.IUserService;
import com.bones.rpc.User;

public class UserServiceImpl implements IUserService {

    @Override
    public User findUserById(Integer id) {
        return new User(id,"Bones");
    }
}

服务端server/FgServer

代码语言:java
AI代码解释
复制
package com.bones.rpc.server;


import com.bones.rpc.IUserService;
import com.bones.rpc.User;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class FgServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket=new ServerSocket(9999);
        while (true){
            Socket socket=serverSocket.accept();
            process(socket);
            socket.close();
        }
    }
    private static void process(Socket socket) throws IOException {
        InputStream inputStream= socket.getInputStream();
        OutputStream outputStream=socket.getOutputStream();
        DataInputStream dataInputStream = new DataInputStream(inputStream);
        DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
        System.out.println("process");
        int id = dataInputStream.readInt();
        IUserService service=new UserServiceImpl();
        User user = service.findUserById(id);
        dataOutputStream.writeInt(user.getId());
        dataOutputStream.writeUTF(user.getName());
        dataOutputStream.flush();
    }
}

客户端client/FgClient

代码语言:java
AI代码解释
复制
package com.bones.rpc.client;

import com.bones.rpc.User;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class FgClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 9999);
        // socket.getInputStream()

        ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
        DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
        dataOutputStream.writeInt(12);
        socket.getOutputStream().write(outputStream.toByteArray());
        socket.getOutputStream().flush();
        //dataOutputStream
        DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
        int id = dataInputStream.readInt();

        String name = dataInputStream.readUTF();
        User user=new User(id, name);
        System.out.println(user.getName());
        System.out.println(user.toString());
        outputStream.close();
        dataOutputStream.close();
        socket.close();
    }
}

0x02_解决客户端简单调用——引入存根stub

image-20221228145901902
image-20221228145901902

项目结构:

代码语言:shell
AI代码解释
复制
│   │   ├── main
│   │   │   ├── java
│   │   │   │   └── com
│   │   │   │       └── bones
│   │   │   │           └── rpc
│   │   │   │               ├── IUserService.java
│   │   │   │               ├── User.java
│   │   │   │               ├── client
│   │   │   │               │   ├── FgClient.java
│   │   │   │               │   └── Stub.java
│   │   │   │               └── server
│   │   │   │                   ├── FgServer.java
│   │   │   │                   └── UserServiceImpl.java

存根Stub

代码语言:java
AI代码解释
复制
package com.bones.rpc.client;

import com.bones.rpc.User;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;

public class Stub {
    public User findUserById(Integer id) throws Exception{
        Socket socket = new Socket("127.0.0.1", 9999);
        // socket.getInputStream()

        ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
        DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
        dataOutputStream.writeInt(id);
        socket.getOutputStream().write(outputStream.toByteArray());
        socket.getOutputStream().flush();
        //dataOutputStream.
        DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
        id = dataInputStream.readInt();

        String name = dataInputStream.readUTF();
        //User user=new User(id, name);
        outputStream.close();
        dataOutputStream.close();
        socket.close();

        return new User(id,name);
    }
}

客户端FgClient

代码语言:java
AI代码解释
复制
package com.bones.rpc.client;

import com.bones.rpc.User;
public class FgClient {
    public static void main(String[] args) throws Exception {
        Stub stub = new Stub();
        User user = stub.findUserById(124);
        System.out.println("user = " + user);
    }
}

客户端存根Stub:存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。

0x03_客户端动态代理隐藏网络细节

image-20221228145827506
image-20221228145827506

Stub

代码语言:java
AI代码解释
复制
package com.bones.rpc.client;

import com.bones.rpc.IUserService;
import com.bones.rpc.User;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.Socket;

public class Stub {

    static IUserService getStub(){
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Socket socket = new Socket("127.0.0.1", 9999);
                // socket.getInputStream()

                ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
                DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
                dataOutputStream.writeInt(12);
                socket.getOutputStream().write(outputStream.toByteArray());
                socket.getOutputStream().flush();
                //dataOutputStream.
                DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
                int id = dataInputStream.readInt();

                String name = dataInputStream.readUTF();
                //User user=new User(id, name);
                outputStream.close();
                dataOutputStream.close();
                socket.close();

                return new User(id,name);
            }
        };

        //执行动态代理
        Object o = Proxy.newProxyInstance(IUserService.class.getClassLoader(), new Class[]{IUserService.class}, handler);

        return (IUserService) o;
    }

}

客户端调用

FgClient

代码语言:java
AI代码解释
复制
package com.bones.rpc.client;

import com.bones.rpc.IUserService;
import com.bones.rpc.User;


public class FgClient {
    public static void main(String[] args) throws Exception {
        IUserService service = Stub.getStub();
        User user = service.findUserById(13);
        System.out.println(user);
    }
}

<img src="https://wechat01.oss-cn-hangzhou.aliyuncs.com/img/image-20221228152552581.png" alt="image-20221228152552581" style="zoom:50%;" />

此时id是写死的,后面用反射就可以传入id了。

0x04_服务端反射提高灵活性

image-20221228152730360
image-20221228152730360

存根Stub

代码语言:java
AI代码解释
复制
package com.bones.rpc.client;

import com.bones.rpc.IUserService;
import com.bones.rpc.User;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.Socket;

public class Stub {

    static IUserService getStub(){
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Socket socket = new Socket("127.0.0.1", 9999);
                // socket.getInputStream()

                ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
                String methodName= method.getName();//方法
                Class[] parametersTypes = method.getParameterTypes();//参数类型
                //格式1:方法名、2、方法参数类型  3、参数值
                objectOutputStream.writeUTF(methodName);
                objectOutputStream.writeObject(parametersTypes);
                objectOutputStream.writeObject(args);
                objectOutputStream.flush();

                //dataOutputStream.
                DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
                int id = dataInputStream.readInt();

                String name = dataInputStream.readUTF();
                objectOutputStream.close();
                socket.close();

                return new User(id, name);
            }
        };

        //执行动态代理
        Object o = Proxy.newProxyInstance(IUserService.class.getClassLoader(), new Class[]{IUserService.class}, handler);

        return (IUserService) o;
    }
}

服务类FgServer

代码语言:java
AI代码解释
复制
package com.bones.rpc.server;


import com.bones.rpc.IUserService;
import com.bones.rpc.User;

import java.io.*;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;

public class FgServer {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket=new ServerSocket(9999);
        while (true){
            Socket socket=serverSocket.accept();
            process(socket);
            socket.close();
        }
    }
    private static void process(Socket socket) throws Exception {
        InputStream inputStream= socket.getInputStream();
        OutputStream outputStream=socket.getOutputStream();
        ObjectInputStream dataInputStream = new ObjectInputStream(inputStream);
        DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
        System.out.println("process");

        //格式1:方法名、2、方法参数类型  3、参数值
        String methodName = dataInputStream.readUTF();//方法名
        Class[] parametersTypes = (Class[]) dataInputStream.readObject();//方法参数类型
        Object[] args=(Object[]) dataInputStream.readObject();//参数值

        IUserService service=new UserServiceImpl();
        //反射
        Method method = service.getClass().getMethod(methodName, parametersTypes);
        User user = (User) method.invoke(service, args);
        dataOutputStream.writeInt(user.getId());
        dataOutputStream.writeUTF(user.getName());
        dataOutputStream.flush();
    }
}

测试,先运行服务端,再运行客户端:

代码语言:java
AI代码解释
复制
package com.bones.rpc.client;

import com.bones.rpc.IUserService;
import com.bones.rpc.User;


public class FgClient {
    public static void main(String[] args) throws Exception {
        IUserService service = Stub.getStub();
        User user = service.findUserById(137);
        System.out.println(user);
    }
}

<img src="https://wechat01.oss-cn-hangzhou.aliyuncs.com/img/image-20230101152550566.png" alt="image-20230101152550566" style="zoom:50%;" />

0x05_灵活的传递参数

image-20230101153852582
image-20230101153852582

存根Stub

代码语言:java
AI代码解释
复制
package com.bones.rpc.client;

import com.bones.rpc.IUserService;
import com.bones.rpc.User;

import java.io.*;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.Socket;

public class Stub {

    static IUserService getStub(Class clazz){
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Socket socket = new Socket("127.0.0.1", 9999);
                // socket.getInputStream()

                ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
                String methodName= method.getName();//方法
                Class[] parametersTypes = method.getParameterTypes();//参数类型
                //格式(0:类名,1:方法名、2、方法参数类型  3、参数值)
                objectOutputStream.writeUTF(clazz.getName());
                objectOutputStream.writeUTF(methodName);
                objectOutputStream.writeObject(parametersTypes);
                objectOutputStream.writeObject(args);
                objectOutputStream.flush();

                //dataOutputStream.
                ObjectInputStream dataInputStream = new ObjectInputStream(socket.getInputStream());

                Object o = dataInputStream.readObject();


                objectOutputStream.close();
                socket.close();

                return o;
            }
        };

        //执行动态代理
        Object o = Proxy.newProxyInstance(IUserService.class.getClassLoader(), new Class[]{IUserService.class}, handler);

        return (IUserService) o;
    }

}

FgServer

代码语言:java
AI代码解释
复制
package com.bones.rpc.server;


import com.bones.rpc.IUserService;
import com.bones.rpc.User;

import java.io.*;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;

public class FgServer {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket=new ServerSocket(9999);
        while (true){
            Socket socket=serverSocket.accept();
            process(socket);
            socket.close();
        }
    }
    private static void process(Socket socket) throws Exception {
        InputStream inputStream= socket.getInputStream();
        OutputStream outputStream=socket.getOutputStream();
        ObjectInputStream dataInputStream = new ObjectInputStream(inputStream);
        ObjectOutputStream dataOutputStream = new ObjectOutputStream(outputStream);
        System.out.println("process");

        //格式(0:类名,1:方法名、2、方法参数类型  3、参数值)
        String clazzName = dataInputStream.readUTF();
        String methodName = dataInputStream.readUTF();//方法名
        Class[] parametersTypes = (Class[]) dataInputStream.readObject();//方法参数类型
        Object[] args=(Object[]) dataInputStream.readObject();//参数值


        //反射
        //从服务的注册表中寻找(注册中心)
        Class clazz = UserServiceImpl.class;
        Method method = clazz.getMethod(methodName, parametersTypes);
        User user = (User) method.invoke(clazz.newInstance(), args);
        dataOutputStream.writeObject(user );
        dataOutputStream.flush();
    }
}

FgClient

代码语言:java
AI代码解释
复制
package com.bones.rpc.client;

import com.bones.rpc.IUserService;
import com.bones.rpc.User;


public class FgClient {
    public static void main(String[] args) throws Exception {
        IUserService service = Stub.getStub(IUserService.class);
        User user = service.findUserById(98);
        System.out.println(user);
    }
}

测试结果:

<img src="https://wechat01.oss-cn-hangzhou.aliyuncs.com/img/image-20230101154132739.png" alt="image-20230101154132739" style="zoom:50%;" />

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
利用动态代理&反射&socket实现简单的RPC通信
摘 要 利用动态代理&反射&socket实现简单的RPC通信 概述 RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC跨越了传输层和应用层,RPC使得开发包括网络分布式多程序在内的应用程序更加容易。 现在RPC通信在内部分布式集群环境中已经很常见了。现在的开源的分布式框架已经提供了相应的实现,但仅停留在用的层面是远远不够的,这不符合一只码畜的追求。所以为了弄清RPC到底是个啥玩意,就
天策
2018/06/22
8830
学习一下,Dubbo创始人当年花10分钟撸的RPC骨架
因为要上实训课,让新同学们自行实现一个简易RPC框架,在准备PPT时,就想写个示例,发现原来一个RPC框架只要一个类,10分钟来就可以写完了,虽然简陋,也晒晒。
Bug开发工程师
2019/12/26
6770
学习一下,Dubbo创始人当年花10分钟撸的RPC骨架
RPC原来就是Socket——RPC框架到dubbo的服务动态注册,服务路由,负载均衡演化
  序:RPC就是使用socket告诉服务端我要调你的哪一个类的哪一个方法然后获得处理的结果。服务注册和路由就是借助第三方存储介质存储服务信息让服务消费者调用。然我们自己动手从0开始写一个rpc功能以及实现服务注册,动态上下线,服务路由,负载均衡。
intsmaze-刘洋
2018/08/29
1.2K0
简述RPC原理实现
随着业务规模的扩张,为了满足业务对技术的要求,技术架构需要从单体应用架构升级到分布式服务架构,来降低公司的技术成本,更好的适应业务的发展。
sanshengshui
2019/09/11
5330
简述RPC原理实现
BIO~~
I/O 模型:就是用什么样的通道或者说是通信模式和架构进行数据的传输和接收,很大程度上决定了程序通信的性能,Java 共支持 3 种网络编程的/IO 模型:BIO、NIO、AIO
大忽悠爱学习
2022/05/06
9380
BIO~~
【RPC 专栏】简单了解RPC实现原理
中文详细注释的开源项目 Java 并发源码合集 RocketMQ 源码合集 Sharding-JDBC 源码解析合集 Spring MVC 和 Security 源码合集 MyCAT 源码解析合集 时下很多企业应用更新换代到分布式,一篇文章了解什么是RPC。 原作者梁飞,在此记录下他非常简洁的rpc实现思路。 核心框架类 /* * Copyright 2011 Alibaba.com All right reserved. This software is the * confidential a
芋道源码
2018/06/12
1.7K0
RPC 是通信协议吗 ?→ 我们来看下它的演进过程
  随着业务的发展,单机应用会越来越力不从心,势必会引入分布式来解决单机的问题,那么调用方如何调用另一台机器上的方法呢 ?
青石路
2021/01/20
7970
RPC 是通信协议吗 ?→ 我们来看下它的演进过程
RPC远程过程调用学习之路(一):用最原始代码还原PRC框架
RPC: Remote Procedure Call 远程过程调用,即业务的具体实现不是在自己系统中,需要从其他系统中进行调用实现,所以在系统间进行数据交互时经常使用。
肖哥哥
2019/02/22
7040
RPC远程过程调用学习之路(一):用最原始代码还原PRC框架
手撕RPC实现基于TCP的仿Dubbo简单实现
文章目录 手撕RPC实现基于TCP的仿Dubbo实现 方法调用效果实现 分模块 写接口 通过代理写好了客户端 写服务端,并联调rpc 代码实现 myRpc rpc-client rpc-interface rpc-server 源码 手撕RPC实现基于TCP的仿Dubbo实现 还记得第一次听到这词是在别人的面试视频里,简单了解了一下只知道是远程调用。 万万没想到我的第一次面试的第一个问题就是与此相关,希望认真准备每一次面试,及时查漏补缺,谨以此文,代表诚意~奥利给! 思路: my-rpc通过cl
瑞新
2020/07/07
7390
从零手写RPC
RPC概述 RPC(Remote Proceduce Call 远程过程调用) 一般用来实现部署在不同机器上的系统之间的方法调用,使程序能够像访问本地系统资源一样,通过网络传输过去访问远端系统资源。
java404
2018/05/18
9820
JAVA实现一个简单的RPC+项目源码
论坛中说到聊一聊RPC远程过程调用协议 http://www.52itstyle.com/thread-22564-1-1.html RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。 无意中浏览到了du
小柒2012
2018/04/13
9620
JAVA实现一个简单的RPC+项目源码
rpc系列1-10 minute Tutorial
最近在网上看到阿里巴巴2015年的中间件性能挑战赛的一个题目,实现一个简单的RPC框架,于是乎有一种冲动实现一个简单的rpc,要求基本按照竞赛题目的要求,具体如下:
topgunviper
2022/05/12
2250
rpc系列1-10 minute Tutorial
RPC框架的最简单实现
一个最简单的RPC框架实现包含暴露服务、引用服务、Socket通讯三部分。 RPC框架简易实现 public class RpcFramework { public static void exportService(final Object service, int port) throws Exception { ServerSocket serverSocket = new ServerSocket(port); while (true) {
JavaQ
2018/04/04
8760
RPC(简单实现)
RPC(Remote Procedure Call)远程过程调用,即通过网络通信来调用远程计算机程序上的服务,而这个调用过程就像调用本地方法一样简单透明,并且不需要了解底层的网络技术协议。RPC采用C/S架构,发出请求的程序是Client,提供服务的则是Server,类似于Http请求与响应。简单总结就是:调用的方法实际在远程,而要像调用本地方法一样简单。
晚上没宵夜
2020/03/10
9270
【原创】自己动手实现RPC服务调用框架
引言 本文利用java自带的socket编程实现了一个简单的rpc调用框架,由两个工程组成分别名为battercake-provider(服务提供者)、battercake-consumer(服务调用者)。 设计思路如下: 1、在battercake-provider中,写一个服务叫BatterCakeService 2、在battercake-provider中,启动RpcProvider,发布该服务 3、在battercake-consumer中,启动测试类RpcTest 4、在battercake-c
Java高级架构
2018/07/20
3160
大数据必学Java基础(八十一):基于TCP的网络编程
​基于TCP的网络编程功能:模拟网站的登录,客户端录入账号密码,然后服务器端进行验证。一、功能分解1:单向通信功能:客户端发送一句话到服务器客户端:public class TestClient {//客户端 //这是一个main方法,是程序的入口: public static void main(String[] args) throws IOException { //1.创建套接字:指定服务器的ip和端口号: Socket s = new Socket("192
Lansonli
2022/11/10
3920
大数据必学Java基础(八十一):基于TCP的网络编程
自己实现一个RPC框架 顶
RPC框架称为远程调用框架,其实现的核心原理就是消费者端使用动态代理来代理一个接口的方法(基于JDK的动态代理,当然如果使用CGLib可以直接使用无接口类的方法),通过加入网络传输编程,传输调用接口方法名称,方法参数来给提供者获取,再通过反射,来执行该接口的方法,再将反射执行的结果通过网络编程传回消费者端。
算法之名
2020/06/11
3990
【大数据之Hadoop】 从自定义 RPC 到 Hadoop RPC ,理解分布式通信系统的底层工作原理
Hadoop是分布式计算系统,在分布式环境中,网络通信模块是其核心模块之一。要学好Hadoop,需理解其底层通信系统的基本工作原理。Hadoop提供有体系完整的RPC框架,实现了对底层网络通信的优雅封装。
一枚大果壳
2023/08/18
2120
【大数据之Hadoop】 从自定义 RPC 到 Hadoop RPC ,理解分布式通信系统的底层工作原理
手写RPC通信和服务发现——模拟Dubbo的实现机制(上篇)
 如果服务在一个应用中调用,那么不需要考虑那么多,因为所有的调用都在一个进程中。但随着分布式微服务架构的逐渐应用,服务之间的调用越来越复杂,越来越多的调用都需要跨服务、跨进程、跨机器。如何有效合理的来解决这些问题,RPC(远程服务调用)通信应运而生,随之衍生了诸多分布式服务调用夸框架。Dubbo则是其中的一种框架,由阿里团队开发,简单的说,Dubbo 是 基于 Java 的RPC 框架。Dubbo 工作分为 4 个角色,分别是服务提供者、服务消费者、注册中心、和监控中心。
leehao
2025/02/11
860
手写RPC通信和服务发现——模拟Dubbo的实现机制(上篇)
简单聊聊RPC
RPC 全称 Remote Procedure Call——远程过程调用。在学校学编程,我们写一个函数都是在本地调用就行了。但是在互联网公司,服务都是部署在不同服务器上的分布式系统,服务之间如何调用呢? 答案就是RPC。RPC设计的技术很多,下图列出的是关于RPC涉及的相关技术。
灬沙师弟
2023/09/19
2680
简单聊聊RPC
推荐阅读
相关推荐
利用动态代理&反射&socket实现简单的RPC通信
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文