Rpc编程系列文章第二篇:RPC框架设计目标

简介: Rpc编程系列文章第二篇:RPC框架设计目标

前言

不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽都顺利。

如何找到孙帅本人

本文内容整理自《孙哥说Dubbo系列视频课程》,老师实力十分雄厚,B站搜孙帅suns可以找到本人,或者直接添加老师微信号suns45

一:前导知识

Http是超文本传输协议,跨平台性非常好。Http可以传输文本,更多的时候传输的是文本,我们也是可以传输二进制的,我们基于Http进行下载的时候,就是走的Http协议。

Tcp协议,处理的时候会更麻烦,我们需要自己开发服务器,对外提供服务,我们可以使用socket,可以使用nio,可以使用Netty。作为服务器端,暴露服务的时候,我们直接将我们的service暴露出来,这样的话业务性会很好,只不过我们的服务端代码实现起来会很繁琐。当我们进行调用的时候,这种方式比Http协议请求的方式会更加的方便,设计的好的话我们甚至可以在代码中直接service.业务性更强。

对于TCP这中方式的话,我们的客户端也是需要处理TCP协议的数据的,这样的话学位也是有一丢丢繁琐

TCP协议作为一种长链接协议。不需要进行频繁的三次握手四次挥手,Http协议底层也是TCP协议,但是高层进行了封装,需要频繁的关闭连接,这样就需要频繁的握手挥手,再加上应用层协议协议头内容很多,导致传输的内容负担较大。

通过RPC进行过程调用的时候,我们往往需要传递这样的几个参数:类的名字,方法的名称,方法的参数,就可以找到唯一的一个service中的方法,进而可以提供服务。服务提供完之后,再通过网络传输给我们的调用方。一个是有网络,另外一个通过页面。

通信的时候,我们基于Http协议还是TCP协议(不要再说底层就是TCP了,我们有意的将两个协议并肩讨论而已)的区别如下:

二:RPC框架的设计

1:设计目标

让调用者像调用本地方法一样,调用远端的服务方法。调用者就是我们的客户端,远端的服务方法就是我们的服务方service层中的某一个方法。基于这样的RPC来讲,我们的代码业务含义就会非常强。

我们想要达到这样的一个设计目标,我们必须需要解决两个问题:网络通讯+传递数据,接收返回值。在设计RPC的时候我们要这两个问题封装掉,让低级程序员使用的时候,达到上述的目的即可。

2:目标思路分析

1):通讯方式

通讯方式,我们可以选择Http协议或者选择TCP协议,选择Http协议的话,我们大概率就不需要自己写服务了。

如果我们使用TCP协议的话,我们大概率的通讯工具使用的是Netty、Socket、Nio、Mina等等

2):自定义协议

当然,如果我们使用TCP的话,我们可能还需要自定义协议。我们自定义协议在Netty文章中就已经探讨过了,我们自定义的协议包括两大部分:协议头+协议体(消息主体、协议主体)

3):序列化方式

协议当中很重要的一个组成部分就是序列化,就是我们要传输的数据要以什么样的数据进行序列化。JSON,protobuf,hessian?

序列化是协议的一个组成部分,只不过他非常的重要,我们往往把他给拿出来单独来讲。

二进制协议与非二进制协议:

这个协议,什么是二进制,什么不是二进制,网络传输的时候不都是二进制的吗?对了网络传输的时候都是二进制,网络底层通讯走的都是二进制,而我们现在考虑的序列化是站在Java的角度考虑这个问题。是网络传输的上游,我们走JSON的这样的方式的话,我们走的是{id:10,age:30},如果走的时候Java的序列化的话,那么就是ObjectOutputStream转成的byte[],当这些数据走到传输层的时候,就会变成二进制。

4):客户端增加远程代理类

当请求达到服务端之后,我们的服务提供方也就是服务器,可以拿到客户端请求的类的名称、方法的名称、方法的参数。服务端就可以去调用这个方法,然后在这个方法当中去进行访客户端中的Dao,甚至Redis,MQ等其他资源,当业务结果处理完毕之后,将方法的返回结果基于序列化协议通过网络返回给调用端。

通过代理类为原始类增加额外功能。也就是在客户端当中使用了远端代理,通过代理的思想,完成对远端服务的功能的包含,以及外功能的编写。

补充说明:

我们一般将远端的服务方法叫做skeleton(骨架)代理类叫做(stub)这个stub是远端服务的代理,这个代理即完成网络通讯,又完成传输数据。

3:衍生问题

1):注册中心

服务端有多个实例,这种情况下就必须考虑注册中心的功能了。注册中心有所有的服务的注册信息。

负载均衡:基于轮训或者是加权的一些策略,将请求打到对应的服务上

管理服务:那些服务是可用的、健康的。定期的发心跳,管理服务。

解耦合:不需要直接绑定到对应的服务上,而是都跟我们的注册中心发声联系。

注册中心的核心作用就是:服务的治理

1:负载均衡

2:健康管理 服务管理(心跳 重试【延迟队列时间论算法】)

3:解耦合 耦合性更低

4:熔断

5:限流 虽然做了限流,但是流量过大,我们必须做限流。

相关文章
|
4月前
|
负载均衡 Dubbo Java
Dubbo 3.x:探索阿里巴巴的开源RPC框架新技术
随着微服务架构的兴起,远程过程调用(RPC)框架成为了关键组件。Dubbo,作为阿里巴巴的开源RPC框架,已经演进到了3.x版本,带来了许多新特性和技术改进。本文将探讨Dubbo 3.x中的一些最新技术,包括服务注册与发现、负载均衡、服务治理等,并通过代码示例展示其使用方式。
248 9
|
4月前
|
设计模式 负载均衡 网络协议
【分布式技术专题】「分布式技术架构」实践见真知,手把手教你如何实现一个属于自己的RPC框架(架构技术引导篇)
【分布式技术专题】「分布式技术架构」实践见真知,手把手教你如何实现一个属于自己的RPC框架(架构技术引导篇)
186 0
|
1月前
|
Dubbo 网络协议 Java
RPC框架:一文带你搞懂RPC
这篇文章全面介绍了RPC(远程过程调用)的概念、原理和应用场景,解释了RPC如何工作以及为什么在分布式系统中广泛使用,并探讨了几种常用的RPC框架如Thrift、gRPC、Dubbo和Spring Cloud,同时详细阐述了RPC调用流程和实现透明化远程服务调用的关键技术,包括动态代理和消息的编码解码过程。
RPC框架:一文带你搞懂RPC
|
19天前
|
前端开发 C# 开发者
WPF开发者必读:MVVM模式实战,轻松构建可维护的应用程序,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离关注点,提高了代码的可维护性和可扩展性。本文详细介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定与逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种模式,开发者可以更高效地构建桌面应用程序。希望本文能帮助你在WPF开发中更好地应用MVVM模式。
43 0
|
25天前
|
网络协议 编译器 Go
揭秘!TCP、RPC、gRPC、HTTP大PK,谁才是网络通信界的超级巨星?一篇文章带你秒懂!
【8月更文挑战第25天】本文以教程形式深入对比了TCP、RPC、gRPC与HTTP这四种关键通信协议,并通过Go语言中的示例代码展示了各自的实现方法。TCP作为一种可靠的传输层协议,确保了数据的完整性和顺序性;RPC与gRPC作为远程过程调用框架,特别适合于分布式系统的函数调用与数据交换,其中gRPC在性能和跨语言支持方面表现出色;HTTP则是广泛应用于Web浏览器与服务器通信的应用层协议。选择合适的协议需根据具体需求综合考量。
101 0
|
1月前
|
XML 存储 JSON
(十二)探索高性能通信与RPC框架基石:Json、ProtoBuf、Hessian序列化详解
如今这个分布式风靡的时代,网络通信技术,是每位技术人员必须掌握的技能,因为无论是哪种分布式技术,都离不开心跳、选举、节点感知、数据同步……等机制,而究其根本,这些技术的本质都是网络间的数据交互。正因如此,想要构建一个高性能的分布式组件/系统,不得不思考一个问题:怎么才能让数据传输的速度更快?
|
2月前
|
分布式计算 负载均衡 数据安全/隐私保护
什么是RPC?有哪些RPC框架?
RPC(Remote Procedure Call,远程过程调用)是一种允许运行在一台计算机上的程序调用另一台计算机上子程序的技术。这种技术屏蔽了底层的网络通信细节,使得程序间的远程通信如同本地调用一样简单。RPC机制使得开发者能够构建分布式计算系统,其中不同的组件可以分布在不同的计算机上,但它们之间可以像在同一台机器上一样相互调用。
111 8
|
2月前
|
网络协议 Dubbo Java
什么是RPC?RPC和HTTP对比?RPC有什么缺点?市面上常用的RPC框架?
选择合适的RPC框架和通信协议,对于构建高效、稳定的分布式系统至关重要。开发者需要根据自己的业务需求和系统架构,综合考虑各种因素,做出适宜的技术选型。
122 1
|
3月前
|
存储 缓存 Linux
【实战指南】嵌入式RPC框架设计实践:六大核心类构建高效RPC框架
在先前的文章基础上,本文讨论如何通过分层封装提升一个针对嵌入式Linux的RPC框架的易用性。设计包括自动服务注册、高性能通信、泛型序列化和简洁API。框架分为6个关键类:BindingHub、SharedRingBuffer、Parcel、Binder、IBinder和BindInterface。BindingHub负责服务注册,SharedRingBuffer实现高效数据传输,Parcel处理序列化,而Binder和IBinder分别用于服务端和客户端交互。BindInterface提供简单的初始化接口,简化应用集成。测试案例展示了客户端和服务端的交互,验证了RPC功能的有效性。
319 6
|
2月前
|
负载均衡 Java
使用Java实现RPC框架
使用Java实现RPC框架