从14年开始就陆续看到新浪微博RPC框架Motan的介绍,时隔两年后,微博团队终于宣布开源轻量级RPC框架Motan,项目地址:

https://github.com/weibocom/motan/

项目文档介绍比较详细,搭建开发环境非常简单,如果只是使用而不需要源码的话,只配置maven依赖项目即可,按照示例几分钟就可以搭建起一个Hello world。当然这也是官方介绍中的优点之一。

我们来扩展一下官方的示例,并测试一下集群式部署。首先创建一个maven项目

1 公共部分

pom.xml

	<dependencies>
<dependency>
<groupId>com.weibo</groupId>
<artifactId>motan-core</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.weibo</groupId>
<artifactId>motan-transport-netty</artifactId>
<version>0.0.1</version>
</dependency>
<!-- only needed for spring-based features -->
<dependency>
<groupId>com.weibo</groupId>
<artifactId>motan-springsupport</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>com.weibo</groupId>
<artifactId>motan-registry-zookeeper</artifactId>
<version>0.0.1</version>
</dependency>
</dependencies>

项目结构如图

User类,注意必须实现Serializable

public class User implements Serializable {

	private static final long serialVersionUID = 2925168737226033271L;

	public User(int id, String name) {
this.id = id;
this.name = name;
} private int id;
private String name; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return String.format("{id=%d,name=%s}", this.id, this.name);
}
}

UserService

public interface UserService {
public User find(int id);
}

2 服务器部分

UserServiceImpl

public class UserServiceImpl implements UserService {
public User find(int id) {
System.out.println(id + " invoked rpc service");
return new User(id, "name" + id);
}
}

motan_server.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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"> <motan:protocol name="motan" loadbalance="roundrobin" maxWorkerThread="500" minWorkerThread="20" />
<bean id="serviceImpl" class="quickstart.UserServiceImpl" />
<motan:registry regProtocol="zookeeper" name="my_zookeeper" address="127.0.0.1:2181"/>
<motan:service interface="quickstart.UserService" ref="serviceImpl" registry="my_zookeeper" export="8002" />
</beans>

Server.java

public class Server {
public static void main(String[] args) throws InterruptedException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"classpath:motan_server.xml");
System.out.println("server start...");
}
}

集群部署需要使用Zookeeper做注册中心

3 部署Zookeeper

以windows环境为例

下载地址 http://zookeeper.apache.org/

下载后得到gz包如zookeeper-3.4.8.tar.gz,解压到任意目录如d:\zookeeper-3.4.8

在zookeeper-3.4.8目录下建立data文件夹

进入zookeeper-3.4.8/conf目录,把zoo_sample.cfg重命名为zoo.cfg,并修改dataDir选项

dataDir=d:\\zookeeper-3.4.8\\data

进入zookeeper-3.4.8/bin目录,执行zkServer.cmd

运行Server.java测试,启动成功

4 部署多服务器实例

下面把服务器端部署两个实例,修改pom.xml,添加

<build>
<finalName>motan-examples</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>.</classpathPrefix>
<mainClass>quickstart.Server</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>

注意正确配置mainClass的类全路径

进入项目目录执行

mvn dependency:copy-dependencies

mvn clean package

把生成的可执行jar和依赖jar包复制到一起,并执行

java -jar motan-examples.jar

修改motan_server.xml中的export端口为8003,重复上面步骤再启动一个在8003端口上的实例

5 客户端部分

motan_client.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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"> <motan:protocol name="motan" haStrategy="failover" />
<motan:registry regProtocol="zookeeper" name="my_zookeeper" address="127.0.0.1:2181"/>
<motan:referer id="remoteService" interface="quickstart.UserService" registry="my_zookeeper"/>
</beans>

Client.java

public class Client {

	public static void main(String[] args) throws InterruptedException {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"classpath:motan_client.xml");
final UserService service = (UserService) ctx.getBean("remoteService"); final int SIZE = 100;
final AtomicInteger atom = new AtomicInteger();
ExecutorService exec = Executors.newFixedThreadPool(SIZE);
for(int i = 0; i < SIZE; i++) {
exec.execute(new Thread(){
public void run() {
User user = service.find(atom.addAndGet(1));
System.out.println(user);
}
});
}
}
}

运行Client.java

从输出结果可以看出,客户端请求被分配到两个服务器实例中。

关闭其中一个服务器实例,重新运行客户端

因为Zookeeper处理服务器断开的消息有一定延时,一部分请求仍然被提交到已关闭的端口上,导致抛出异常。但是这里并没有按配置执行失败切换服务器的策略,是配置问题还是不支持网络拒绝连接的失败类型,限于时间关系,没有做更多测试,暂时打个问号。

6 总结

同是RPC框架,就不可避免的要和另一个优秀开源框架dubbo/dubbox比较

缺点:

1 功能较少,不支持跨语言调用

2 年轻,稳定性和可能出现的问题尚待检验

优点:

1 轻量级,开发和学习简单

2 年轻,有无限的发展可能性。dubbo因为原创团队的原因已经停止更新,motan能否后来居上,让我们拭目以待。

Dobbo的继任者?试用微博RPC框架Motan的更多相关文章

  1. 微博RPC框架motan入门笔记

    Motan 是一套高性能.易于使用的分布式远程服务调用(RPC)框架. 功能 支持通过spring配置方式集成,无需额外编写代码即可为服务提供分布式调用能力. 支持集成consul.zookeeper ...

  2. 微博开源框架Motan初体验

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

  3. 微博轻量级RPC框架Motan正式开源:支撑千亿调用

    支撑微博千亿调用的轻量级 RPC 框架 Motan 正式开源了,项目地址为https://github.com/weibocom/motan. 微博轻量级RPC框架Motan正式开源 Motan 是微 ...

  4. 微博轻量级RPC框架Motan

    Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用. ...

  5. RPC框架motan: 通信框架netty( 1)

    服务器端编程都离不开底层的通信框架,在我们刚学习java的时候,主要接触都是Socket和ServerSocket 的阻塞编程,后来开始了解NIO,这种非阻塞的编程模式,它可以一个线程管理很多的Soc ...

  6. 轻量级RPC框架-motan

    https://github.com/weibocom/motan/wiki/zh_quickstart#%E7%AE%80%E5%8D%95%E8%B0%83%E7%94%A8%E7%A4%BA%E ...

  7. RPC框架motan: 通信框架netty之Netty4Client

    上文已经初步探讨了如何实现一个具体的transport,本文就来讨论一个具体的transport,本文讨论netty4的的相关实现.老规矩,看看motan-transport的目录结构. 其中最重要的 ...

  8. [转]新兵训练营系列课程——平台RPC框架介绍

    原文:http://weibo.com/p/1001643875439147097368 课程大纲 1.RPC简介 1.1 什么是RPC 1.2 RPC与其他远程调用方式比较 2.Motan RPC框 ...

  9. 分布式RPC框架性能大比拼 dubbo、motan、rpcx、gRPC、thrift的性能比较

    Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.不过,略有遗憾的是,据说在淘宝内部,dub ...

随机推荐

  1. Ingress qdisc

    Ingress qdisc All qdiscs discussed so far are egress qdiscs. Each interface however can also have an ...

  2. 去掉EditPlus自动备份bak文件

    用EditPlus编辑文件是总是自动生成一个.bak文件. 其实想去掉EditPlus的自动备份也简单,方法如下: 打开菜单栏上的:工具->参数设置->文件 去掉“保存时创建备份文件”前的 ...

  3. 【Flask】Flask快速玩框架

    最近比较忙 快速玩Flask框架,为微博做些准备 part 1 python程序 from flask importFlask, render_template, session, redirect, ...

  4. linux网络虚拟化

    图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN http://smilejay.com/2012/08/qemu-kvm-networking-m ...

  5. mac10.9+php5.5.15+brew0.9.5的安装

      Brew 是 Mac 下面的包管理工具,通过 Github 托管适合 Mac 的编译配置以及 Patch,可以方便的安装开发工具. Mac 自带ruby 所以安装起来很方便,同时它也会自动把git ...

  6. urllib2.open(req).read() 报403的错误:怎么办?

    http://www.douban.com/group/topic/18095751/ heads = {'Accept':'text/html,application/xhtml+xml,appli ...

  7. HTML5播放器

    seweise palyer http://www.whatled.com/m/?post=1626 https://github.com/sewise/sewise-player2 七牛云音视频支持 ...

  8. Spring JSR-250注解

    Java EE5中引入了“Java平台的公共注解(Common Annotations for the Java Platform)”,而且该公共注解从Java SE 6一开始就被包含其中. 2006 ...

  9. 【uTenux实验】消息缓冲区

    uTenux的消息缓冲区是一个通过传递大小可变的消息来实现同步和通信的对象. 消息缓冲区由三部分组成:1.待发消息队列  2.等接收消息的任务队列  3.用来保存缓冲消息的空间. 和信号相比,消息队列 ...

  10. SQL Server 2008 数据库镜像部署实例之三 配置见证服务器

    SQL Server 2008 数据库镜像部署实例之三 配置见证服务器 前面已经完成了镜像数据库的配置,并进行那个了故障转移测试.接下来将部署见证服务器,实现自动故障转移. 一.关于见证服务器 1.若 ...