搭建新浪RPC框架motan Demo

article/2025/9/11 4:28:04

motan是新浪微博开源的RPC框架,github官网是:https://github.com/weibocom/motan


今天就先搭建一个Hello world demo,本demo基于motan 0.2.1版本


首先先去github下载源代码(motan-manager报错请忽略,eclipse的web Module不兼容):

选中motan下的pom.xml,进行编译打包:

下载源码编译打包的目的有三个:

1)下载源代码可以方便源代码阅读学习

2)下载到motan.xsd,因为motan与spring进行了继承,有了自己的schema,eclipse会不识别,会导致xml报错,跟dubbo的配置文件报错一个道理

3)打包获取到motan-manager的页面管理端的war包



3)在motan-manager的target文件下找到打好的war包:


单独找一个tomcat,将其放入webapp文件下

然后进入bin文件下,启动tomcat

打开浏览器http://localhost:8080/motan-manager-0.2.2-SNAPSHOT:




到此为止motan的管理平台就搭建好了,下面就搭建基于zookeeper为注册中心的RPC demo

1)首先先启动一个简单的zookeeper实例,在windows下简单的启动一个,写个demo,不需要集群



打开eclipse,搭建两个简单的maven项目:

motan-provider为服务提供端,motan-client服务调用端。两个项目的依赖基本上一样的:

        <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><motan.version>0.2.1</motan.version></properties><dependencies><dependency><groupId>com.weibo</groupId><artifactId>motan-core</artifactId><version>${motan.version}</version></dependency><dependency><groupId>com.weibo</groupId><artifactId>motan-transport-netty</artifactId><version>${motan.version}</version></dependency><dependency><groupId>com.weibo</groupId><artifactId>motan-registry-zookeeper</artifactId><version>${motan.version}</version></dependency><dependency><groupId>com.weibo</groupId><artifactId>motan-springsupport</artifactId><version>${motan.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.4.RELEASE</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.5.8</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.5.8</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency></dependencies>

服务提供端motan-provider的编写

1)我们写一个简单的接口HelloService:

package com.bazinga.study.motan.rpc.service;public interface HelloService {public String hello(String str);}
HelloSerivce简单的实现类HelloServiceImpl:

package com.bazinga.study.motan.rpc.service;public class HelloServiceImpl implements HelloService {public String hello(String str) {return "hello " + str;}}

然后在src/main/resources下配置spring-motan-provider.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.xsdhttp://api.weibo.com/schema/motan http://api.weibo.com/schema/motan.xsd"><!-- spring管理的服务具体实现 --><bean id="serviceImpl" class="com.bazinga.study.motan.rpc.service.HelloServiceImpl" /><!-- 注册中心的配置 --><motan:registry regProtocol="zookeeper" name="zkRegistry" address="127.0.0.1:2181" connectTimeout="2000"/><!-- 协议配置。为防止多个业务配置冲突,推荐使用id表示具体协议。--><motan:protocol id="demoMotan" default="true" name="motan" maxServerConnection="80000" maxContentLength="1048576"maxWorkerThread="800" minWorkerThread="20"/><!-- 服务的默认配置 group:标识服务的分组 module:标识模块信息 registry:标识service使用的注册中心,与motan:registry中的name对应  -->           <motan:basicService export="demoMotan:8002"group="lyncc-motan-demo-rpc" accessLog="true" shareChannel="true" module="motan-demo-rpc"application="myMotanDemo" registry="zkRegistry" id="serviceBasicConfig"/><!-- 要暴露的服务,唯一标识是integerface --><motan:service interface="com.bazinga.study.motan.rpc.service.HelloService" ref="serviceImpl" export="demoMotan:8001" basicService="serviceBasicConfig" /></beans>

注意此时你的IDE可能会报错,不识别<motan:registry>这些标签,解决方案:

Window-->Preferences--->XML:



选中我们刚才冲源码包中获取到的motan.xsd,然后key type选择Schema location 最最关键的就是key值了:http://api.weibo.com/schema/motan.xsd


这个值要与你命名空间中的值一样:


重新打开spring-motan-provider.xml文件就不报错了~


好了,我们继续,编写provider的启动类ProviderStarter:

package com.bazinga.study.motan.rpc.quickstart;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.weibo.api.motan.common.MotanConstants;
import com.weibo.api.motan.util.MotanSwitcherUtil;public class ProviderStarter {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-motan-provider.xml");MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true);System.out.println("server start...");}}
启动该类:

此时再打开motan-manager的管理页面:


可以查询到我们刚才注册好的服务,并且可以看到Server的服务者的个数是1个,我们开始编写motan-client的编写:

1)先把motan-provider端的HelloSerivce接口复制到motan-client,package的目录也要一样,因为接口的绝对路径被认为服务的唯一标识


2)在motan-client的src/main/resources文件夹下新建文件spring-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.xsdhttp://api.weibo.com/schema/motan http://api.weibo.com/schema/motan.xsd"><motan:registry regProtocol="zookeeper" name="registry" address="127.0.0.1:2181"/><!-- motan协议配置 --><motan:protocol default="true" name="motan" haStrategy="failover"loadbalance="roundrobin" maxClientConnection="10" minClientConnection="2"/><!-- 通用referer基础配置 --><motan:basicReferer requestTimeout="200" accessLog="true"retries="2" group="lyncc-motan-demo-rpc" module="motan-demo-rpc"application="myMotanDemo" protocol="motan" registry="registry"id="motantestClientBasicConfig" throwException="false" check="true"/><motan:referer id="remoteService" interface="com.bazinga.study.motan.rpc.service.HelloService" connectTimeout="300" requestTimeout="300" basicReferer="motantestClientBasicConfig"/></beans>

3)编写启动类:

package com.bazinga.study.motan.rpc.quickstart;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.bazinga.study.motan.rpc.service.HelloService;public class ClientStart {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring-motan-client.xml");HelloService service = (HelloService) ctx.getBean("remoteService");for(int i = 0;i< 50;i++){System.out.println(service.hello("motan " + i));}}}


4)log4j.properties

log4j.rootLogger=warn
log4j.logger.info=info,infofile
log4j.logger.warn=warn,warnfile
log4j.logger.error=error,errorfile
log4j.logger.profile=info,profilelog4j.logger.trace=trace,tracefile
log4j.logger.accessLog=debug,accessfile
log4j.logger.serviceStatsLog=info,serviceStatsLoglog4j.appender.tracefile=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.tracefile.file=./logs/client/trace.log
log4j.appender.tracefile.DatePattern='.'yyyyMMdd
log4j.appender.tracefile.layout=org.apache.log4j.PatternLayout
log4j.appender.tracefile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%nlog4j.appender.accessfile=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.accessfile.file=./logs/client/access.log
log4j.appender.accessfile.DatePattern='.'yyyyMMdd
log4j.appender.accessfile.layout=org.apache.log4j.PatternLayout
log4j.appender.accessfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%p %d{yy/MM/dd HH:mm:ss} %-50.50c(%L) - %m%nlog4j.appender.infofile=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.infofile.file=./logs/client/info.log
log4j.appender.infofile.DatePattern='.'yyyyMMdd-HH
log4j.appender.infofile.layout=org.apache.log4j.PatternLayout
log4j.appender.infofile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%nlog4j.appender.warnfile=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.warnfile.file=./logs/client/warn.log
log4j.appender.warnfile.DatePattern='.'yyyyMMdd
log4j.appender.warnfile.layout=org.apache.log4j.PatternLayout
log4j.appender.warnfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%nlog4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.errorfile.file=./logs/client/error.log
log4j.appender.errorfile.DatePattern='.'yyyyMMdd
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%n#profile
log4j.appender.profile=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.profile.file=./logs/client/profile.log
log4j.appender.profile.DatePattern='.'yyyyMMdd-HH
log4j.appender.profile.layout=org.apache.log4j.PatternLayout
log4j.appender.profile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %m%n#serviceStats
log4j.appender.serviceStatsLog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.serviceStatsLog.file=./logs/client/serverserviceStatsLog.log
log4j.appender.serviceStatsLog.DatePattern='.'yyyyMMdd
log4j.appender.serviceStatsLog.layout=org.apache.log4j.PatternLayout
log4j.appender.serviceStatsLog.layout.ConversionPattern=%-d{HH:mm:ss} %m%n

启动ClientStart.java



现在已经调通了,我们再看看motan-manager:


好了,到此为此,一个简单的motan demo已经搭建好了~


完整的项目截图:



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

相关文章

微博RPC框架Motan

原文来自&#xff1a;http://blog.csdn.net/autfish/article/details/51374798 从14年开始就陆续看到新浪微博RPC框架Motan的介绍&#xff0c;时隔两年后&#xff0c;微博团队终于宣布开源轻量级RPC框架Motan&#xff0c;项目地址&#xff1a; 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…

jPlayer使用详解

原文地址&#xff1a;http://blog.csdn.net/z295304557/article/details/17298889?_t_t_t0.39512087353182124 下载官网&#xff1a;http://www.jplayer.org/ 当前版本&#xff1a;2.3.0 功能&#xff1a;视频播放&#xff08;可全屏&#xff09;、音乐播放 全部原教程&#x…