微博轻量级RPC框架Motan正式开源:支撑千亿调用
支撑微博千亿调用的轻量级 RPC 框架 Motan 正式开源了,项目地址为https://github.com/weibocom/motan。
Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用。Motan 基于微博的高并发和高负载场景优化,成为一套简单、易用、高可用的 RPC 服务框架。
Motan 功能特点:简单、易用、高可用
无侵入集成、简单易用,通过 Spring 配置方式,无需额外代码即可集成分布式调用能力。
集成服务发现和服务治理能力,灵活支持多种配置管理组件,如 Consul、ZooKeeper 等。
支持自定义动态负载均衡、跨机房流量调整等高级服务调度能力。
基于高并发、高负载场景优化,具备 Failover、Failfast 能力,保障 RPC 服务高可用。
业界典型 RPC 框架对比
目前,业界 RPC 框架大致分为两类,一种是偏重服务治理,另一种侧重跨语言调用。
服务治理型的 RPC 框架典型的是 Dubbo 和 DubboX。Dubbo 是阿里开源的分布式服务框架,实现高性能的 RPC 调用同时提供了丰富的管理功能,是一款应用广泛的优秀的 RPC 框架,但现在较少维护更新。DubboX 是由当当在基于 Dubbo 框架扩展的一个 RPC 框架,支持 REST 风格的远程调用、Kryo/FST 序列化,增加了一些新的 feature。
这类 RPC 框架的特点是功能丰富,提供高性能的远程调用、服务发现及服务治理能力,适用于大型服务的服务解耦及服务治理,对于特定语言(Java)的项目可以实现透明化接入。缺点是语言耦合度较高,跨语言支持难度较大。
跨语言调用型的 RPC 框架有 Thrift、gRPC、Hessian、Hprose 等。这类 RPC 框架侧重于服务的跨语言调用,能够支持大部分的语言进行语言无关的调用,非常适合多语言调用场景。但这类框架没有服务发现相关机制,实际使用时需要代理层进行请求转发和负载均衡策略控制。
微博的 Motan RPC 倾向于服务治理型,跨语言方面正在尝试与 PHP 的调用集成。与 Dubbo 系列相比在功能上或许不是那么全,扩展实现也没有那么多,但 Motan 更注重简单、易用以及在高并发高可用场景的使用。
Motan 是基于 Java 的高性能轻量级 RPC 框架,其具备实用的服务治理功能和 RPC 协议扩展能力。服务发现灵活支持多种配置管理组件,基于高并发高负载场景的高可用策略优化,良好的 SPI(Service Provider Interface)扩展,详细的调用统计,灵活支持多种 RPC 传输协议,在使用上,无缝支持Spring 配置方式,通过简单灵活的配置即可快速接入使用。
Motan 的架构及模块设计
架构设计,分为服务提供方(RPC Server)、服务调用方(RPC Client)、注册中心(Registry)三个角色,Server 向 Registry 注册声明所提供的服务;Client 向 Registry 订阅指定服务,与 Registry 返回的服务列表的 Server 建立连接,进行 RPC 服务调用。Client 通过 Registry 感知 Server 的状态变更。三者的交互关系如下图:
服务模块化设计方便灵活扩展,Motan 主要包括 register、transport、serialize、protocol、cluster 等,各个模块都是支持通过SPI 进行扩展,各个模块的交互图如下:
register 模块
用来和注册中心进行交互,包括注册服务、订阅服务、服务变更通知、服务心跳发送等功能;Server 端会在系统初始化时通过 register 模块注册服务,Client 端在系统初始化时会通过 register 模块订阅到具体提供服务的 Server 列表,当 Server 列表发生变更时也由 register 模块通知 Client。
protocol 模块
用来进行 RPC 服务的描述和 RPC 服务的配置管理,这一层还可以添加不同功能的 filter 用来完成统计、并发限制等功能。
serialize 模块将 RPC 请求中的参数、结果等对象进行序列化与反序列化,即进行对象与字节流的互相转换;默认使用对 Java 更友好的 hessian2 进行序列化。
transport 模块用来进行远程通信,默认使用 Netty NIO 的 TCP 长链接方式。
cluster 模块
Client 端使用的模块,cluster 是一组可用的 Server 在逻辑上的封装,包含若干可以提供 RPC 服务的 Server,实际请求时会根据不同的高可用与负载均衡策略选择一个可用的 Server 发起远程调用。
在进行 RPC 请求时,Client 通过代理机制调用 cluster 模块,cluster 根据配置的 HA 和 LoadBalance 选出一个可用的 Server,通过 serialize 模块把RPC 请求转换为字节流,然后通过 transport 模块发送到 Server 端。
服务配置化增强了 Motan 的易用性,Motan 框架中将功能模块抽象为四个可配置的元素,分别为:
protocol:服务通信协议。服务提供方与消费方进行远程调用的协议,默认为 Motan 协议,使用 hessian2 进行序列化,Netty 作为 Endpoint 以及使用Motan 自定义的协议编码方式。 registry:注册中心。服务提供方将服务信息(包含 IP、端口、服务策略等信息)注册到注册中心,服务消费方通过注册中心发现服务。当服务发生变更,注册中心负责通知各个消费方。 service:服务提供方提供的服务。使用方将核心业务抽取出来,作为独立的服务。通过暴露服务并将服务注册至注册中心,从而使调用方调用。 referer:服务消费方对服务的引用,即服务调用方。
Motan 推荐使用 Spring 配置 RPC 服务,目前 Motan 扩展了 6 个自定义 Spring XML 标签 motan:protocol motan:registry motan:basicService
motan:service motan:basicReferer motan:referer
高可用方面是 Motan 的一大特点,支持多种服务治理和高可用机制,包括:
灵活多样的集群负载均衡策略,支持 ActiveWeight/Random/RoundRobin/LocalFirst/Consistent 等 6 种策略,并支持自定义扩展; 自动集成 Failover、Failfast 容错策略,实现故障节点自动摘除,自动探测恢复,有效进行服务故障隔离,远离服务卡死及雪崩; 连接池自定义控制,根据业务场景灵活配置; 支持多机房间调用流量压缩、动态流量调整,实现真正的跨 IDC 的高可用。
基于高并发、高负载场景的优化,具备在高压力场景下的高可用能力。
基准测试情况如下:
Server 端:并发多个 Client,连接数 50、并发数 100 的场景
空包请求:单 Server TPS 18W
1K String 请求:单 Server TPS 8.4W
5K String 请求:单 Server TPS 2W
Client端:(场景对比图如下)
Motan 提供了基础性能测试框架,欢迎使用者进行性能评估,源码请参考 motan benchmark 文档:
https://github.com/weibocom/motan/tree/master/motan-benchmark
Motan 使用及易用性方面,Motan 使用 Spring 进行配置,业务代码无需修改,工程依赖只涉及核心 5 个模块,且可以按需依赖。关于在项目中使用Motan 框架的具体步骤,可参考快速入门文档:https://github.com/weibocom/motan/blob/master/docs/wiki/zh_quickstart.md
是否重复造轮子
在 RPC 框架的选择上,如上面针对各种 RPC 框架的对比,当前业界可供选择并持续维护的优秀 RPC 框架并不多。同时鉴于微博的内部调用量非常大,并且会有很多定制化的场景,要做到平滑的迁移到这些 RPC 框架也需要做不少定制化的改造,最终微博决定自主研发。主要从以下几个方面考虑:
框架的性能和可用性需要定制化;
微博内部调用量级非常大,业界很少类似场景的应用经验可以借鉴,需要针对高并发和复杂逻辑场景定制优化。 比如Motan 的 Failover 和 Failfast 机制等尽量做到平滑的迁移;
线上业务迁移需要保障业务改造尽量少,支持可快速回退,这个必须有有效的机制保障。比如 Motan 的 inJvm 机制等未来多语言兼容接入诉求;
微博整体技术体系包括 Java 和 PHP,还有部分 Erlang、C++ 等,未来希望能够通过这套服务框架解决整体内部依赖调用问题。 技术积累储备及掌控力。
Motan 的发展及开源
Motan 当前在微博内部已经广泛应用,每天支撑着上亿的内部调用,这个过程也是一个持续改进优化的过程。从服务发现、服务容错、快速失败、故障降级等多方面,针对复杂业务架构及高并发场景进行不断的定制优化改进。随着虚拟化技术的兴起,弹性调度成为成熟技术框架不可或缺的能力,新的Motan 框架技术负责人也适时对其增加了数据流量压缩、动态流量调整、多注册中心支持等功能、让 Motan 能够适应时代的变化。
为了方便其他团队的复用,针对 Motan 核心功能进行抽离和封装,去除掉微博自身依赖,形成今天的 Motan 开源版本,希望能发挥开源社区的力量,进一步发展和发挥 Motan 的价值。
Motan 的期待
在这唯快不破的互联网时代,软件的开发速度已经达到了前所未有的高度。这得益于软件已有模块的大规模复用。在过去的几年里,开源软件无疑在这方面做出了巨大的贡献。
微博技术团队表示,受益于开源社区,同时也希望能够为开源社区贡献自己的力量。 Motan 是经过微博大规模实践的轻量级 RPC 框架,希望未来能有更多优秀的开源人一起进一步完善优化。也期待更多的公司可以享受 Motan 这个轻量级 RPC 框架带来的非一般的感觉。
Motan 项目地址: https://github.com/weibocom/motan
Q&A
1. Motan 和业界已有的 RPC 框架,比如 Dubbo 相比有什么优势?
Dubbo 功能上比较丰富,与 Dubbo 的分层来对比,Motan 的模块层次要更简单一些,没有 exchange 和 directory 等。从压测的结果来看,在微博的业务场景下 Motan 的性能比 Dubbo 要好一些。
2. 现在的版本能用于生产环境吗?
目前 Motan 支持了微博的绝大部分底层核心业务,目前看来比较稳定。但是不排除会有一些使用环境不一致造成的问题,建议最好测试一下再应用到生产环境。
3. Motan 支持跨语言调用吗?
目前暂时只支持 Java 应用,针对 PHP YAR 框架的支持已经在开发中,未来会支持更多语言。
4. 开源版 Motan 与微博内部的版本功能一样吗?
开源版 Motan 包含了内部版本中的大部分功能,主要是去除了一些内部的依赖组件相关的功能。
5. Motan 支持异步调用吗?如何实现?
Motan 的请求在传输层面为异步调用,不需要额外配置。
6. 我在使用 Motan 时遇到了问题,应该去哪里提问?
可以在 Github 里提交[Issue]: https://github.com/weibocom/motan/issues
微博轻量级RPC框架Motan正式开源:支撑千亿调用的更多相关文章
- 微博轻量级RPC框架Motan
Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用. ...
- 轻量级RPC框架-motan
https://github.com/weibocom/motan/wiki/zh_quickstart#%E7%AE%80%E5%8D%95%E8%B0%83%E7%94%A8%E7%A4%BA%E ...
- Dobbo的继任者?试用微博RPC框架Motan
从14年开始就陆续看到新浪微博RPC框架Motan的介绍,时隔两年后,微博团队终于宣布开源轻量级RPC框架Motan,项目地址: https://github.com/weibocom/motan/ ...
- 微博RPC框架motan入门笔记
Motan 是一套高性能.易于使用的分布式远程服务调用(RPC)框架. 功能 支持通过spring配置方式集成,无需额外编写代码即可为服务提供分布式调用能力. 支持集成consul.zookeeper ...
- C# 的轻量级 RPC 框架
Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Comple ...
- 轻量级RPC框架开发
nio和传统io之间工作机制的差别 自定义rpc框架的设计思路 rpc框架的代码运行流程 第2天 轻量级RPC框架开发 今天内容安排: 1.掌握RPC原理 2.掌握nio操作 3.掌握netty简单的 ...
- 基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇
基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇 前提 最近对网络编程方面比较有兴趣,在微服务实践上也用到了相对主流的RPC框架如Spring Cloud Gateway底层也切换 ...
- 基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇
前提 前置文章: Github Page:<基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> Coding Page:<基于Netty和SpringBoot实现 ...
- 基于Netty和SpringBoot实现一个轻量级RPC框架-Client篇
前提 前置文章: <基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> <基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇> 前 ...
随机推荐
- es2015(es6)学习总结
1.三种声明方式 var:它是variable的简写,可以理解成变量的意思. let:它在英文中是“让”的意思,也可以理解为一种声明的意思. const:它在英文中也是常量的意思,在ES6也是用来声明 ...
- CodeForces 779C Dishonest Sellers
贪心. 如果这周便宜,那么肯定这周买.另外要求这周至少买到$k$个,那么肯定是需要额外购买差价小的. #include<map> #include<set> #include& ...
- CodeForces 738E Subordinates
排序,构造. 相当于告诉我们一棵树$n$个节点,每个节点在哪一层,至少需要移动多少个节点,才能让这些节点变成一棵树. 按照层次排个序移动一下就可以了,优先选择那些不是$s$但是层次是$0$的节点,如果 ...
- 洛谷——P1994 有机物燃烧
P1994 有机物燃烧 题目背景 本来准备弄难点的,还是算了吧 题目描述 输入一种有机物,输出与氧气反应化学方程式中CO2和H2O的系数 输入输出格式 输入格式: 一行,一个字符串,表示有机物 输出格 ...
- Flask实战第40天:图片验证码生成技术
图片验证码生成 安装pillow pip install pillow 在utils下新建python package命名为captcha 把需要需要用到的字体放在captcha下 编辑captcha ...
- Python - 字符和字符值之间的转换
字符和字符值之间的转换 Python中, 字符和字符值, 直接的转换, 包含ASCII码和字母之间的转换,Unicode码和数字之间的转换; 也可以使用map, 进行批量转换, 输出为集合, 使用jo ...
- nyoj(表达式求值)
描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:"1+2 ...
- [Agc008F]Black Radius
[AGC008F] Black Radius Description 给你一棵有N个节点的树,节点编号为1到N,所有边的长度都为1 "全"对某些节点情有独钟,这些他喜欢的节点的信息 ...
- 【枚举】Petrozavodsk Summer Training Camp 2016 Day 6: Warsaw U Contest, XVI Open Cup Onsite, Sunday, August 28, 2016 Problem G. Equation
f(n)定义为n的十进制表示下所有位的平方和. 问你方程K*f(n)=n在a<=n<=b中的解的个数. 发现f(n)最大不超过2000,可以直接枚举f(n),然后判断K*f(n)的位的平方 ...
- 【FFT卷积】BZOJ3527-力
[题目大意] [思路] 很好这很FFT…… 想了半天也没明白到底什么是卷积∑的上下界,我当初学的时候没说一定要从0开始啊quq 我还是背不出FFT的模板我要狗带了 我上面写的什么乱七八糟的,要什么数学 ...