【RPC框架、RPC框架必会的基本知识、手写一个RPC框架案例、优秀的RPC框架Dubbo、Dubbo和SpringCloud框架比较】

从无到有手写RPC框架---RPC原理及实现(文末还有开源的优秀RPC框架) 一次完整的RPC调用流程(同步调用,异步另说)如下:1)服务消费方(client)调用以本地调用方式调用服务;2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;3)client stub找到服务地址,并将消息发送到服务端;4)server stub收到消息后进行解码;5)server stub根据解码结果调用本地的服务;6)本地服务执行并将结果返回给server stub;7)server stub将返回结果打包成消息并发送至消费方; 阅读详情

一.RPC框架必会的基本知识

1.1 什么是RPC?

RPC(Remote Procedure Call ——远程过程调用),它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络的技术。

一次完整的RPC同步调用流程:

  1. 服务消费方,也就是我们常说的客户端,以本地调用方式调用客户端存根;
  • 什么叫客户端存根?就是远程方法在本地的模拟对象,一样的也有方法名,也有方法参数,client stub接收到调用后负责将方法名、方法的参数等包装,并将包装后的信息通过网络发送到服务端;
  1. 服务端收到消息后,交给代理存根在服务器的部分后进行解码为实际的方法名和参数;

  2. server stub根据解码结果调用服务器上本地的实际服务;

  3. 本地服务执行并将结果返回给server stub;

  4. server stub将返回结果打包成消息并发送至消费方;

  5. client stub接收到消息,并进行解码;

  6. 服务消费方得到最终结果。

RPC框架的目标就是要将上面的这些中间步骤都封装起来,当我们进行远程方法调用的时候感觉就像在本地调用方法一样。

1.2 为什么要有RPC?

  1. 我们最开始开发的时候,一个应用一台机器,将所有功能都写在一起,比如说比较常见的电商场景。

  2. 随着我们业务的发展,我们需要提示性能了,我就就需要将不同的业务功能放到线程里来实现异步和提升性能。

  3. 但是业务越来越复杂,业务量越来越大,单个应用或者一台机器的资源是运行不起来我们的服务的,这个时候,我们就需要将核心业务抽取出来,作为独立的服务,放到其他服务器上或者形成集群。这个时候就会请出RPC,系统变为分布式的架构。

  4. 为什么说千万级流量分布式、微服务架构必备的RPC框架?和LocalCall的代码进行比较,因为引入RPC框架对我们现有的代码影响最小,同时又可以帮我们实现架构上的扩展。现在的开源RPC框架主要有dubbo,grpc等等。

  5. 当服务越来越多,各种RPC之间的调用会越来越复杂,这个时候我们会引入中间件,比如说MQ、缓存,同时架构上整体往微服务去迁移,引入了各种比如容器技术docker,DevOps等等。以此来抗住千万级流量,RPC起到关键的作用。

1.3 RPC和HTTP

很多人都容易弄混的一个概念就是总会拿RPC和HTTP作比较,其实RPC和HTTP是完全两个不同层级的东西,他们之间并没有什么可比性。

  1. RPC是远程过程调用,只是对不同应用间相互调用的一种描述,它是一种思想。具体怎么调用?实现方式可以是最直接的TCP通信,也可以是HTTP方式。
  2. 而我们的HTTP是应用层的一种协议,负责服务之间的通信操作。
  3. dubbo是基于tcp通信的,gRPC是Google公布的开源软件,基于最新的HTTP2.0协议,底层使用到了Netty框架的支持。
1.4 手动实现一个RPC框架需要考虑哪些方面
  1. 代理问题(代理设计模式【动态代理、静态代理】)
  • 代理本质上是要解决的是被调用的服务本质上是远程的服务,但是调用者不知道也不关心,调用者只要结果,具体的事情由代理的那个对象来负责这件事。既然是远程代理,当然是要用代理模式了。
  • 代理(Proxy)是一种设计模式,即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。那我们这里额外的功能操作是干什么,通过网络访问远程服务。
  • jdk的代理有两种实现方式:静态代理和动态代理。
  1. 服务的注册与发现
  • 登记的服务有可能在我们的系统中就是一个名字,怎么变成实际执行的对象实例,当然是使用反射机制。
  • 反射机制是什么?反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
  • 反射机制能做什么?在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
  1. 序列化问题
  • 当我们的方法调用,有方法名,方法参数,这些可能是字符串,可能是我们自己定义的java的类,但是在网络上传输或者保存在硬盘的时候,网络或者硬盘并不认得什么字符串或者Bean对象,它只认得二进制的01串,怎么办?要进行序列化,网络传输后要进行实际调用,就要把二进制的01串变回我们实际的java的类,这个叫反序列化。
  • java里已经为我们提供了相关的机制Serializable。但是序列化与反序列化的效率比较低,我们可以选择fastjson这些框架。
  1. 核心的就是上面的三点,然后还有很多其它方面,需要我们单独的进行考虑…

二.手写一个RPC框架案例

2.1 客户端实现代码

public class Client{
    //远程调用类
    public static Object getStub(final Class clazz) throws Exception{
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Socket socket = new Socket("127.0.0.1", 8888);
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                //TODO 送入的class 灵活了
                String className = clazz.getName();
                String methodName = method.getName();
                Class[] parametersTypes = method.getParameterTypes();
                //TODO 传递class到服务器 , 我自己定义的协议(className|methodName|parametersTypes|args)
                oos.writeUTF(className);
                oos.writeUTF(methodName);
                oos.writeObject(parametersTypes);
                oos.writeObject(args);
                oos.flush();
                //TODO 返回对象
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                Object o = ois.readObject();
                oos.close();
                socket.close();
                return o ;
            }
        };
        Object o = Proxy.newProxyInstance(clazz.getClassLoader(),
                new Class[]{clazz},handler);
        return o;
    }
}

3.2 服务端实现代代码

/**
 * 服务端:服务更灵活-提供多个类、多个方法的远程接口调用
 */
public class Server {
    private static boolean running = true;
    public static void main(String[] args) throws  Exception{
        ServerSocket serverSocket = new ServerSocket(8888);
        while (running){
            Socket socket = serverSocket.accept();
            process(socket);
            socket.close();
        }
        serverSocket.close();
    }
    private static void  process(Socket socket) throws Exception{
        InputStream in = socket.getInputStream();
        OutputStream out = socket.getOutputStream();
        ObjectInputStream ois = new ObjectInputStream(in);

        //我自己定义的协议(className|methodName|parametersTypes|args)
        //TODO 拿到客户端传递过来的class
        String clazzName =ois.readUTF();
        String methodName =ois.readUTF();
        Class[] parameterTypes = (Class[])ois.readObject();
        Object[] args =(Object[])ois.readObject();
        //反射拿到class
        //通过反射可以获取所有的接口类
        Class clazz =Class.forName(clazzName);
        if(clazz.isInterface()){
            if(clazzName.equals("com.ljw.test.UserService")){
                clazz = UserServiceImpl.class;
            }
        }
        Method method = clazz.getMethod(methodName,parameterTypes);
        Object object = method.invoke(clazz.newInstance(),args);
        //TODO 返回值:使用对象进行返回
        ObjectOutputStream oos = new ObjectOutputStream(out);
        oos.writeObject(object);
        oos.flush();
    }
}

服务端业务逻辑接口

public interface UserService {
    public User findUserByID(Integer id);
    public User findUserByID2(Integer id);
}

业务逻辑的实现类

public class UserServiceImpl implements UserService {
    @Override
    public User findUserByID(Integer id) {
        return new User(id,"ljw");
    }
    @Override
    public User findUserByID2(Integer id) {
        return new User(id,"硕风和炜");
    }
}

测试代码

public class Main{

    public static void main(String[] args) throws Exception{
        //RPC调用
        IUserService service=(IUserService)Client.getStub(UserService.class);
        User user = service.findUserByID(1314);
        System.out.println(user.getName());

    }
}

三.优秀的RPC框架Dubbo

3.1 Dubbo框架

可以先看一个之前写过的一篇文章,需要的自行查看,接下来继续补充完善一些关于Dubbo框架。
【RPC框架之Dubbo的这些面试知识你知道吗?Dubbo是什么?RPC?底层通信框架?与SpringCloud区别?服务注册与发现流程?核心组件有哪些?注册中心挂掉,生产者消费者通信吗?】

image.png

3.2 Dubbo和SpringCloud
  1. 协议上:http相对更规范,更标准,更通用,无论哪种语言都支持http协议。现在开源中间件,基本最先支持的几个协议都包含RESTful。

  2. RPC协议性能要高的多,例如Protobuf、Thrift、Kyro等,(如果算上序列化)吞吐量大概能达到http的二倍。响应时间也更为出色。千万不要小看这点性能损耗,公认的,微服务做的比较好的,例如,netflix、阿里,曾经都传出过为了提升性能而合并服务。

  3. 服务全面上比较:当然是springloud更胜一筹,但也就意味着在使用springloud上其实更重量级一点,dubbo目前版本专注于服务治理,使用上更轻量一点。

  4. 就国内的热度来说,dubbo相比起来还略胜一筹。
    通过百度指数查看,感兴趣的可以自行查看
    在这里插入图片描述

总的来说对外开放的服务推荐采用RESTFUL,内部调用推荐采用RPC方式。也需要我们面对不同的情况具体分析。

好了,到这里【RPC框架、RPC框架必会的基本知识、手写一个RPC框架案例、优秀的RPC框架Dubbo、Dubbo和SpringCloud框架比较】就结束了,关于Dubbo更多的内容,持续更新创作中。

面试官:请比较一下SpringCloud与Dubbo 一、Dubbo 1. Dubbo简介 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。 Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。 现已发展成为Apache的顶级孵化开源项目,详见官网: 2. Dub... 阅读详情

相关推荐

opencv的cmake报错

1、下载 ippicv_2021.8_win_intel64_20230330_general.zip、v0.1.2a.zip、opencv_videoio_ffmpeg.dll、opencv_videoio_ffmpeg_64.dll、ffmpeg_version.cmake。由于下载源在https://raw.githubusercontent.com,由于网络原因下载不顺畅,可以先找到文件下载到对应文件夹下,或者更改网络环境。ffmpeg_version.cmake文件,打开后显示如下, 另存即可。

nownow_的博客 1299

什么是RPC?RPC框架dubbo的核心流程

一、REST 与 RPC 1、什么是 REST 和 RPC 协议? 在单体应用中,各模块间的调用是通过编程语言级别的方法函数来实现,但分布式系统运行在多台机器上,一般来说,每个服务实例都是一个进程,服务间必须使用进程间通信机制来交互,而常见的通信协议主要有 RPC 和 REST 协议。 (1)REST: REST 是基于 HTTP 实现,使用 HTTP 协议处理数据通信,更加标准化与通用,因为无论哪种语言都支持 HTTP 协议。常见的 http API 都可以称为 Rest 接口。RES...

duan18888的博客 2189

QLIB使用tushare更新每日行情

0. 介绍 qlib每日数据的源是yahoo,更新速度较慢并且不稳定。tushare每日行情是免费接口,速度较快。 1. 获取行情数据,保存为csv格式。 def GetDataFromTushare(self, today, fpath): pro = ts.pro_api() df = pro.daily(trade_date=today) for index, row in df.iterrows(): code = row['ts_code']

weixin_44177216的博客 2897

什么是RPC?有哪些RPC框架?

RPC(Remote Procedure Call,远程过程调用)是一种允许运行在一台计算机上的程序调用另一台计算机上子程序的技术。这种技术屏蔽了底层的网络通信细节,使得程序间的远程通信如同本地调用一样简单。RPC机制使得开发者能够构建分布式计算系统,其中不同的组件可以分布在不同的计算机上,但它们之间可以像在同一台机器上一样相互调用。

yuiezt的专栏 1万+

用STM32H7的FMC+AD7606搭建多通道数据采集系统:两种工作模式(查询与FIFO中断)的代码详解与性能对比

本文详细解析了基于STM32H7微控制器和AD7606 ADC芯片的多通道数据采集系统设计,重点对比了查询模式与FIFO中断模式的实现方法与性能差异。通过FMC总线实现高速并行数据采集,系统支持16bit同步采样,最高可达200Ksps/通道。文章提供了完整的代码实现和优化策略,帮助工程师在工业监测等实时性要求高的场景中构建可靠的数据采集方案。

weixin_30599769的博客 485

博途 V15.1安装步骤

温馨提醒:安装此软件电脑配置至少应满足以下要求 处理器 CoreTM i5-3320M 3.3 GHz 或相当 内存 至少8G 硬盘 300 GB SSD 显示器 15.6' 宽屏显示 (1920 x 1080) 1.双击打开【Siemens v15.1】文件夹。 2.鼠标右击【STEP 7 BasicProfess...

谢谢关注“小鱼教你模数电”,各平台同号 9万+

什么是RPC框架?

RPC(Remote Procedure Call)即远程过程调用,不同于本地调用,RPC是指调用远端机器的函数或方法,且不需要关心底层的调用细节,如网络协议和传输协议等,对于调用者来说,和调用本地方法没有什么区别。

柚子树's Blog 2万+

RH850从0搭建Autosar开发环境系列讲解 - 总目录

Davinci Autosar实战开发从0构建开发能力。OS,COM,DCM,BSWMM,ECUM,VLINK,XCP,MEMMAP等模块配置,带你熟悉运行的autosar代码,包括MICROSAR的启动运行,使用GreenHills生成运行的hex。

weixin_42412049的博客 1万+

rpc详解rpc框架

在互联网应用开发中,随着业务的复杂度增加,一般都会采用分布式架构。分布式架构的核心,就是利用多台普通的计算机组成一个庞大的复杂计算网络,提供高并发、高性能、高可用的系统能力支撑。在分布式架构中,原本的单体应用服务被拆分成多个独立部署的服务,分布式在计算机网络上,这些服务必然,需要通过网络进行数据通信和交互。而RPC框架,就是解决在分布式架构中,各个服务之间的网络通信问题的框架。在Java应用中,JDK 1.1版本的时候就提供了对RPC的支持框架,叫做RMI。由于RMI不能实现跨域语言的远程调用。

刘皇叔说Java的博客 7079

CCAR-23《正常类飞机适航规定》和CCAR-25《运输类飞机适航规定》差异分析

通过详细比较CCAR-23和CCAR-25在适用范围、设计标准、性能要求、运行限制、安全冗余和环境适应性方面的差异,我们可以看出,CCAR-23适用于轻型飞机,开发和运营成本较低,设计要求相对简单。而CCAR-25适用于大规模运输飞机,设计、开发、测试和运营管理都需要更高的复杂性和投入。

qq_41854911的博客 3706

【Verilog基础】CDC跨时钟域方法,典型异步电路设计之脉冲同步器(上)

【Verilog基础】CDC跨时钟域方法,典型异步电路设计之脉冲同步器(上):慢时钟域到快时钟域!

悟已往之不谏 知来者之可追 1545

RPC框架

RPC基础知识

weixin_45139640的博客 1万+

2026华为OD面试题084:贪心的商人

商人经营一家店铺,有 `number` 种商品。由于仓库限制,每件商品的最大持有数量是 `item[index]`。 每种商品每天有一个价格 `item_price[item_index][day]`。通过对商品买进和卖出获取利润,请给出商人在 `days` 天内能获取到的最大利润。 注:同一件商品可以反复买进和卖出。 输入描述: - 第一行输入商品数量 `number` - 第二行输入商人售货天数 `days` - 第三行输入 `number` 个整数,表示每件商品的最大持有数量 `item[in

琅嬛福地 273

SpringCloud与Dubbo的比较

SpringCloud与Dubbo的比较及异同点

程序大视界 11万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

分布式 - 公司使用什么RPC框架,聊聊你理解的RPC原理

不啰嗦,我们直接开始! 引言 以前在做一个规模不大的系统的时候,用的是单体架构,一台服务器部署上一个应用和数据库也就够了。 但是现代化互联网公司业务逐渐扩大,服务逐渐细分,很多服务之间需要通过远程分布式接口调用通讯,即不同的服务不是部署在同一个服务器上,比如订单服务在 A 服务上,付款服务在另一个服务上,有同步调用、也有异步调用,这个时候我们就需要远程调用不同的服务,使用的时候调用远程服务就像调用本地服务一样,引入一个 jar 包,就能通过this.xxx( ) 一样调用远程服务,这背后的机制就是通.

。 23万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【手写dubbo-1】谈一谈dubbo的前世今生

就目前来看,dubbo框架是一个目前位置非常优秀的RPC框架, 一个必须要学的一个框架。也许以后它会更加优秀,也许会落寞。但是其设计思想,非常值得开发者去学习。

叁滴水 的博客 5353

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SpringCloud 与 Dubbo 的区别详解

SpringCloud 是一个用于构建云原生应用的框架集合,它为开发者提供了一套完整的工具链,用于快速搭建分布式系统。SpringCloud 基于SpringBoot提供了丰富的组件,如配置管理、服务注册与发现、断路器等采用声明式的编程模型,易于上手与 SpringBoot 无缝集成,开箱即用适用于各种部署环境,如本地、云端等Dubbo是阿里巴巴开源的一个高性能、轻量级的 RPC 框架。它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

py0007的博客 3821

Springcloud alibab和dubbo有什么区别?

Spring Cloud Alibaba是一个由阿里巴巴开源并贡献给Spring Cloud的项目,它基于Spring Cloud提供了一整套微服务解决方案。它旨在通过结合Alibaba Group开发的中间件,简化分布式系统的构建。提供服务发现和配置管理功能。提供流量控制、熔断降级、系统负载保护功能。用于处理消息驱动的微服务。Spring Cloud Alibaba也支持Dubbo的服务调用方式。用于分布式事务处理。Dubbo是一个由阿里巴巴开发的Java语言的高性能、轻量级RPC框架。

码农小郑有话说的博客 2145

从RPC角度如何看待Dubbo还是SpringCloud

所以语言不会成为使用上面这几种RPC框架的约束,而gRPC和Thrift虽然支持跨语言的RPC调用,但是因为它们只提供了最基本的RPC框架功能,缺乏一系列配套的服务化组件和服务治理功能的支撑,所以使用它们作为跨语言调用的RPC框架,就需要自己考虑注册中心、熔断、限流、监控、分布式追踪等功能的实现,不过好在大多数功能都有开源实现,可以直接采用。IDL使用了ProtoBuf,ProtoBuf是由Google开发的一种数据序列化协议,它的压缩和传输效率极高,语法也简单,所以被广泛应用在数据存储和通信协议上。

通往IT大道的专栏 400

rpc框架都有哪些_这六种微服务RPC框架,你知道几个?

开源 RPC 框架有哪些呢?一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的。跟语言平台绑定的开源 RPC 框架主要有下面几种。Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于 2011 年末对外开源,仅支持 Java 语言。Motan:微博内部使用的 RPC 框架,于 2016 年对外开源,仅支持 Java 语言。Tars:腾讯内部使用的 RPC 框架,于 201...

weixin_39645041的博客 3214

Spring(25) 为什么使用 SpringCloud,而不是用 Dubbo?

Spring(25) 为什么使用 SpringCloud,而不是用 Dubbo?

ACGkaka的博客 1388

6种微服务RPC框架,你知道几个?

RPC

qq_23350817的博客 1万+

【微服务知识】开源RPC框架Dubbo入门介绍

Dubbo是一个开源的、基于Java的高性能RPC(远程过程调用)框架,最初由阿里巴巴开发,现已成为Apache顶级项目。Dubbo主要用于构建微服务架构中的分布式服务治理系统。它通过高效的远程调用、服务治理、负载均衡、服务发现等功能,帮助开发者简化分布式系统的开发和管理。在这个接口将被提供者和消费者共同使用,因此两者都需要依赖这个模块。

wendao76的专栏 1220

springcloud与dubbo的比较

Dubbo 一、简介 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。 Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。 二、组织架构图 dubbo组织架构图 详细介绍 三、优势 SpringCloud 一、简介 SpringClou...

654
上一篇: 【LeetCode每日一题:791.自定义字符串排序~~~字符串计数+模拟+Map+自定义排序】
下一篇: 【计算机网络模型、客户端与服务端请求与解析过程、宏观的角度分析客户端与服务端发送消息的全过程解析】
硕风和炜
硕风和炜 优质创作者: Java技术领域 优质创作者: Java技术领域
博客等级 码龄7年 2万+粉丝 1024原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值