Motan框架初体验

一、什么是Motan?java

Motan是一套基于java开发的RPC框架,除了常规的点对点调用外,motan还提供服务治理功能,包括服务节点的自动发现、摘除、高可用和负载均衡等。Motan具备良好的扩展性,主要模块都提供了多种不一样的实现,例如支持多种注册中心,支持多种rpc协议等。git

二、微博开源框架Motan介绍github

微博的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日志信息。spring

三、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框架采用模块化设计,使用时能够按需依赖。目前的模块有:

    1. motan-core
      Motan核心框架
    2. motan-transport-netty
      基于Netty协议的长链接传输协议
    3. motan-registry-consul
      Consul服务发现组件
    4. motan-registry-zookeeper
      Zookeeper服务发现组件
    5. 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 链。

相关文章
相关标签/搜索