【RPC框架之Motan 介绍】

时间:2024-05-20 08:17:39

motan是新浪微博开源的一套轻量级、方便使用的RPC框架。motan是新浪开源的一个RPC框架,可以看做是Dubbo的量身裁剪版。

 

Motan is a remote procedure call(RPC) framework for rapid development of high performance distributed services.

 

Features

Create distributed services without writing extra code.

Provides cluster support and integrate with popular service discovery services like Consul or Zookeeper.

Supports advanced scheduling features like weighted load-balance, scheduling cross IDCs, etc.

Optimization for high load scenarios, provides high availability in production environment.

Supports both synchronous and asynchronous calls.

功能

支持通过spring配置方式集成,无需额外编写代码即可为服务提供分布式调用能力。

支持集成consul、zookeeper等配置服务组件,提供集群环境的服务发现及治理能力。

支持动态自定义负载均衡、跨机房流量调整等高级服务调度能力。

基于高并发、高负载场景进行优化,保障生产环境下RPC服务高可用。

 

 

Motan属于服务治理型框架。 

RPC框架目前可以划分为两类,

一类以Thrift,gRPC为代表的跨语言型,其特点是支持跨语言的RPC调用,通过加一层装换为中间语言,实现跨语言调用,

另一类是服务治理型。

 

相比于Dubbo,Motan在支持相同功能的同时,减少了部分扩展特性.在序列化方式上,Motan只支持Heesian和fastJson,注册中心Motan只支持zookeeper和Consul,底层通信组件只能使用netty,而dubbo还额外支持mina,grizzly,相应的协议,motan也只支持本地调用和motan定义的协议,相比之下dubbo还提供了对redis,thrift,memcache等组件的协议支持,可以使用这些组件完成服务的发布和引用。

 

motan和dubbo都使用SPI机制保证扩展,所有配置拼接为URL,构造接口代理隐藏远程调用细节,这一点类似基于JMS的远程调用,你需要提供调用接口,方法参数,参数类型,服务端反射接口实现执行返回结果。

 

接口和实现类的映射dubbo和motan都用一个map来保存。通过请求的接口名找到实现类反射执行方法。

 

motan的模块设计: 

评价一个模块设计的好坏是不同模块之前是否相互依赖,也即模块A中不要出现有类继承模块B的类,即使一定要扩展类,也应该先考虑包装模式,也即是装饰模式,让被扩展的类作为扩展类的一个属性。

 

motan提供两种配置方式。

1.注解

2.xml

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

架构概述

Motan中分为服务提供方(RPC Server),服务调用方(RPC Client)和服务注册中心(Registry)三个角色。

  • Server提供服务,向Registry注册自身服务,并向注册中心定期发送心跳汇报状态;
  • Client使用服务,需要向注册中心订阅RPC服务,Client根据Registry返回的服务列表,与具体的Sever建立连接,并进行RPC调用。
  • 当Server发生变更时,Registry会同步变更,Client感知后会对本地的服务列表作相应调整。

三者的交互关系如下图:

【RPC框架之Motan 介绍】

模块概述

Motan框架中主要有register、transport、serialize、protocol几个功能模块,各个功能模块都支持通过SPI进行扩展,各模块的交互如下图所示:

【RPC框架之Motan 介绍】

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