Dobbo的继任者?试用微博RPC框架Motan

从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>
项目结构如图

Dobbo的继任者?试用微博RPC框架Motan_第1张图片

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测试,启动成功

Dobbo的继任者?试用微博RPC框架Motan_第2张图片

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

Dobbo的继任者?试用微博RPC框架Motan_第3张图片

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

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

Dobbo的继任者?试用微博RPC框架Motan_第4张图片

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

6 总结

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

缺点:

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

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

优点:

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

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

你可能感兴趣的:(java,rpc,motan)