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

article/2025/9/11 5:31:26

一, 框架介绍

1.1 概况 

motan是新浪微博开源出来的一套高性能、易于使用的分布式远程服务调用(RPC)框架。

1.2 功能

可以spring的配置方式与项目集成.

支持zookeeper服务发现组件, 实现集群环境下服务注册与发现.

保证高并发, 高负载场景下的稳定高性能, , 实现生产环境下的RPC服务的高可用性.

二, Hello World

本次hello world级别的演示, 采用motan源码中自带的demo示例来搭建演示项目.

1.1 server端使用示例

   使用zk作为配置注册中心

<!-- 注册中心配置 使用不同注册中心需要依赖对应的jar包。如果不使用注册中心,可以把check属性改为false,忽略注册失败。-->
<motan:registry regProtocol="zookeeper" name="registry" address="127.0.0.1:2181"/>

   配置motan rpc通信协议

<!-- 协议配置。为防止多个业务配置冲突,推荐使用id表示具体协议。-->
<motan:protocol id="demoMotan" default="true" name="motan"requestTimeout="220" maxServerConnection="80000" maxContentLength="1048576"maxWorkerThread="800" minWorkerThread="20"/>

  配置basicService, 该项配置指的是, 假如服务提供者有多个服务需要对外暴露, 一些公共服务属性配置项就可以在这里配置, 而每个服务需要特殊处理的服务属性, 则可以放在motan:service下进行配置, 自动就会覆盖掉此处的相同配置.

 <!-- 通用配置,多个rpc服务使用相同的基础配置. group和module定义具体的服务池。export格式为“protocol id:提供服务的端口”--><!-- 即是rpc服务的公共配置, 各个服务的特殊化配置, 则具体放在该服务配置中即可, 比如这里的export=""和requestTimeout="" 属性配置 --><!-- 一些公有的配置, 每个服务对应的分组group, 注册中心registry, 所属模块module等, 比如这里的配置:  --><!-- group="" accessLog="" shareChannel="" module="" application="" registry="" 则说明使用到basicService的每个服务, 它们的这几项属性值是一样的-->
<motan:basicService requestTimeout="220" export="demoMotan:8002"group="motan-demo-rpc1" accessLog="false" shareChannel="true" module="motan-demo-rpc"application="myMotanDemo" registry="registry" id="serviceBasicConfig"/>

  配置需要暴露的服务, 这里配置两个端口8001和8002进行服务暴露, 说明该服务会在本服务器的8001和8002端口同时对外提供服务.

<!-- 具体rpc服务配置,声明实现的接口类。需要根据业务情况设置合适的超时时间 --><motan:service interface="com.weibo.motan.demo.service.MotanDemoService"ref="motanDemoServiceImpl" export="demoMotan:8001" basicService="serviceBasicConfig"requestTimeout="200"></motan:service>
<motan:service interface="com.weibo.motan.demo.service.MotanDemoService"ref="motanDemoServiceImpl" export="demoMotan:8002" basicService="serviceBasicConfig"requestTimeout="200"></motan:service>

使用main方法的方式加载spring容器

 public static void main(String[] args) throws InterruptedException {ApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"classpath*:motan_demo_server.xml"});MotanSwitcherUtil.setSwitcher(ConsulConstants.NAMING_PROCESS_HEARTBEAT_SWITCHER, true);System.out.println("server start...");Thread.sleep(Long.MAX_VALUE);}

类似于dubbo提供的dubbo-admin管控台一样, motan为了方便查看以及治理每个服务, 也提供了一个管控台叫motan-manager, 下面我们就来搭建并且启动该motan-manager管控台.

1.2 motan-manager管控台

在该项目目录结构中, 有一个config.properties的配置文件, 修改其配置文件中的zk地址, 为自己对应的zk地址即可.

zookeeper_url=127.0.0.1:2181

启动motan-manager后, 使用group分组名称可以查询到该分组下所有暴露服务的ip:port, 如下图:

 

通过motan-manager, 我们就能很直观的看见某一个分组下暴露的所有服务.

1.3 服务调用者client端

  配置zk注册中心

<motan:registry regProtocol="zookeeper" name="registry" address="127.0.0.1:2181" requestTimeout="200"/>

  配置motan rpc通信协议

<!-- motan协议配置 -->
<motan:protocol default="true" name="motan" haStrategy="failover"loadbalance="roundrobin" maxClientConnection="10" minClientConnection="2"/>

  配置basicReferer, 与basicService的作用是相同的道理, 将多个服务调用方相同的配置, 均可放在这里进行统一配置, 特殊处理的地方将交给motan:referer就可以了

<!-- 通用referer基础配置 -->
<motan:basicReferer requestTimeout="200" accessLog="false"retries="2" group="motan-demo-rpc" module="motan-demo-rpc"application="myMotanDemo" protocol="motan" registry="registry"id="motantestClientBasicConfig" throwException="false" check="true" />

配置具体的服务调用者

<motan:referer id="motanDemoReferer"interface="com.weibo.motan.demo.service.MotanDemoService"connectTimeout="300" requestTimeout="300" basicReferer="motantestClientBasicConfig"/>

client端使用main()方法的方式, 加载spring容器, 使用beanId通过getBean()方法获取到远程服务的一个代理对象, 使用该对象即可完成rpc远程调用.

public static void main(String[] args) throws InterruptedException {ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] { "classpath:motan_demo_client.xml" });MotanDemoService service = (MotanDemoService) ctx.getBean("motanDemoReferer");for(int i = 0; i < Integer.MAX_VALUE; i++){System.out.println(service.hello("motan" + i));Thread.sleep(500);}System.out.println("motan demo is finish.");System.exit(0);}

最终将得到这样的执行结果, 这样就使用motan完成了一次远程rpc调用, 执行结果如下:

在motan-manager-admin管控台查看client服务调用者:

 

好了, 以上就是使用motan+zk的方式, 完成一次rpc的通信过程, 接下来会通过源码解析, 查看进行这样一次的rpc调用, motan究竟干了些什么, 又是怎样实现这一过程的.

所以下一篇将会首先介绍motan对spring自定义标签的开发, 以及motan是怎么解析xml配置文件中的内容, 进行服务暴露的.

spring自定义标签的开发, 可以查看以前我针对spring自定义标签写过的一篇博客:

https://blog.csdn.net/xiongxianze/article/details/80544665

 

 


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

相关文章

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…

jPlayer插件的使用

jPlayer插件的使用 2017年04月21日 11:03:19 JENIFURS 阅读数&#xff1a;3952 标签&#xff1a; jPlayer视频插件兼容bug 更多 个人分类&#xff1a; jQuery 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/fuyujiaof/arti…

JPlayer播放器插件教程,JPlayer项目实战

JPlayer 播放器&#xff1a;基于HTML5/Flash的音频、视频播放器。项目预览&#xff1a;播放器插件预览jPlayer中文官方文档&#xff1a;官网功能强大&#xff0c;操作简便&#xff0c;支持换肤功能。引入JPlayer文件以及样式&#xff1a;<head><script type"text…

TensorFlow 2019

numpy pandas sklearn 算法 神经网络的Math 动手实现网络结构 应用 TensorFlow框架 图像案例 Machine Learning VS Deep Learning 1 特征提取方面 自动 2 数量集 量大/参数大 * 机器学习 &#xff1a; 朴素贝叶斯 决策树 深度学习 &#xff1a; 统称神经网络 3 应…

机器学习练习 8 -异常检测和推荐系统(协同过滤)

1 Anomaly detection&#xff08;异常检测&#xff09; 我们的第一个任务是使用高斯模型来检测数据集中未标记的示例是否应被视为异常。 我们先从简单的二维数据集开始。 之前我们构建的异常检测系统也使用了带标记的数据&#xff0c;与监督学习有些相似&#xff0c;下面的对…

从普通程序员到AI大神,月薪7W的正确打开方式...

“ 前不久&#xff0c;不少人被一段机器人后空翻的视频刷屏了。视频中&#xff0c;双足人形机器人阿特拉斯又是走“梅花桩”&#xff0c;又是秀后空翻&#xff0c;完成了一段精彩绝伦的体操表演。 超强机器人出现&#xff01;分分钟被 AI 惊呆… 要知道阿特拉斯在 2014 年的时候…

Surface Defect Detection Methods for Industrial Products : A Review

Surface Defect Detection Methods for Industrial Products : A Review &#xff08;工业产品表面缺陷检测方法综述 &#xff09; 文章来源&#xff1a;Appl. Sci.2021,11, 7657. https://doi.org/10.3390/app11167657 &#xff08;Yuanyuan Ding&#xff09; 论文亮点&#x…

task_5 - 副本

Task01–Task06树模型与集成学习笔记整理 ****************************************************************************************************************** 1 Task01 信息论基础 决策树分类思想&#xff1a; 用树的节点代表样本集合&#xff0c;通过某些判定条件…