Motan框架初体验
1、什么是Motan?
Motan是一套基于java开发的RPC框架,除了常规的点对点调用外,motan还提供服务治理功能,包括服务节点的自动发现、摘除、高可用和负载均衡等。Motan具有良好的扩展性,主要模块都提供了多种不同的实现,例如支持多种注册中心,支持多种rpc协议等。
2、微博开源框架Motan介绍
微博的Motan RPC服务,底层通讯引擎采用了Netty网络框架,序列化协议支持Hessian和Java序列化,通讯协议支持Motan、http、tcp、mc等,Motan框架在内部大量使用,在系统的健壮性和服务治理方面,有较为成熟的技术解决方案,健壮性上,基于Config配置管理服务实现了High Availability与Load Balance策略(支持灵活的FailOver和FailFast HA策略,以及Round Robin、LRU、Consistent Hash等Load Balance策略),服务治理方面,生成完整的服务调用链数据,服务请求性能数据,响应时间(Response Time)、QPS以及标准化Error、Exception日志信息。
3、Motan提供的主要功能
服务发现 :服务发布、订阅、通知
高可用策略 :失败重试(Failover)、快速失败(Failfast)、异常隔离(Server 连续失败超过指定次数置为不可用,然后定期进行心跳探测)
负载均衡 :支持低并发优先、一致性 Hash、随机请求、轮询等
扩展性 :支持 SPI 扩展(service provider interface)
其他 :调用统计、访问日志等
架构概述
Motan中分为服务提供方(RPC Server),服务调用方(RPC Client)和服务注册中心(Registry)三个角色。
- Server提供服务,向Registry注册自身服务,并向注册中心定期发送心跳汇报状态;
- Client使用服务,需要向注册中心订阅RPC服务,Client根据Registry返回的服务列表,与具体的Sever建立连接,并进行RPC调用。
- 当Server发生变更时,Registry会同步变更,Client感知后会对本地的服务列表作相应调整。
模块概述
Motan框架中主要有register、transport、serialize、protocol几个功能模块,各个功能模块都支持通过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框架中将功能模块抽象为四个可配置的元素,分别为:
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
Motan主要使用Spring进行配置,业务代码无需修改。关于在项目中使用Motan框架的具体步骤,请参考:快速入门。
在使用Motan框架时,除了配置之外还需要注意工程依赖及Motan框架本身的异常处理。
工程依赖
Motan框架采用模块化设计,使用时可以按需依赖。目前的模块有:
- motan-core
Motan核心框架 - motan-transport-netty
基于Netty协议的长连接传输协议 - motan-registry-consul
Consul服务发现组件 - motan-registry-zookeeper
Zookeeper服务发现组件 - motan-springsupport
Spring标签解析相关功能
处理调用异常
业务代码异常
当调用的远程服务出现异常时,Motan会把Server业务中的异常对象抛出到Client代码中,与本地调用逻辑一致。注意:如果业务代码中抛出的异常类型为Error而非Exception(如OutOfMemoryError),Motan框架不会直接抛出Error,而是抛出包装了Error的MotanServiceException异常。
MotanServiceException
使用Motan框架将一个本地调用改为RPC调用后,如果出现网络问题或服务端集群异常等情况,Motan会在Client调用远程服务时抛出MotanServiceException异常,业务方需要自行决定后续处理逻辑。MotanFrameworkException
框架异常,比如系统启动、关闭、服务暴露、服务注册等非请求情况下出现问题,Motan会抛出此类异常。
协议与连接(motan:protocol)
介绍
Protocol用来配置Motan服务的协议。不同的服务适用不同的协议进行传输,可以自行扩展协议。
motan协议
Motan默认的rpc协议为motan协议,使用tcp长连接模式,基于netty通信。
负载均衡
Motan 在集群负载均衡时,提供了多种方案,缺省为 ActiveWeight,并支持自定义扩展。 负载均衡策略在Client端生效,因此需在Client端添加配置
目前支持的负载均衡策略有:
ActiveWeight(缺省)
低并发度优先: referer 的某时刻的 call 数越小优先级越高
由于 Referer List 可能很多,比如上百台,如果每次都要从这上百个 Referer 或者最低并发的几个,性能有些损耗,因此 random.nextInt(list.size()) 获取一个起始的 index,然后获取最多不超过 MAX_REFERER_COUNT 的状态是 isAvailable 的 referer 进行判断 activeCount.Random
随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。RoundRobin
轮循,按公约后的权重设置轮循比率
LocalFirst
本地服务优先获取策略,对referers根据ip顺序查找本地服务,多存在多个本地服务,获取Active最小的本地服务进行服务。
当不存在本地服务,但是存在远程RPC服务,则根据ActivWeight获取远程RPC服务
当两者都存在,所有本地服务都应优先于远程服务,本地RPC服务与远程RPC服务内部则根据ActiveWeight进行Consistent
一致性 Hash,相同参数的请求总是发到同一提供者
ConfigurableWeight
权重可配置的负载均衡策略
容错策略
Motan 在集群调用失败时,提供了两种容错方案,并支持自定义扩展。 高可用集群容错策略在Client端生效,因此需在Client端添加配置 目前支持的集群容错策略有:
Failover 失效切换(缺省)
失败自动切换,当出现失败,重试其它服务器。
Failfast 快速失败
快速失败,只发起一次调用,失败立即报错。
连接控制
限制服务端连接池工作线程数
限制客户端对每个服务建立的连接数
本地调用
Injvm 协议是一个伪协议,它不开启端口,不发起远程调用,只在 JVM 内直接关联,但执行 Motan 的 Filter 链。
最新文章
- 20155324王鸣宇对C语言课程回顾及对Java的展望
- SQL出错
- android 使用多个接口
- 即学即会 Java 程序设计基础视频教程(100课整)无水印版
- C#学习笔记(二)——变量和表达式
- 使用Eclipse构建Maven的SpringMVC项目
- C#WPF做FTP上传下载获取文件列表
- spoj BRCKTS - Brackets 线段树
- runat=";server"; 是什么意思?
- Python -- Web -- WSGI
- java集合框架list和set
- C#中如何给PDF添加可见的数字签名
- 框架应用:Spring framework (二) - AOP技术
- 使用+Leapms查看线性规划的单纯形表,itsme命令
- WAMP中mysql服务突然无法启动 解决方法
- Hadoop学习笔记(三):java操作Hadoop
- ImportError: No module named google.protobuf.internal
- Linux+Jenkins环境搭建
- 《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读
- c#所有部门及其下所部门生成树形图(递归算法获取或键值对方式获取)