rpc技术
RPC技术解决了分布式系统中,服务与服务之间的调用问题。
RPC技术能够帮助我们更好地解耦服务,提高扩展性、部署灵活性。它还能够提供跨语言支持、协议私密性、数据传输效率高等优点。
RPC技术通常用于分布式计算,它的主要目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC框架需提供一种透明调用机制,让使用者不必显式地区分本地调用和远程调用
如果我们开发简单的应用,业务流程简单、流量不大,根本用不着RPC。但当我们的应用访问量增加和业务增加时,发现单机已无法承受,此时可以根据不同的业务(划分清楚业务逻辑)拆分成几个互不关联的应用,分别部署在不同的机器上。
随着我们的业务越来越多,应用也越来越多,应用与应用相互关联调用,发现有些功能已经不能简单划分开,此时可能就需要用到RPC
1. 什么是RPC
RPC(Remote Procedure Call)是远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC的优点
RPC具有许多优点,包括分布式设计、部署灵活、解构服务和扩展性强。
常见的RPC框架
目前市面上有许多常见的RPC框架,包括Dubbo、Motan、Tars、Spring Cloud、gRPC和Thrift等。
2. RPC特性
长链接,RPC框架一般使用长链接,不必每次通信都要3次握手,减少网络开销。
注册中心
RPC框架一般都有注册中心,有丰富的监控管理。发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作协议私密,安全性较高。
协议简单
RPC协议更简单内容更小,效率更高。
服务化架构
服务化架构、服务化治理,RPC框架是一个强力的支撑。
3. RPC架构
RPC架构包括四个核心组件,分别是Client,Client Stub,Server以及Server Stub。Stub可以理解为存根
Client是客户端,它负责发起远程调用请求。
Client Stub是客户端存根,它负责将客户端的调用请求序列化为能够进行网络传输的消息体,并通过网络发送给服务端。
Server是服务端,它负责处理客户端的调用请求并返回结果。
Server Stub是服务端存根,它负责接收客户端发送的消息并进行反序列化操作,然后调用本地服务进行处理,并将处理结果序列化后通过网络返回给客户端。
4. RPC调用流程
具体步骤如下:
- 服务消费者(client客户端)通过本地调用的方式调用服务。
- 客户端存根(client stub)接收到请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体。
- 客户端存根(client stub)找到远程的服务地址,并且将消息通过网络发送给服务端。
- 服务端存根(server stub)收到消息后进行解码(反序列化操作)。
- 服务端存根(server stub)根据解码结果调用本地的服务进行相关处理。
- 本地服务执行具体业务逻辑并将处理结果返回给服务端存根(server stub)。
- 服务端存根(server stub)将返回结果重新打包成消息(序列化)并通过网络发送至消费方。
- 客户端存根(client stub)接收到消息,并进行解码(反序列化)。
- 服务消费方得到最终结果。
5. 涉及到的技术
动态代理
生成Client Stub(客户端存根)和Server Stub(服务端存根)的时候需要用到java动态代理技术。
序列化
在网络中,所有的数据都将会被转化为字节进行传送,需要对这些参数进行序列化和反序列化操作。目前主流高效的开源序列化框架有Kryo、fastjson、Hessian、Protobuf等。
NIO通信
Java 提供了 NIO 的解决方案,Java 7 也提供了更优秀的 NIO.2 支持。可以采用Netty或者mina框架来解决NIO数据传输的问题。开源的RPC框架Dubbo就是采用NIO通信,集成支持netty、mina、grizzly。
服务注册中心
通过注册中心,让客户端连接调用服务端所发布的服务。主流的注册中心组件:Redis、Zookeeper、Consul、Etcd。Dubbo采用的是ZooKeeper提供服务注册与发现功能。
负载均衡
在高并发的场景下,需要多个节点或集群来提升整体吞吐能力。
健康检查
健康检查包括,客户端心跳和服务端主动探测两种方式。
使用rpc技术的例子
RPC技术被广泛应用于分布式系统中。例如,阿里巴巴的Dubbo/Dubbox、Google的gRPC、Spring Boot/Spring Cloud等都是应用级的服务框架,它们都使用了RPC技术
举个例子,假设我们开发了一个电商系统,需要拆分出用户服务、商品服务、优惠券服务、支付服务、订单服务、物流服务、售后服务等等,这些服务之间都相互调用。这时内部调用最好使用RPC,同时每个服务都可以独立部署,独立上线 from刘金,转载请注明原文链接。感谢!