张三和李四都在同一个家公司负责商品交易的模块,两个人平时开发甚是紧密。 ♂️ 张三:“李四,我这边一个商品下单了,但是付款数额不对,你帮我查下支付有没有问题” 李四:“张三,支付这边检验价格的时候有点问题,实付金额和预付金额对不上” 往常,他们相邻而坐,有什么问题也是 张口就问 。但是随着业务的增长,他们的工作被细化到不同的子模块中,而 分布式系统 的概念也恰逢其时地变得流行起来。"拆分系统"的计划迫在眉睫。于是张三自然而然地分配到了订单模块,而李四到了交易模块。相应,两个人的工位也需要分开,这个时候他们意识到应该没法像从前那样即呼即应了 。 这个时候该如何解决沟通的问题? 李四人搬走了,但是 联系方式 还在,张三需要李四协助的时候可以通过 电话 的方式直呼李四,虽然说通过电话的这种方式略显间接,但仍然保留了解问题的能力,只是沟通的形式变了。
通过阅读这个故事,我们总结一下其中几个核心概念
RPC (Remote Procedure Call) 是一种用于实现远程通信和分布式计算的协议。它允许在不同的计算机或进程之间进行通信,使得这些计算机或进程能够像调用本地函数一样调用位于远程计算机或进程上的函数或方法。
RPC 协议的基本原理是客户端调用远程服务器上的函数,并将函数参数传递给服务器。 服务器执行相应的函数逻辑,并将结果返回给客户端。 从客户端的角度来看,RPC 调用就像是调用本地函数一样,而不需要关心远程函数的实现和通信细节。 简单来说:从本质上讲,它使一台机器上的程序能够调用另一台机器上的子程序,而不会意识到它是远程的。
3)HTTP1、HTPP 与 RPC 的先后RPC是一个较早的抽象,它的思想在1970年代早期就已经存在,而具体实现上的一个里程碑是在1980年代。它代表了一种通用概念:从一个计算机进程中调用另一个进程的函数或过程,无论这两个进程是否在同一台机器上。 HTTP首次出现在1991年。它是由蒂姆·伯纳斯-李在1990年至1991年期间开发的,作为万维网(World Wide Web,简称WWW)项目的一部分。 因此从时间线上看,RPC 是早于 HTTP 出现的。
2、既生 RPC 何生 HTTP有了RPC,理论上可以通过各种协议进行方法调用,但HTTP为万维网提供了一个标准化的、广泛支持的方式来交换信息和服务,它不仅限于方法调用,还包括数据的获取、提交、更新和删除等。
主要区别比方说 A 公司开发了一套数据管理系统,在 A 公司内部可以使用 RPC 协议 进行方法调用获取数据,而这个时候 B 公司想要集成 A 公司的能力,这个时候通过方法调用的方式就不大合适,就需要利用万维网上更加标准的协议来进行通信,也就是 HTTP 协议。
RPC 与 REST 最大的区别就在于 RPC 提供了更好的抽象,甚至将网络传输细节彻底隐藏了,而 REST 没有。具体来说,REST 至少要求用于提供 URL 以及请求参数,而 RPC 隐藏了与网络传输的相关实现细节。另一方面,RPC 可以基于任何网络通信协议,而 REST 通常基于 HTTP(或者 HTTPS)协议。
HTTP 协议和 RPC 协议在性能方面有一些差异,这些差异主要由以下几个因素决定:
相对来说,RPC 协议通常在性能方面比 HTTP 协议更优秀。由于 RPC 协议的设计目标更加专注于方法调用和参数传递,它通常采用更紧凑的数据格式、支持长连接等机制,以提供更高的性能和效率。但在实际应用中,具体的性能差异需要根据具体情况进行评估和测试。
二、How1)核心概念从上面中我们认识了 RPC 的五大概念,可以通过一张时序图将五大概念串行起来,如下:
具体流程:
当我们认识到 RPC 的通信架构了,进一步就可以考虑如何实现 RPC 框架了!
其中 Client 客户端 和 Server 服务端 是关键角色,一个负责消费,一个负责提供。在 Client 客户端 我们要实现无感知地侵入,达到客户端完全不会意识到 Server 服务端 的存在,就需要用上 Proxy 代理 能力。当代理拦截到客户端调用的方法后,还需要将数据序列化后进行发送,这个时候 Serializer 模块 就不可少,当序列完数据就得通过网络将数据进行传输,因此便需要 Network 模块,但是在传输之前,我们需要找到远程服务的地址,因此 Registry 注册中心 也少不了。
1、五大模块通过简单梳理我们大概整理了 5 大模块:
架构图如下:
2、技术分析聊完理论谈实践,为了实现以上各个模块之间的串行能力,我们需要用到的技术能力如下:
1)动态代理生成 Client Stub 存根 和 Server Stub 服务端骨架 的时候需要用到 Java 的动态代理技术,可以使用JDK提供的原生的动态代理机制,也可以使用开源的CGLib代理, Javassist字节码生成技术。
在构建RPC框架时,生成 Client Stub 存根 和 Server Stub 服务端骨架 是实现远程方法调用不可或缺的一环。这一过程往往需要动态代理技术来实现,在Java平台上,我们有几种选择来达到这个目的。
序列化是数据处理的关键环节,它使得复杂数据结构能够转换成字节序列,以便于存储或网络传输,这一过程亦称作编码。相对地,反序列化将这些字节序列重新构建成原始对象,即解码过程。在分布式系统与数据交换频繁的应用中,序列化的效率至关重要。
当评估并选择合适的序列化框架时,效率、灵活性和生态支持是几个关键的考量因素。当前市场上的一些高效开源序列化库,比如Kryo、FastJson和Protobuf,各自都有其优势。
为了提高系统处理并发请求的能力,传统的同步阻塞IO(BIO)模型并不适宜,因为它在等待数据读写过程中会导致线程阻塞,从而降低了并发处理的效率。因此,采用非阻塞IO(NIO)是解决高并发场景下性能问题的恰当选择。NIO支持异步IO操作,允许线程在处理其它任务时并行地等待IO操作完成,这大大提升了资源的利用率和系统的吞吐量。
在构建高并发网络应用时,我们有多种框架可以选择。Netty和Apache MINA是两个流行的高性能网络应用框架,它们都利用了Java NIO的优势。Netty特别被广泛用于其简单的API和稳定的性能,而MINA同样提供了一个易于使用和扩展的异步IO框架。根据应用的具体需求和开发团队的熟悉度,我们可以选取最适合的框架来构建我们的网络服务,以确保在高并发场景下应用的最佳网络性能和响应速度。
4)注册中心服务注册与发现是核心组件,它用于服务间的动态定位。市面上有多种成熟的服务注册中心方案,包括Redis、ZooKeeper、Consul等。其中,
选择合适的注册中心时,我们不仅需要考虑技术特性,比如数据一致性、可用性和可扩展性,还要考虑与现有系统环境的兼容性,以及未来的维护和支持情况。每种方案都有其特定优势和场景适用性,例如Redis在处理高速缓存和消息队列方面表现卓越,Consul提供更现代的服务网络功能,如健康检查和服务网格集成,ZooKeeper凭借其强一致性的特点,经常被选用来处理服务注册和发现的问题,同时有效解决分布式系统中避免单点故障及处理分布式部署的挑战
4)常见 RPC 框架1、gRPC在本篇文章中,我们探究了 RPC 的核心概念和基本原理,了解到其如何使得跨网络的服务调用变得透明而无缝。了解RPC不仅仅是关于掌握一个技术的使用,更是理解分布式系统设计中关于模块化、服务解耦、和伸缩性设计的深层次思想。 随着微服务架构的兴起,RPC也随之进化,适应了更复杂的网络模式和更严格的性能需求。无论你是一个初级开发者还是高级开发者,RPC都应该是你日常开发过程中绕不开的一个话题。未来的网络计算充满了无限可能,而RPC无疑将继续在其中扮演着重要的角色。感谢您的阅读!
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved