在单体架构体系时期,我们写一个函数都是在本地注入调用就行了。但是在互联网公司,服务都是部署在不同服务器上的分布式系统,如何调用呢?
RPC 全称 Remote Procedure Call——远程过程调用。RPC技术简单说就是为了解决远程调用服务的一种技术,在提供强大的远程调用能力时不损失本地调用的语义简洁性。
Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于 2011 年末对外开源,仅支持 Java 语言。
Motan:微博内部使用的 RPC 框架,于 2016 年对外开源,仅支持 Java 语言。 Tars:腾讯内部使用的 RPC 框架,于2017 年对外开源,仅支持 C++ 语言。
Spring Cloud:国外 Pivotal 公司 2014 年对外开源的 RPC框架,提供了丰富的生态组件。
gRPC:Google 于 2015 年对外开源的跨语言 RPC 框架,支持多种语言。
Thrift:最初是由 Facebook 开发的内部系统跨语言的 RPC 框架,2007 年贡献给了 Apache 基金,成为Apache 开源项目之一,支持多种语言。
RPC框架一般使用长链接,不必每次通信都要3次握手,减少网络开销。
RPC框架一般都有注册中心,有丰富的监控管理
发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作 协议私密,安全性较高 RPC
协议更简单内容更小,效率更高,服务化架构、服务化治理,RPC框架是一个强力的支撑。
应用场景
特征:
长链接通讯;
注册发布机制;
安全性,没有暴露资源操作;
微服务支持;
应用举例:
分布式操作系统的进程间通讯;
构造分布式设计的软件环境;
远程数据库服务;
分布式应用程序设计;
分布式程序的调试;
服务消费者(client客户端)通过本地调用的方式调用服务。
客户端存根(client stub)接收到请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息 体。
客户端存根(client stub)找到远程的服务地址,并且将消息通过网络发送给服务端。
服务端存根(server stub)收到消息后进行解码(反序列化操作)。
服务端存根(server stub)根据解码结果调用本地的服务进行相关处理。
本地服务执行具体业务逻辑并将处理结果返回给服务端存根(server stub)。
服务端存根(server stub)将返回结果重新打包成消息(序列化)并通过网络发送至消费方。
客户端存根(client stub)接收到消息,并进行解码(反序列化)。
服务消费方得到最终结果。
动态代理 生成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提供服务注册与发现功能。
负载均衡 在高并发的场景下,需要多个节点或集群来提升整体吞吐能力。
健康检查 健康检查包括,客户端心跳和服务端主动探测两种方式。
阅读量:2030
点赞量:0
收藏量:0