之前写了一篇关于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原理二的更多相关文章

  1. 你应该知道的RPC原理

    你应该知道的RPC原理 在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司尤其是大型互 ...

  2. word2vec原理(二) 基于Hierarchical Softmax的模型

    word2vec原理(一) CBOW与Skip-Gram模型基础 word2vec原理(二) 基于Hierarchical Softmax的模型 word2vec原理(三) 基于Negative Sa ...

  3. RPC原理解析

    1.RPC原理解析 1.1 什么是RPC RPC(Remote Procedure Call Protocol) --远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络 ...

  4. 简述RPC原理实现

      前言 架构的改变,往往是因为业务规模的扩张. 随着业务规模的扩张,为了满足业务对技术的要求,技术架构需要从单体应用架构升级到分布式服务架构,来降低公司的技术成本,更好的适应业务的发展. 分布式服务 ...

  5. RPC 原理

    转载地址:你应该知道的 RPC 原理 在校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司 ...

  6. juc线程池原理(二):ThreadPoolExecutor的成员变量介绍

    概要 线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析ThreadPoolExecutor类,来了解线程池的原理. ThreadPoolExecutor数据结构 Thread ...

  7. 并发之AQS原理(二) CLH队列与Node解析

    并发之AQS原理(二) CLH队列与Node解析 1.CLH队列与Node节点 就像通常医院看病排队一样,医生一次能看的病人数量有限,那么超出医生看病速度之外的病人就要排队. 一条队列是队列中每一个人 ...

  8. 一文搞懂RPC原理

    RPC原理解析 什么是RPC RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.R ...

  9. Mybatis架构原理(二)-二级缓存源码剖析

    Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...

随机推荐

  1. nginx入门三

    负载均衡 upstream upstream app_server { server 127.0.0.1:8000; server 192.168.2.134:80; server 47.xx.xx. ...

  2. Linux注销&登陆

    ⒈注销 ①在命令行使用logout,此指令在图形界面无效.

  3. Mean shift

    转载:http://blog.csdn.net/google19890102/article/details/51030884 然后引入opencv中的pyrMeanShiftFiltering函数: ...

  4. grep基础用法

    功能:全面搜索正则表达式并把行打印出来,是一种强大的文本搜索工具. grep  yuan  filename :在文件中搜索yuan 这个字符串,并把含有此字符串的行打印出来,也可以多文件搜索.  g ...

  5. c# 界面自适应大小

    采用在窗体事件SizeChanged里面代码控制大小和位置,达到自动适应窗体大小,这样做调整起来方便. private void FrmMain_SizeChanged(object sender, ...

  6. saltstack自动化运维系列②之saltstack的数据系统

    saltstack自动化运维系列②之saltstack的数据系统 grains:搜集minion启动时的系统信息,只有在minion启动时才会搜集,grains更适合做一些静态的属性值的采集,例如设备 ...

  7. 转载:Nginx的命令行控制(1.6)《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19621.html 在Linux中,需要使用命令行来控制Nginx服务器的启动与停止.重载配置文件.回滚日志文件.平滑升级等行为.默认 ...

  8. python装饰器@用法

    这个是我见过比较好的讲解链接: [廖雪峰的官方网站 - 装饰器]

  9. 同时装了Python3和Python2,怎么用pip

    作者:匿名用户链接:https://www.zhihu.com/question/21653286/answer/95532074来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  10. Android 自定义View二(深入了解自定义属性attrs.xml)

    1.为什么要自定义属性 要使用属性,首先这个属性应该存在,所以如果我们要使用自己的属性,必须要先把他定义出来才能使用.但我们平时在写布局文件的时候好像没有自己定义属性,但我们照样可以用很多属性,这是为 ...