杂文-远程过程调用协议RPC(Remote Procedure Call Protocol)
来源:互联网 发布:如何找到域名的ip地址 编辑:程序博客网 时间:2024/05/17 04:58
这几天看开源相关的博客,几次均看到了Dubbo,了解到Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,然后对RPC这个概念了解了下,因为在分布式系统里面,多次遇到这个名词。
以下内容来自博客点击打开链接,知乎上也有一个不错的回答点击打开链接
我们常见程序的特点是服务消费方和服务提供方是本地调用关系。但是大型公司的系统都由成千上万大大小小的服务组成,各服务部署在不同的机器上,由不同的团队负责。这时就会遇到两个问题:
1)要搭建一个新服务,免不了需要依赖他人的服务,而现在他人的服务都在远端,怎么调用?
2)其它团队要使用我们的服务,我们的服务该怎么发布以便他人调用?
下文我们将对这两个问题展开探讨。
1、如何调用他人的远程服务?
由于各服务部署在不同机器,服务间的调用免不了网络通信过程,服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。
如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力,比如服务消费方在执行helloWorldService.sayHello(“test”)时,实质上调用的是远端的服务。这种方式其实就是RPC(Remote Procedure Call Protocol),在各大互联网公司中被广泛使用,如阿里巴巴的hsf、dubbo(开源)、Facebook的thrift(开源)、Google grpc(开源)、Twitter的finagle等。
2 如何发布自己的服务?
如何让别人使用我们的服务呢?有同学说很简单嘛,告诉使用者服务的IP以及端口就可以了啊。确实是这样,这里问题的关键在于是自动告知还是人肉告知。
人肉告知的方式:如果你发现你的服务一台机器不够,要再添加一台,这个时候就要告诉调用者我现在有两个ip了,你们要轮询调用来实现负载均衡;调用者咬咬牙改了,结果某天一台机器挂了,调用者发现服务有一半不可用,他又只能手动修改代码来删除挂掉那台机器的ip。现实生产环境当然不会使用人肉方式。
有没有一种方法能实现自动告知,即机器的增添、剔除对调用方透明,调用者不再需要写死服务提供方地址?当然可以,现如今zookeeper被广泛用于实现服务自动注册与发现功能!
zookeeper提供了“心跳检测”功能,它会定时向各个服务提供者发送一个请求(实际上建立的是一个 socket 长连接),如果长期没有响应,服务中心就认为该服务提供者已经“挂了”,并将其剔除,比如100.19.20.02这台机器如果宕机了,那么zookeeper上的路径就会只剩/HelloWorldService/1.0.0/100.19.20.01:16888。
服务消费者会去监听相应路径(/HelloWorldService/1.0.0),一旦路径上的数据有任务变化(增加或减少),zookeeper都会通知服务消费方服务提供者地址列表已经发生改变,从而进行更新。
更为重要的是zookeeper 与生俱来的容错容灾能力(比如leader选举),可以确保服务注册表的高可用性。
以下内容来自博客点击打开链接,知乎上也有一个不错的回答点击打开链接
我们常见程序的特点是服务消费方和服务提供方是本地调用关系。但是大型公司的系统都由成千上万大大小小的服务组成,各服务部署在不同的机器上,由不同的团队负责。这时就会遇到两个问题:
1)要搭建一个新服务,免不了需要依赖他人的服务,而现在他人的服务都在远端,怎么调用?
2)其它团队要使用我们的服务,我们的服务该怎么发布以便他人调用?
下文我们将对这两个问题展开探讨。
1、如何调用他人的远程服务?
由于各服务部署在不同机器,服务间的调用免不了网络通信过程,服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。
如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力,比如服务消费方在执行helloWorldService.sayHello(“test”)时,实质上调用的是远端的服务。这种方式其实就是RPC(Remote Procedure Call Protocol),在各大互联网公司中被广泛使用,如阿里巴巴的hsf、dubbo(开源)、Facebook的thrift(开源)、Google grpc(开源)、Twitter的finagle等。
要让网络通信细节对使用者透明,我们自然需要对通信细节进行封装,我们先看下一个RPC调用的流程:服务消费方(client)调用以本地调用方式调用服务;
- client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
- client stub找到服务地址,并将消息发送到服务端;
- server stub收到消息后进行解码;
- server stub根据解码结果调用本地的服务;
- 本地服务执行并将结果返回给server stub;
- server stub将返回结果打包成消息并发送至消费方;
- client stub接收到消息,并进行解码;
- 服务消费方得到最终结果
2 如何发布自己的服务?
如何让别人使用我们的服务呢?有同学说很简单嘛,告诉使用者服务的IP以及端口就可以了啊。确实是这样,这里问题的关键在于是自动告知还是人肉告知。
人肉告知的方式:如果你发现你的服务一台机器不够,要再添加一台,这个时候就要告诉调用者我现在有两个ip了,你们要轮询调用来实现负载均衡;调用者咬咬牙改了,结果某天一台机器挂了,调用者发现服务有一半不可用,他又只能手动修改代码来删除挂掉那台机器的ip。现实生产环境当然不会使用人肉方式。
有没有一种方法能实现自动告知,即机器的增添、剔除对调用方透明,调用者不再需要写死服务提供方地址?当然可以,现如今zookeeper被广泛用于实现服务自动注册与发现功能!
简单来讲,zookeeper可以充当一个服务注册表(Service Registry),让多个服务提供者形成一个集群,让服务消费者通过服务注册表获取具体的服务访问地址(ip+端口)去访问具体的服务提供者。如下图所示:
zookeeper提供了“心跳检测”功能,它会定时向各个服务提供者发送一个请求(实际上建立的是一个 socket 长连接),如果长期没有响应,服务中心就认为该服务提供者已经“挂了”,并将其剔除,比如100.19.20.02这台机器如果宕机了,那么zookeeper上的路径就会只剩/HelloWorldService/1.0.0/100.19.20.01:16888。
服务消费者会去监听相应路径(/HelloWorldService/1.0.0),一旦路径上的数据有任务变化(增加或减少),zookeeper都会通知服务消费方服务提供者地址列表已经发生改变,从而进行更新。
更为重要的是zookeeper 与生俱来的容错容灾能力(比如leader选举),可以确保服务注册表的高可用性。
阅读全文
0 0
- 杂文-远程过程调用协议RPC(Remote Procedure Call Protocol)
- RPC:远程过程调用协议(Remote Procedure Call protocol)
- RPC:远程过程调用协议(Remote Procedure Call protocol)
- 远程过程调用协议(Remote Procedure Call Protocol,RPC)
- RPC(Remote Procedure Call Protocol远程过程调用)
- RPC(Remote Procedure Call Protocol)——远程过程调用协议
- RPC(Remote Procedure Call Protocol)——远程过程调用协议
- RPC(Remote Procedure Call Protocol,远程过程调用协议),是什么?不就是webservice吗?
- RPC(Remote Procedure Call 远程过程调用)
- 远程过程调用(Remote Procedure Call,RPC)
- rabbitmq(六)RPC(Remote procedure call,远程过程调用)
- 远程过程调用 Remote Procedure Call
- Rabbitmq教程翻译(六)Remote procedure call (RPC)远程过程调用
- Remote Procedure Call(RPC)
- RPC(Remote procedure call)
- rpc(Remote Procedure Call Protocol)简易代码实现
- RabbitMQ RPC(Remote procedure call) 云计算集群的远程调用
- RPC(Remote procedure call)译文
- rhel-server-6.6-x86_64 openssh源码升级
- Kafka精确一次
- Linux驱动开发———总线设备驱动模型
- Android EventBus源码解析 带你深入理解EventBus
- python模块
- 杂文-远程过程调用协议RPC(Remote Procedure Call Protocol)
- IJPay 让支付触手可及-文中有视频
- 无需客户端探测远端电脑已开放的TCP 端口
- java 折半查找 非递归算法 递归算法
- 计算机英语·M
- MySQL优化系列(三)--索引的使用、原理和设计优化
- 第一次数据库作业(第3章)
- c++实验6-【项目5:字符串操作】
- GDB调试时的参数设置