专栏首页服务端技术杂谈Motan源码阅读--初识Motan

Motan源码阅读--初识Motan

Motan

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

功能

  • 支持通过spring配置方式集成,无需额外编写代码即可以为服务提供分布式调用能力。
  • 支持集成consul,zk等配置服务组件,提供集群环境服务发现及治理能力。
  • 支持动态自定义负载均衡,跨机房流量调整等高级服务调度能力。
  • 基于高并发,高负载场景进行优化,保障生产环境下RPC服务高可用。

模块

Motan框架中主要有register,transport,serialize,protocol几个功能,各个模块都支持通过SPI进行扩展。

registry

用来和注册中心交互,包括服务注册,服务订阅,服务变更通知,服务心跳发送等。server端会在系统初始化时通过registry模块注册服务,client端在系统初始化时通过registry模块订阅到服务提供者列表,当server列表变更时由registry模块通知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扩展来6个自定义的Spring xml标签:

  • motan:protocol
  • motan:registry
  • Motan:basicservice
  • motan:service
  • motan:basicreferer
  • motan:referer

本文分享自微信公众号 - 服务端技术杂谈(develop_king),作者:春哥大魔王

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • node.js实现BigPipe详解

    BigPipe 是 Facebook 开发的优化网页加载速度的技术。网上几乎没有用 node.js 实现的文章,实际上,不止于 node.js,BigPipe ...

    春哥大魔王
  • 从单例模式说起

    单例模式是我们比较常用的设计模式,玩好单例模式也会涉及到很多java基础知识。 单例作为全局性实例,在多线程情况下全局共享的变量会变得非常危险。

    春哥大魔王
  • Motan源码阅读--调用示例

    异步调用和同步调用基本配置一样,只需要在接口类中加@MotanAsync注解,然后Client端稍作修改,server端不需要做任何修改。

    春哥大魔王
  • [LeetCode] 442. Find All Duplicates in an Array

    【原题】 Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elemen...

    用户1148830
  • 27. Vue 使用 vue-resource 发起get请求,获取列表数据

    上一节讲诉了Vue 使用 vue-resource 发起get、post、jsonp请求,那么本章节则使用发起get请求后,获取数据渲染到列表中。

    Devops海洋的渔夫
  • 入门指南:Node/JavaScript中的模板引擎

    在本文中,我们将介绍如何用Node.js和Express来使用 Handlebars 模板引擎。还会介绍什么是模板引擎,以及如何使用把 Handlebars 建...

    前端小智@大迁世界
  • MetInfo米拓6.2模板开发改造和商城模块插件v4升级优化修改PHP+Mysql

    米拓商城经过4个版本的升级,现已支持在线商城的主要功能,代码开源,支付接口丰富,响应式布局(支持电脑、手机、平板)本次升级主要新增了如下功能:

    用户5043035
  • Tensorflow中的降维函数tf.reduce_*使用总结

    在使用tensorflow时常常会使用到tf.reduce_*这类的函数,在此对一些常见的函数进行汇总

    砸漏
  • 一行代码搞定SwipeRefreshLayout拦截事件

    SwipeRefreshLayout这个控件大家可能几百年前就已经在熟练使用了,相关的博客也多不胜数,方法也许不同,但实质都是一样的,写这个的目的也只是为了先把...

    企鹅号小编
  • Spring Boot 整合微信小程序实现登录与增删改查

    项目描述:在微信小程序中通过与Springboot操作数据库实现简单的增删改查,其中我是用springboot整合mybatis-plus 和mysql使用的

    Java编程指南

扫码关注云+社区

领取腾讯云代金券