菜菜哥,我最近终于把Socket通信调通了

这么底层的东西你现在都会了,恭喜你离涨薪又进一步呀

http协议不也是利用的Socket吗

可以这么说,http协议是基于TCP协议的,底层的数据传输可以说是利用的socket

既然Socket通信会了,那一个rpc的框架不就很容易就能实现了吗?

一个比较完备的rpc框架可能并非像你所想那样简单,要不然人人都可以出RPC框架了

有那么难吗?我觉得没有那么难呀

如果你能解决掉这些问题,我觉得你真的是大牛了

RPC是远程过程调用(Remote Procedure Call)的缩写形式,是在多任务操作系统或联网的计算机之间运行的程序和进程所用的通信技术

01
开局

撸码的人都应该知道,现代编程中最常用的系统之间通信方式是:http调用和rpc调用。对于同一个网络或者说是互通的网络环境中,rpc调用方式是系统间通信交互最常用的方式,比基于http协议的通信方式性能高出数倍甚至数个量级。我司的平台rpc通信,每秒在几万甚至更高,每次调用的通信时间在一定程度上几乎可以忽略不计,再加上我们首席架构师深厚的系统设计功力,采用进程内缓存等等优化措施,一次rpc调用的整体平均时间也在一毫秒之下。这是http协议无法达到的速度,如果你在浏览器的F12的窗口观察过,一个http协议调用如果整体花费的时间在5毫秒甚至10毫秒,那么其实就可以认为这个http请求响应时间是很短的了。

所以绝大部分公司内部的系统之间通信都会采用rpc调用这种方式。这里不要抬杠,如果你的公司内部系统通信采用的是基于http协议的,那说明你们的系统很有可能没有性能的要求。

RPC调用虽然简化了撸码的难度,但是想要实现一套rpc框架,何止容易,一套优秀的rpc框架,更是难如登天。

01
连接服务

多数rpc框架的服务端以service的方式来运行,为了避免和其他进程发生监听端口的冲突,一般会随机选择一个端口来进行监听。虽然这看上去很好,但是却给client端带来了麻烦,如果服务端监听固定端口,client连接服务端的时候,最少可以在代码中固定写死服务端的IP和端口。但是现在服务端监听的端口是随机的,而且更可怕的是服务器有可能会更换或者切换IP,那client怎么才能正确的去和服务端建立连接呢?

服务端之所以会采用这种随机方式来监听端口,其中很大一个原因是为了以后扩容。client如何正确的去连接服务器则采用了一个集中式的方案,服务端引入了一个服务注册中心的概念,有的系统可能会以别的名称来体现,但是作用是类似的。这个注册中心存储着所有的服务端信息,其中包括每个服务端的IP和端口,有的甚至还有版本信息,每个服务端进程启动的时候,都是采用主动连接注册中心,主动注册的方式。client端在发起连接服务的时候,首先去注册中心查找已经注册的服务端信息,然后进行连接。这样rpc调用在某种程度上在连接步骤就实现了“自动化”。

02
调用方法

当client和服务端建立tcp连接之后(有的rpc框架会采用udp协议),下一个问题就是client和服务端怎么相认的问题了。举个栗子:客户端想要实现一个获取用户姓名的方法,方法名怎么定义才能让服务端正确识别出来呢?是传一个字符串“GetName”,还是传一个整数1来代表呢?服务端的返回结果,如果发生异常改如何返回呢?

当我们在本地调用一个函数,语法,语义,以及语法语义的分析,编译器已经帮我们做好了这些,但是rpc是远程过程调用,虽然表面上和本地类似,但是已经出现了跨网络的情况,语法语义等等这些分析需要client和服务端协商一致。

其实现代几乎大部分rpc通信都遵循一个标准:

当client发起一个远程调用的时候,它首先会先调用本地的Stub,它负责将调用的接口,函数以及参数按照约定好的协议格式进行编码,然后通过本地的Runtime进行传输,最后通过网卡将数据包发送到指定的服务器。

服务器Runtime接收到请求之后,会首先调用本地的Stub按照约定好的协议格式进行解码,最后调用服务端具体的函数。函数执行完毕,把结果利用本地的Stub编码之后通过runtime发送给客户端。客户端Runtime接收到消息利用本地Stub进行解码,然后进行其他处理。

由此可见,现代的rpc框架其实是把协议的封装和数据的发送分别抽象成了单独的层。Stub负责协议部分,Runtime处理数据发送以及网络相关部分。

03
网络数据传输

数据通过网络传输过程中,每个数据包的完整性如何来识别,如果是一个简单int型数据很简单,但是如果是一个类或者一个数组,甚至是其他变长的类型,rpc的通信协议如何约束这些,如果能正确识别出来数据是协议部分最难处理的部分。更何况还有大头小头编码的问题。

凡是基于网络传输的形式,任何通信都是不可靠的,网络本质是不可靠的。包括网络抖动,错误等造成的丢包,粘包现象,如何正确的处理也是一个rpc通信中很重要的部分。一个rpc请求失败,是直接丢弃还是重试,这些策略都需要去规定。

04
性能

1.一个rpc调用如果采用同步的方式,性能会大大打折扣,如何实现rpc的异步调用,这是一个rpc是否优秀的重要指标。

2.无论rpc的网络传输多么优秀,都会有性能损耗,能否把某些结果数据设置缓存?

3.无论是client还是服务端,处理请求的线程能否重用(线程池)?

4.能否支持多语言呢?

socket虽易,RPC却难

程序员修神之路--设计一套RPC框架并非易事相关推荐

  1. 多个容器一起打包_程序员修神之路容器技术为什么会这么流行(记得去抽奖)

    菜菜哥,你上次讲的kubernetes我研究了一下,你再给我讲讲docker呗 docker可很流行呀 kubernetes是容器编排技术,容器不就是指的docker吗? docker可不等于容器哦, ...

  2. 程序员修神之路--晦涩难懂的CAP,是否完全正确?

    微信搜一搜 架构师修行之路 菜菜哥,帮忙解决一个问题 是不是面试又被虐了? 是的呢,这次面试官问我什么是CAP? 这个可就说来话长了...... 01 PART CAP 说到CAP,首先不能不说分布式 ...

  3. 程序员修神之路--简约而不简单的分布式通信基石

    点击"蓝字"关注,领取架构书籍 菜菜哥,请教一个问题呗 面试又被卡住了? 还是你了解我呀,tcp协议面向连接是怎么回事呢? 这个说详细起来,那本好几百页的tcp协议的书籍你倒是可以 ...

  4. 程序员修神之路--分布式系统设计理念这么难学?

    点击"蓝字"关注我们吧 福利:有件小事想和大家说一下 菜菜哥,问你个问题,为什么现在的系统都设计为分布式系统呢? 这个问题问得好,就像为什么程序员会慢慢脱发一样神奇 01 PART ...

  5. 程序员修神之路--打通Docker镜像发布容器运行流程

    菜菜哥,我看了一下docker相关的内容,但是还是有点迷糊 还有哪不明白呢? 如果我想用docker实现所谓的云原生,我的项目该怎么发布呢? 这还是要详细介绍一下docker了 Docker 是一个开 ...

  6. 程序员修神之路--容器技术为什么会这么流行(记得去抽奖)

    菜菜哥,你上次讲的kubernetes我研究了一下,你再给我讲讲docker呗 docker可很流行呀 kubernetes是容器编排技术,容器不就是指的docker吗? docker可不等于容器哦, ...

  7. 程序员修神之路--kubernetes是微服务发展的必然产物

    菜菜哥,我昨天又请假出去面试了 战况如何呀? 多数面试题回答的还行,但是最后让我介绍微服务和kubernetes的时候,挂了 话说微服务和kubernetes内容确实挺多的 那你给我大体介绍一下呗 可 ...

  8. 程序员修神之路--高并发系统设计负载均衡架构

    点击上方"蓝字"关注,酷爽一夏 菜菜哥,上次你给我讲的分库分表策略对我帮助很大 有帮助就好,上次请我的咖啡也很好喝~ 呵呵,不过随着访问量的不断加大,网站我又加了nginx做负载均 ...

  9. 程序员修神之路--用NOSql给高并发系统加速

    领取福利 记得长按,领取技术书籍哦 随着互联网大潮的到来,越来越多网站,应用系统需要海量数据的支撑,高并发.低延迟.高可用.高扩展等要求在传统的关系型数据库中已经得不到满足,或者说关系型数据库应对这些 ...

最新文章

  1. C# 代理应用 - Cachable
  2. 轻松自动化---selenium-webdriver(python) (七)
  3. [html] 说说video标签中预加载视频用到的属性是什么?
  4. android 透明状态栏方法及其适配键盘上推(一)
  5. 主成分分析法案例_主数据管理第一步——识别主数据
  6. spring定时器的使用
  7. Windows桌面图标消失或桌面路径变更
  8. SHON WEBB:搞好人际关系的5点小技巧
  9. 中国政府数据开放许可协议(CLOD)研究
  10. x264 2pass编码说明
  11. 算法笔记 分治:循环赛日程 棋盘覆盖 选择问题 输油管问题 整数因子分解
  12. 颜宁:学术圈问题很多,也不分国籍,希望年轻一代守住底线
  13. vue如何实现打印功能
  14. centos7 nbd 挂在qcow2或qcow,raw,虚机镜像,virsh,virt,使用qemu-nbd挂载qcow2镜像文件
  15. java x_java - “x = x ++”后的x是什么?
  16. 使用Python进行自动化测试
  17. Linux多定时器实现之三——Windows和Linux通用版
  18. micro bit python_python教程之micro:bit俄罗斯方块游戏
  19. My Interview
  20. 工业通讯 | STM32F4xx应用控制器与SoM集成

热门文章

  1. 深圳dotnet俱乐部新群
  2. Teams的manifest文件开始支持多语言
  3. 荣耀9igoogle模式_iGoogle个性化主页的6种替代方法
  4. 如何停止Internet Explorer 11的建议站点?
  5. 谷歌相册_Google相册中的新存档功能是什么?
  6. 管理员获得所有权_在Windows 7中获得注册表项的所有权
  7. 《A Seat at the Table》作者访谈录
  8. GPhone、OPhone、UPhone、APhone、IPhone:满城尽带XPhone
  9. Java中Filter的理解
  10. 由塔科马大桥事件 谈软件架构