聊聊RPC原理二
之前写了一篇关于RPC的文章,浏览量十分感人:),但是感觉文章写得有些粗,觉得很多细节没有讲出来,这次把里边的细节再次补充和说明。
这次主要说的内容分为:
1. RPC的主要结构图。
2.分析结构图的中的细节和步骤。
关于RPC,大家都不陌生,其简写和介绍什么的我就不过多介绍了,可以从我上篇文章中看到,下面直接上我画的图,简单粗暴:

RPC的主要目的是将一个庞大的系统分离成不同的子系统,按照不同的功能,比如读库功能,记录日志等可以单独出来的功能单独出来,这样的好处是,不会像以前那样庞大的系统部署的时候每次都要整个系统进行重启,可以修改单独的模块,并且自己独立部署,这样大大提升效率。但是如果拆分的过细的话,可能需要维护很多的小项目,代码工程由一个大工程,拆分成很多小工程,而且启动功能并且进行测试的话一般至少启动两个服务,一个server和一个client,同时相应的zookeeper也要启动。
下面来说一下上图中每个模块的功能。
先来说一下zookeeper, 可能有些同学已经很熟悉zookeeper使用了,当然我也在博客中写过zookeepr实现的锁文章,它非常强大,但是这里不过多解释它强大之处,这次说它的作用。在RPC中zookeeper承担着服务的注册,心跳检测,记录client的相关信息,最关键的是要记录server的IP和端口号以及它提供service信息,版本号等信息。每个client在调用之前都要从zookeeper那里获取存活server的相关信息及提供服务的版本。这样client拿到这些信息后可以直接和server进行通信了。
里边有一个细节就是client和server在zookeeper中注册的znode是临时的ephemral的,这样的目的是在心跳检测的时候发现client或者server已经down了,需要从zk中剔除,这样client连接server失败的情况下重新从zookeeper中获取有效的server及service信息。
接下来就是server,在一些大型系统中,其实server是由很多台机器构成的,这里我为了简化就画了一台机器,当server和其中部署的service启动之后需要到zookeeper中进行注册,这样client就可以发现新部署的service了,通过zookeeper实现了动态的service上线和下线,是不是很厉害。在server中,由service声明和implementation实现,同时还有在使用过程中对应的bean对象。当然在server中还部署着netty服务,这个一会儿咱们就说。
继续看client,client在这里边充当着的是consumer,就是消费service所produce的服务。client应该也是多台的。client其实就相对比较简单,因为是调用方,所以只需要声明对应的service接口和相应的bean对象就行了。
然后就是netty服务了,这次咱们不说netty的详细内容,大家知道它是用来进行通信的,拥有高吞吐量,高并发,多协议实现,并且支持NIO,AIO的工具。有兴趣的同学可以读一些关于netty的文章。netty在这里扮演的角色就是通信,将调用的service以及相关的bean对象和参数进行序列化,找到从zookeeper获取的service所在的主机、IP、端口号、服务及版本等信息后进行TCP连接,发送给server后,在server中也有一个netty在对应的端口进行接口,接收后进行反序列化,然后通过动态代理实现接口调用,关于动态代理的实现可以参考我之前写过的文章。调用之后获取到执行结果后再以相反的顺序返回去。这就是netty实现的功能了。
这块基本就是RPC的主要核心实现细节,当然里边可能还会有一些细节我没有提到,因为RPC的功能也在不断完善中,所以还有一些新增的一些功能没有提及,比如server机器的比重等,这些在用到的工程中一看应该就会明白。
好了,希望你们能从这篇文章中获得收获。
欢迎转载,但转载请署名黄青石,谢谢。
聊聊RPC原理二的更多相关文章
- 你应该知道的RPC原理
你应该知道的RPC原理 在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司尤其是大型互 ...
- word2vec原理(二) 基于Hierarchical Softmax的模型
word2vec原理(一) CBOW与Skip-Gram模型基础 word2vec原理(二) 基于Hierarchical Softmax的模型 word2vec原理(三) 基于Negative Sa ...
- RPC原理解析
1.RPC原理解析 1.1 什么是RPC RPC(Remote Procedure Call Protocol) --远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络 ...
- 简述RPC原理实现
前言 架构的改变,往往是因为业务规模的扩张. 随着业务规模的扩张,为了满足业务对技术的要求,技术架构需要从单体应用架构升级到分布式服务架构,来降低公司的技术成本,更好的适应业务的发展. 分布式服务 ...
- RPC 原理
转载地址:你应该知道的 RPC 原理 在校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司 ...
- juc线程池原理(二):ThreadPoolExecutor的成员变量介绍
概要 线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析ThreadPoolExecutor类,来了解线程池的原理. ThreadPoolExecutor数据结构 Thread ...
- 并发之AQS原理(二) CLH队列与Node解析
并发之AQS原理(二) CLH队列与Node解析 1.CLH队列与Node节点 就像通常医院看病排队一样,医生一次能看的病人数量有限,那么超出医生看病速度之外的病人就要排队. 一条队列是队列中每一个人 ...
- 一文搞懂RPC原理
RPC原理解析 什么是RPC RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.R ...
- Mybatis架构原理(二)-二级缓存源码剖析
Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...
随机推荐
- 前端 - js方式Ajax/ jquery方式Ajax / 伪 ajax /伪ajax 进阶方式
DJANGO环境搭建: 目录文件: 关闭CSRF 添加目录文件路径 配置url 视图配置: index页面配置: 测试:(成功) 进入正题: ajax 通过GET提交数据至后台: <!DOCTY ...
- session和token
功能是一样的,都是要与浏览器建立连接,获取与客户端对应的用户数据,只不过完成这个功能的实现方式不太一样. 本质上的区别: session的使用方式是客户端cookie里存id,服务端session存用 ...
- 文加图, 理解Http请求与响应
1. http请求和响应步骤 在讲解OkHttp之前, 我们首先来个高清大图, 看下http请求的整个步骤, 有个整体概念. 2. http每一步详细内容 在一次完整的HTTP通信过程中, Web浏 ...
- GCC 符号表小结【转】
转自:https://blog.csdn.net/swedenfeng/article/details/53417085 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...
- springboot系列七:springboot 集成 MyBatis、事物配置及使用、druid 数据源、druid 监控使用
一.MyBatis和druid简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.M ...
- bzoj2588 Spoj10628. count on a tree
题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个 ...
- oracle 11g 空表导出
背景 oracle9用了一段时间,10用了一段时间,11现在算是主流了.11g也是坑人,空表竟然不导出,解决方法到时很多.这里只是记录下,知道有这个事情. 9的特点是还要用客户端管理工具链接服务器 1 ...
- javaScript——原型继承四步曲
<script> //js模拟类的创建以及继承 //第一步:创建父类 function Parent(name){ this.name = name; } //给父类添加属性方法 Pare ...
- 移植BOA服务器到开发板
移植BOA 服务器到GEC210 开发板 开发平台主机:VMWare--Ubuntu 10.04 LTS开发板:GEC210 / linux-2.6.35.7编译器:arm-linux-gcc-4.5 ...
- [学习笔记]Javascript的包装对象
例子1: var s="test"; s.len = 4; var t = s.len // t is undefined 原因是s是字符串,第二行代码,实际上是创建一个临时字符串 ...