十大软件公司排名,高淳seo外包公司,centos7 wordpress安装,山西格泰网站建设RPC 是Remote Procedure Call的缩写#xff0c;译为远程过程调用。是一个计算机通信协议。 1、为什么需要远程调用
在如何给女朋友解释什么是分布式这一篇文章中介绍过#xff0c;为了提升饭店的服务能力#xff0c;饭店从一开始只有一个负责所有事情的厨师发展成有厨师、切…RPC 是Remote Procedure Call的缩写译为远程过程调用。是一个计算机通信协议。 1、为什么需要远程调用
在如何给女朋友解释什么是分布式这一篇文章中介绍过为了提升饭店的服务能力饭店从一开始只有一个负责所有事情的厨师发展成有厨师、切菜师、备菜师等多个角色。
在饭店只有一个厨师的时候厨师想要做出一道美味的番茄炒蛋的时候他需要自己洗番茄、切番茄、打鸡蛋、炒菜。整个过程不需要其他人参与自己就完全可以完成了。这就是古老的集中式应用中一台单体计算机就可以搞定所有事情了。
制作番茄炒蛋{厨师-洗菜-切菜-炒菜
}
随着饭店发展需要明确分工让专业的人负责专业的事儿。所以整个做菜过程中不再只有厨师参与了。需要有多个角色备菜师傅负责准备番茄和鸡蛋、切菜师傅负责切菜、厨师只要负责炒菜就行了。
但是随着分工明确制作番茄炒蛋的过程不再是只有一个人参与的过程了。这个过程中需要多方协作。厨师准备炒菜之前需要先通知备菜师傅和切菜师傅前序工作准备好之后才能进行炒菜。
制作番茄炒蛋{备菜师-洗菜切菜师-切菜厨师-炒菜
}
这种情况下厨师就要依赖很多外人来参与这个炒菜工作。而他在通知备菜师帮他洗菜通知切菜师傅帮他切菜的时候这个过程就是远程过程调用。
大多数情况下一般是服务员直接到厨房下单然后后厨有一个人员分别把菜单分发给备菜师、切菜师和厨师。
这个过程就和计算机系统很像了。如今的大型网站都是分布式部署的。拿一个下单流程来说可能涉及到物流、支付、库存、红包等多个系统后而多个系统又是分别部署在不同的机器上的分别由不同的团队负责。而要想实现下单流程就需要用到远程调用。
下单{库存-减少库存支付-扣款红包-红包抵用物流-生成物流信息
}
2、到底什么是远程过程调用
RPC 是指计算机 A 上的进程调用另外一台计算机 B 上的进程其中 A 上的调用进程被挂起而 B 上的被调用进程开始执行当值返回给 A 时A 进程继续执行。
调用方可以通过使用参数将信息传送给被调用方而后可以通过传回的结果得到信息。而这一过程对于开发人员来说是透明的。
就像后厨的例子一样服务员把菜单传给后厨厨师告诉备菜师和洗菜师开始工作然后他等待他们完成工作。备菜师和洗菜师工作完之后厨师开始炒菜。这个过程对于服务员来说其实是透明的他不需要关心到底后厨是怎么做菜的。 由于各服务部署在不同机器上要想在服务间进行远程调用免不了网络通信过程服务消费方每调用一个服务都要写一坨网络通信相关的代码不仅复杂而且极易出错。
如果有一种方式能让我们像调用本地服务一样调用远程服务而让调用者对网络通信这些细节透明那么将大大提高生产力比如服务消费方在执行orderService.buy(HHKB键盘)时实质上调用的是远端的服务。这种方式其实就是RPC。而提供了这种功能的工具我们称之为RPC框架。
在RPC框架中主要有三个角色Provider、Consumer和Registry。如下图所示 Server: 暴露服务的服务提供方。
Client: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
服务提供方和服务消费方都比较好理解就是后厨的洗菜师和厨师啦。厨师就是服务消费方洗菜师就是服务提供方。厨师依赖洗菜师提供的服务。
服务注册中心又是个什么东西呢
其实这个也比较好理解。对于那种很大的饭店来说厨师可能有很多集群部署洗菜师也有很多集群部署。而厨师想要洗菜师帮忙洗菜的时候他不会直接找某个洗菜师而是通知一个中间人这个人可能是洗菜师团队的领导也可能就是一个专门协调后厨的人员。他知道整个厨房有多少洗菜师也知道哪个洗菜师今天来上班了需要先进行服务注册。而且他还可以根据各个洗菜师的忙碌情况动态分配任务负载均衡。
这个中间人就是服务注册中心。 服务提供者启动后主动向注册中心注册机器ip、port以及提供的服务列表
服务消费者启动时向注册中心获取服务提供方地址列表可实现软负载均衡和Failover 3、实现RPC需要用到的技术
一个成熟的RPC框架需要考虑的问题有很多这里只介绍实现一个远程调用需要用到的基本技术感兴趣的朋友可以找一些开源的RPC框架代码来看下。
动态代理
生成 client stub和server stub需要用到Java 动态代理技术我们可以使用JDK原生的动态代理机制可以使用一些开源字节码工具框架 如CgLib、Javassist等。
序列化
为了能在网络上传输和接收 Java对象我们需要对它进行序列化和反序列化操作。
可以使用Java原生的序列化机制但是效率非常低推荐使用一些开源的、成熟的序列化技术例如protobuf、Thrift、hessian、Kryo、Msgpack
NIO
当前很多RPC框架都直接基于netty这一IO通信框架比如阿里巴巴的HSF、dubboHadoop Avro推荐使用Netty 作为底层通信框架。
服务注册中心
可选技术 Redis、Zookeeper、Consul、Etcd
参考资料 https://www.jianshu.com/p/dbfac2b876b1 4、开源RPC框架
Dubbo
Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架使得应用可通过高性能的 RPC 实现服务的输出和输入功能可以和 Spring框架无缝集成。目前已经进入Apache孵化器。
Motan
Motan是新浪微博开源的一个Java RPC框架。2016年5月开源。Motan 在微博平台中已经广泛应用每天为数百个服务完成近千亿次的调用。
gRPC
gRPC是Google开发的高性能、通用的开源RPC框架其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计基于ProtoBuf(Protocol Buffers)序列化协议开发且支持众多开发语言。本身它不是分布式的所以要实现上面的框架的功能需要进一步的开发。
thrift
thrift是Apache的一个跨语言的高性能的服务框架也得到了广泛的应用。 原文链接漫话如何给女朋友解释什么是RPC