java 微博 开源_微博开源框架Motan初体验

article/2025/9/11 4:31:32

前两天,我在开源中国的微信公众号看到新浪微博的轻量Rpc框架——Motan开源了。上网查了下,才得知这个Motan来头不小,支撑着新浪微博的千亿调用,曾经在2014年的春晚中有着千亿次的调用,对抗了春晚的最高峰值。

什么是Motan

2013 年微博 RPC 框架 Motan 在前辈大师们(福林、fishermen、小麦、王喆等)的精心设计和辛勤工作中诞生,向各位大师们致敬,也得到了微博各个技术团队的鼎力支持及不断完善,如今 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日志信息。

Motan 属于服务治理类型,是一个基于 Java 开发的高性能的轻量级 RPC 框架,Motan 提供了实用的服务治理功能和优秀的 RPC 协议扩展能力。

Motan 提供的主要功能包括:

服务发现 :服务发布、订阅、通知

高可用策略 :失败重试(Failover)、快速失败(Failfast)、异常隔离(Server 连续失败超过指定次数置为不可用,然后定期进行心跳探测)

负载均衡 :支持低并发优先、一致性 Hash、随机请求、轮询等

扩展性 :支持 SPI 扩展(service provider interface)

其他 :调用统计、访问日志等

Motan 可以支持不同的 RPC 协议、传输协议。Motan 能够无缝支持 Spring 配置方式使用 RPC 服务,通过简单、灵活的配置就可以提供或使用 RPC 服务。通过使用 Motan 框架,可以十分方便的进行服务拆分、分布式服务部署。

简单调用示例

参照github中wiki,可以快速的跑一跑motan,提前感受一下,由于Motan刚开源,很多东西还不完整,我个人在这中间也遇到很多坑,后面一一介绍。我按照wiki介绍,先创建maven项目motandemo,

添加pom依赖

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.hjc.demo

motandemo

0.0.1-SNAPSHOT

war

motandemo

spy

36

default

http://repo1.maven.org/maven2

false

junit

junit

3.8.1

test

com.weibo

motan-core

0.0.1

com.weibo

motan-transport-netty

0.0.1

com.weibo

motan-registry-consul

0.0.1

com.weibo

motan-registry-zookeeper

0.0.1

com.weibo

motan-springsupport

0.0.1

org.springframework

spring-context

4.0.5.RELEASE

motan

注意如果maven下载不下来可以去仓库直接搜,然后下载jar包,我在搭建的过程就遇到了jar包下载不下来的情况,可能是网络原因吧。

仓库地址:http://mvnrepository.com/

下载下来后使用maven进行本地安装,安装命令如下:

mvn install:install-file -Dfile= -DgroupId= -DartifactId= -Dversion= -Dpackaging=

确定pom.xml不报错之后再进行下面的步骤

为服务方和调用方创建接口

创建接口,服务方和调用方都使用这个接口FooService

FooService:

package com.hjc.motan.server;

import java.util.List;

import java.util.Map;

import com.hjc.motan.DemoBean;

public interface FooService {

public String hello(String name);

public int helloInt(int number1);

public double helloDouble(double number2);

public List helloList(List list);

public Map> helloMap(Map> map);

public DemoBean helloJavabean(DemoBean bean);

}

服务方来实现这个接口的逻辑

FooServiceImpl:

package com.hjc.motan.server;

import java.util.List;

import java.util.Map;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.hjc.motan.DemoBean;

public class FooServiceImpl implements FooService {

public static void main(String[] args) throws InterruptedException {

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(

"classpath:motan_server.xml");

System.out.println("server start...");

}

public String hello(String name) {

System.out.println("invoked rpc service " + name);

return "hello " + name;

}

public int helloInt(int number1) {

System.out.println("invoked rpc service " + number1);

return number1;

}

public double helloDouble(double number2) {

System.out.println("invoked rpc service " + number2);

return number2;

}

public List helloList(List list) {

System.out.print("invoked rpc service ");

for (String string : list) {

System.out.print(string + ",");

}

System.out.println();

return list;

}

public Map> helloMap(Map> map) {

System.out.print("invoked rpc service ");

for (String key : map.keySet()) {

System.out.print(key + ":[");

for (String list : map.get(key)) {

System.out.print(list + ",");

}

System.out.print("],");

}

System.out.println();

return map;

}

public DemoBean helloJavabean(DemoBean bean) {

System.out.print("invoked rpc service " + bean);

System.out.print("," + bean.getId());

System.out.print("," + bean.getName());

System.out.print("," + bean.getScore());

System.out.println();

return bean;

}

}

配置服务方暴露接口

在项目根目录(src/main/datasource)创建motan_server.xml,如下:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:motan="http://api.weibo.com/schema/motan"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://api.weibo.com/schema/motan http://api.weibo.com/schema/motan.xsd">

在这个过程中,我发现我的eclipse不能自动下载motan.xsd,这时候我只能手动配置,从motan-core的jar包中,找到这个schema文件,复制到任意位置,然后eclipse中,选择Window->Preferences->XML->XML Catalog->User Specified Entries,点击Add,输入Location和Key,按照如下图所示:

21a757f5534d2ea3597932aa70a428af.png

以上步骤完成之后,就可以启动Motan Rpc的服务方了,在FooServiceImpl中已经写好了main方法,右键run即可

配置调用方调用接口

在项目根目录(src/main/datasource)创建motan_server.xml,如下:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:motan="http://api.weibo.com/schema/motan"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://api.weibo.com/schema/motan http://api.weibo.com/schema/motan.xsd">

调用方调用

创建Client类调用服务方的接口并输出

Client:

package com.hjc.motan.client;

import java.util.Arrays;

import java.util.HashMap;

import java.util.List;

import java.util.ArrayList;

import java.util.Map;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.hjc.motan.DemoBean;

import com.hjc.motan.server.FooService;

public class Client {

public static void main(String[] args) throws InterruptedException {

ApplicationContext ctx = new ClassPathXmlApplicationContext(

"classpath:motan_client.xml");

// 获取到service

FooService service = (FooService) ctx.getBean("remoteService");

// rpc调用

/** String **/

String ret1 = service.hello("motan");

System.out.println(ret1);

/** int **/

int ret2 = service.helloInt(110);

System.out.println(ret2);

/** double **/

double ret3 = service.helloDouble(11.2);

System.out.println(ret3);

/** list **/

List list = new ArrayList();

list.add("hello");

list.add("motan");

List ret4 = service.helloList(list);

for (String string : ret4) {

System.out.print(string + ",");

}

System.out.println();

/** map **/

Map> map = new HashMap>();

map.put("key1", Arrays.asList(new String[] { "val1","val2" }));

map.put("key2", Arrays.asList(new String[] { "val1","val2","val3" }));

map.put("key3", Arrays.asList(new String[] { "val1","val2","val3","val4" }));

Map> ret5 = service.helloMap(map);

for (String key : ret5.keySet()) {

System.out.print(key + ":[");

for (String tmp : map.get(key)) {

System.out.print(tmp + ",");

}

System.out.print("],");

}

System.out.println();

/** javabean **/

DemoBean bean = new DemoBean();

bean.setId(1001l);

bean.setName("motan bean");

bean.setScore(99.998);

DemoBean ret6 = service.helloJavabean(bean);

System.out.print(ret6.getId());

System.out.print("," + ret6.getName());

System.out.print("," + ret6.getScore());

System.out.println();

}

}

启动Client的main方法开始调用

输出结果

通过以上demo创建了server端和client端,分别启动服务方和调用方之后,查看控制台输出如下:

服务方:

server start...

invoked rpc service motan

invoked rpc service 110

invoked rpc service 11.2

invoked rpc service hello,motan,

invoked rpc service key3:[val1,val2,val3,val4,],key2:[val1,val2,val3,],key1:[val1,val2,],

invoked rpc service com.hjc.motan.DemoBean@2cf3e1fd,1001,motan bean,99.998

调用方:

hello motan

110

11.2

hello,motan,

key3:[val1,val2,val3,val4,],key2:[val1,val2,val3,],key1:[val1,val2,],

1001,motan bean,99.998

集群调用示例

实现集群使用只需要在上面的基础做一点稍稍的改变就可以,motan的集群与阿里的dubbo的原理类似,通过注册方、服务方、调用方三方来实现,三者关系图如下:

413ec9c72730f4fbc25e7f3cacd844a7.png

Server 向 Registry 注册服务,并向注册中心发送心跳汇报状态。

Client 需要向注册中心订阅 RPC 服务,Client 根据 Registry 返回的服务列表,对具体的 Sever 进行 RPC 调用。

当 Server 发生变更时,Registry 会同步变更,Client 感知后会对本地的服务列表作相应调整。

目前按照wiki说明,motan支持Consul和Zookeeper两种外部服务发现组件

以下我们再上面实现的基础之上进行更改(两种组件分别有介绍)

添加pom依赖

在最上面,其实已经写出来了

com.weibo

motan-registry-consul

0.0.1

com.weibo

motan-registry-zookeeper

0.0.1

在server和client的配置文件中分别增加registry定义

consul

zookeeper单节点

zookeeper多节点集群

在motan client及server配置改为通过registry服务发现

consul client

consul server

zookeeper client

zookeeper server

调用方调用服务

consul需要显示调用心跳开关注册到consul(zookeeper不需要)

MotanSwitcherUtil.setSwitcher(ConsulConstants.NAMING_PROCESS_HEARTBEAT_SWITCHER, true)

总结

我也是正好最近项目空闲,刚好又看到这么一则新闻,于是就动手了解了下,当然,我所做的只是浅层次的使用,至于更深层次的内容(如,跟dubbo等其他rpc框架的对比,集群上下线对zookeeper的影响等)还没来得及去研究,不过既然它曾经支撑过千亿的调用,那一定是经过实际运营检验的,作为搞技术的,也应该多去了解了解开源的东西,这里我想说一句,开源真好!

另外,以上demo代码我也传到了我的github上,欢迎交流学习:

https://github.com/hjcenry/motan-demo

我的个人博客开通啦,每一篇文章都在简书跟个人博客同步,地址是:http://hjcenry.github.io


http://chatgpt.dhexx.cn/article/JOxIjSoa.shtml

相关文章

搭建新浪RPC框架motan Demo

motan是新浪微博开源的RPC框架,github官网是:https://github.com/weibocom/motan 今天就先搭建一个Hello world demo,本demo基于motan 0.2.1版本 首先先去github下载源代码(motan-manager报错请忽略,eclipse的web Mod…

微博RPC框架Motan

原文来自:http://blog.csdn.net/autfish/article/details/51374798 从14年开始就陆续看到新浪微博RPC框架Motan的介绍,时隔两年后,微博团队终于宣布开源轻量级RPC框架Motan,项目地址: https://github.com/weibocom/mot…

motan rpc 接口统一异常处理

1.hello word 一个Motan扩展 大概需要下面的三点&#xff1a; 实现SPI扩展点接口 package com.weibo.api.motan.filter; Spi public interface Filter {Response filter(Caller<?> caller, Request request); }业务代码实现Filter public class PlsProviderExceptionF…

motan用户开发指南

目录 基本介绍 架构概述 模块概述 配置概述 使用Motan 工程依赖 处理调用异常 配置说明 协议与连接&#xff08;motan:protocol) 介绍 Motan协议 本地调用 注册中心与服务发现(motan:registry) 介绍 使用Consul作为注册中心 使用Zookeeper作为注册中心 不使用…

从motan看RPC框架设计

kris的文章开始 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决 从零开发一款RPC框架&#xff0c;说难也难说简单也简单。难的是你的设计将如何面对实际中的复杂应用场景&#xff1b;简单的是其思想可以仅仅浓缩成一行方法调用。motan是今年(2016年)新浪微博…

motan与zookeeper框架

新浪科技讯 2016年5月10日&#xff0c;微博方面宣布&#xff0c;支撑微博千亿调用的轻量级 RPC 框架 Motan 正式开源了。微博技术团队希望未来能有更多优秀的开源人入驻&#xff0c;并进一步完善优化。 搭建新浪RPC框架motan Demo&#xff1a;http://blog.csdn.net/linuu/arti…

java rpc motan_RPC框架motan使用

简介 motan是新浪微博开源的一套轻量级、方便使用的RPC框架 Hello World 使用的过程分为Server端和Client端&#xff0c;Server提供RCP的服务接口&#xff0c;Client端发起调用获取结果。 maven的pom文件配置 0.2.1 com.weibo motan-core ${motan.version} com.weibo motan-tra…

轻量级Rpc框架设计--motan源码解析一:框架介绍及框架使用初体验

一, 框架介绍 1.1 概况 motan是新浪微博开源出来的一套高性能、易于使用的分布式远程服务调用(RPC)框架。 1.2 功能 可以spring的配置方式与项目集成. 支持zookeeper服务发现组件, 实现集群环境下服务注册与发现. 保证高并发, 高负载场景下的稳定高性能, , 实现生产环境…

Motan原理、使用、JavaAPI简化、为什么使用Motan

前言&#xff0c;本文包括&#xff0c;rpc解释与为什么使用rpc、rpc性能对比、Motan依赖问题、Motan源码梳理、Motan功能、特点、使用。 主要中心&#xff1a;为什么使用Motan? 一、什么是RPC 官方解释&#xff1a;RPC&#xff08;Remote Procedure Call&#xff09;—远程…

jplayer自动播放

音乐网站的播放器一直都没有解决自动播放的问题&#xff0c;小哲说这样不行的&#xff0c;我也知道不可以这样&#xff0c;毕竟是自己提出要做的&#xff0c;所以要尽自己最大的能力去做好它&#xff01;本周末我一直都在围绕这个问题而研究。 我曾经想过在播放器初始化的时候…

JWPlayer

原文&#xff1a; http://www.cnblogs.com/yukui/archive/2009/03/12/1409469.html The JW MP3 Player (built with Adobes Flash) is the easiest way to add live music or podcasts to your website. It supports playback of a single MP3 file or an RSS, XSPF or ASX pla…

今天开始写些随笔,就从Jplayer开始吧

今天才开始用Jplayer&#xff0c;可能有点落伍了&#xff0c;但是看到网上千篇一律的使用说明&#xff0c;开始决定把自己的使用心得分享一下&#xff0c;废话不多说&#xff0c;开始吧。 Step1&#xff1a; 官网上有具体的搭建顺序&#xff0c;URL&#xff1a;http://www.jp…

关于播放器JPlayer的使用及遇到的问题

jPlayer是一个用于控制和播放mp3文件的jQuery插件。它在后台使用Flash来播放mp3文件&#xff0c;前台播放器外观完全可以使用XHML/CSS自定义。支持&#xff1a; 有一点比较好的是&#xff0c;在支持html5的浏览器上会使用html5的标签audio或者video&#xff0c;而不支持的浏览…

ijkplayer支持播放rtsp、jpeg、gif

ijkplayer版本&#xff1a;k.0.8.8 编译环境&#xff1a;Ubuntu 18.04.6 LTS 使用平台&#xff1a;android 支持rtsp播放 默认的ijkplayer并不支持rtsp流的播放&#xff0c;因为在编译ffmpeg的时候并没有开启rtsp的demuxer&#xff0c;所以在编译ffmpeg的时候需要开启rtsp的d…

【ijkplayer】介绍

【ijkplayer】介绍 0x1 系统架构 ijkplayer是由b站开源的播放器项目&#xff0c;底层基于ffmpeg, 支持Android和iOS。下面我们来简单介绍一下Android上的实现。 Android上的系统架构图如下。 下面分别对各个模块进行介绍&#xff1a; 0x11 ijkplayer-example app的实现&a…

一款简洁的 jplayer 音乐播放器完整版

一款简洁 jplayer 音乐播放器&#xff0c;做音乐站很漂亮&#xff0c;直接套用就好了。 效果图&#xff1a; 部分源代码&#xff1a; <div id"lei_jplayer"></div> <div id"jp_container_1"><div class"jp-controls">…

Ijkplayer Android介绍

Ijkplayer Android目录结构 Ijkplayer Android可以将该工程导入android studio进行编译&#xff0c;当它下载好需要的资源文件&#xff08;例如sdk build tool&#xff0c;gradle等&#xff09;就可以进行编译了&#xff0c;该工程的目录结构如下图所示: 链接库&#xff1a…

ijkplayer播放器

播放器系列 android播放器&#xff1a;MediaPlayer ExoPlayer ijkplayer_步基的博客-CSDN博客_mediacodec流程 一 概述 IJKPlayer是一款基于ffmpeg/ffplay的开源播放器&#xff0c;可支持rtmp/rtsp/hls等多种媒体协议&#xff0c;支持Android/IOS等移动平台。项目地址&#xff…

jplayer详解

下载官网&#xff1a;http://www.jplayer.org/ 当前版本&#xff1a;2.3.0 功能&#xff1a;视频播放&#xff08;可全屏&#xff09;、音乐播放 全部原教程&#xff0c;说明并不详细&#xff0c;要结合查看其网页源代码来学习&#xff1a;http://www.jplayer.org/latest/demos…

Javplayer 整合插件版下载使用

Javplayer - 马赛克去除工具 工作中去除图片模糊像素&#xff0c;还原高清图片Javplayer - 马赛克去除工具简介版本安装使用调整示例注意事项体验视频小结咨询 工作中去除图片模糊像素&#xff0c;还原高清图片 Javplayer - 马赛克去除工具简介 JavPlayer是一种视频播放器&am…