做过分布式服务端的Java工程师,随着对技术底层的认知的加深,都会或多或少的会去想: 一个RPC框架需要考虑的问题有哪些,如何来解决?

下面我们围绕RPC通信框架,从如何实现这个角度做一个剖析,以及每个环节能做什么?

RPC框架简介

单体应用时代只有内外网通信,并没有服务间通信的诉求,随着单机服务性能下降,进入多服务分布式的时代后Rpc 框架才应运而生。

通信Rpc犹如生活中电网基建一样,是分布式服务的基础组成部分,一个传输电能,一个传输数据。

RPC ,Remote Procedure Call ,字面意思是远程过程调用,主要是解决服务间连接及数据交互,但除了通信和数据交互,为适应分布式架构/微服务架构的设计,通常还需要实现增值、增强的附加功能,下面展开来做一个介绍。

一个好的系统设计,通常是完整、系统、可扩展、可容错、高性能、支持高并发、可跟踪、有良好的设计模式等等,Rpc 框架的设计需要解决什么问题?

RPC通信方式设计

通信的底层是TCP/IP,在Java中网络传输通常使用Netty 或 Mina 的多路复用模型作为网络通信的底层。

通信底层当然还有一些优化方式,具体在Java架构师系列课程里面会涉及。

1.多传输协议支持

为什么要支持多种传输协议呢?在业务中,通常会遇到各种问题,比如:

  • 跨网络、机房问题
  • 跨语言问题
  • 长连接还是短连接
  • 传输安全
  • 传输性能

使用Http协议,虽然灵活便于管理、可以跨语言,但是明文、性能很差。通常适用于较低并发、异构系统对接、对外网关等。

使用Dubbo 传输协议,性能高、长连接,但目前跨语言做的还不够,单条大文件/数据传输可能会形成网络瓶颈。

Rmi ,性能较差,短连接,但对于单次大数据量传输却比较好,其他的还有Websocket 、Https、Thrift TTransport等,传输协议各有优缺点,所以支持多传输协议是有必要的。

2.多数据压缩/序列化支持

为什么要支持多序列化支持,主要考虑两个方面

  • 跨语言/异构平台间交互
  • 性能方面考虑

这个其实跟传输协议是搭配的,比如RMI 通常都是使用了标准的二进制序列化

目前有Protobuff、Dubbo 序列化、Hessian 、Java原生、Soap文本序列化、Http的表单序列化、Json、Thrift的TCompactProtocol等,同样各有优缺点,需要设计成可扩展的方式。

如何找到服务(寻址)并且实现资源合理

消费者如何知道提供者,并且知道当前是否存活,是设计RPC 框架需要考虑的第二大问题

1.多样的注册中心支持

不同的业务系统,对于服务间一致性要求并不同,这里有一个CAP权衡问题。

另外还要考虑是否推送提供者的变动、注册中心自身的安全问题、跨语言平台等因素。

比如:

  • Zookeeper,支持强一致并能通过Wacher机制主动进行通知,但可用性并不能完全保证
  • Consul ,通过Http方式满足服务发现,没有语言限制,但通知实时性比ZK Wacher略差

所以注册中心也需要做成插件化的可扩展方式。

2.多算法负载均衡、路由和多维度流量控制

负载均衡目的是为了最优使用同一服务间的资源使用,具体到设计中,需要考虑机器情况、服务的负载情况等

算法主要有随机、轮询、活跃情况、一致性Hash等。

在生产环境中能通过界面化的方式提供动态的更改权重、路由等规则,实现服务动态权重、熔断、限流、灰度、多版本等功能。

3.容错机制

考虑容错机制是系统完整性的一部分,failover、failfast、failback、failsafe 、forking、Broadcast …等,通常和负载均衡搭配。

让业务更方便的使用

支持普通配置的同时,支持集成到Spring等主流框架使用。配置的方式也有很多种,比如支持XML、注解、YAML、Properties、Json配置等。

可跟踪

可以进行依赖分析,数据的调用统计,并能图形、数据化将其显示出来

可跟踪需要解决这几个问题:

  1. 服务调用链路或依赖关系
  2. 调用次数及时间,提供容量/机器预算基准数据
  3. 预警

实现上可以兼容现有成型的APM链路跟踪,也是设计的考虑因素之一。

RPC其他

从架构的角度要考虑到设计模式的使用,比如常用的责任链、代理模式等。

容器化,Kubernetes 支持等。

RPC总结

正如前面说的,Rpc 框架相当于电网基建,是分布式系统的基础,如果不具备可靠、高性能、高并发、使用简易等特点,就很难满足日益增长的服务治理的需要。

实现RPC调用可能比较简单,但实现Rpc框架不仅需要深厚技术功底,也需要提供接地气、灵活的使用方式。

你可能也喜欢:

  1. RPC框架的实现原理,及RPC架构组件详解
  2. 如何从0到1设计一个类Dubbo的RPC框架
  3. 阿里P8架构师谈:主流RPC框架详解,以及与SOA、SOAP、REST的区别
  4. 详解RPC远程调用和消息队列MQ的区别

深度剖析RPC框架的核心设计相关推荐

  1. 常用RPC框架及如何设计一个RPC框架

    一天学会的Java基础课程,整整300集 拿出来分享给大家!拿走不谢!手把手教学,学会轻松就业_哔哩哔哩_bilibili 常用RPC远程调用框架有哪些? httpclient.grpc.dubbo. ...

  2. Python深度剖析贪吃蛇游戏的设计与实现

    Python游戏设计,它用一种不同的视觉展现效果,和更快速的动画来冲击我们的眼球,同时游戏里面也包含了很多的逻辑运算以及数学算法. Pygame背景 Pygame是跨平台Python模块,专为电子游戏 ...

  3. RPC框架的实现原理,及RPC架构组件详解

    RPC的由来 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时, ...

  4. 阿里P8架构师谈:主流RPC框架详解,以及与SOA、SOAP、REST的区别

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

  5. 高并发架构系列:如何从0到1设计一个类Dubbo的RPC框架

    优知学院 2019-01-22 18:43:51 之前持续分享的几十期阿里Java面试题中,几乎每次必问Dubbo,比如:"如何从0到1设计一个Dubbo的RPC框架",其实主要考 ...

  6. libevent源码深度剖析五

    libevent源码深度剖析五 --libevent的核心:事件event张亮 对事件处理流程有了高层的认识后,本节将详细介绍libevent的核心结构event,以及libevent对event的管 ...

  7. RPC框架原理及从零实现系列博客(二):11个类实现简单RPC框架

    项目1.0版本源码 https://github.com/wephone/Me... 在上一博文中 跟大家讲了RPC的实现思路 思路毕竟只是思路 那么这篇就带着源码给大家讲解下实现过程中的各个具体问题 ...

  8. 一文带你实现RPC框架

    原文地址:一文带你实现RPC框架 想要获取更多文章可以访问我的博客 - 代码无止境. 现在大部分的互联网公司都会采用微服务架构,但具体实现微服务架构的方式有所不同,主流上分为两种,一种是基于Http协 ...

  9. 自己做量化交易软件(11)通通量化AI框架的核心--框架结构

    自己做量化交易软件(11)通通量化AI框架的核心–框架结构 既然我说了要开源通通量化AI框架,就算大家得到了代码,也不清楚怎么去改进和修改.因此我在最后完善框架的空闲,逐步介绍框架的核心设计思想,大家 ...

最新文章

  1. BeanShell中的Java指令和表达式
  2. 生产环境一个like模糊匹配SQL优化
  3. 数据流中的第k大元素的golang实现
  4. android线程栈默认大小,线程的默认最大堆栈大小 - Internet Information Services | Microsoft Docs...
  5. arm-linux 交叉编译后程序,ARM交叉编译下,应用程序实践
  6. python chromium 自动化_Python Chromium自动化
  7. TMS320F28335之定时器
  8. 无法显示 xml 页 解决方案
  9. 【11.5校内测试】【倒计时5天】【DP】【二分+贪心check】【推式子化简+线段树】...
  10. Mac 安装redis
  11. 去除android控件滑动的时候出现的阴影
  12. SSL WSS HTTPS
  13. PowerDesigner通过jdbc连接MySQL实现逆向工程步骤
  14. [蓝桥杯]基础练习 特殊回文数
  15. 【转】计算机键盘功能键作用
  16. c++中类的private的static变量实现类对象的数据共享
  17. vue 仿外卖app-数据mock部分
  18. 使用Jmeter做性能测试
  19. YOLOv5+TensorRT+Win11(Python版)
  20. OpenCV粘连对象计数

热门文章

  1. 如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信
  2. 一文读懂 | 进程怎么绑定 CPU
  3. 一道90%都会做错的指针题
  4. python基于opencv的手势识别_怎么在Python3.5 中利用OpenCV实现一个手势识别功能
  5. 每日一题(11)—— 结构体大小
  6. 小程序背景图满屏_竞赛答题小程序
  7. 【Pytorch神经网络基础理论篇】 03 数据操作 + 数据预处理
  8. python ftplib_python:使用ftplib编写FTP客户端
  9. python简笔画怎么画_怎样用tk语句在Python下画一棵树
  10. Vue3 Composition API(二)——computed、watchEffect、setup中使用ref