前言:上周使用motan是通过group远程调用超级土豆的服务,但是因为我需要写一些服务,不得不在本地启动服务,于是就详细的自己配置了一次motan。

上一篇博客也说到了,motan主要有3部分组成:registry,server和client。其中我们的registry用的是consul。下面就这3个部分一个一个的说明:

1、pom.xml 添加motan依赖:

一般来说,在公共模块的pom文件里添加依赖就可以了,比如在server、client、dao和common的SNA编程模型下,只要在common的pom文件中添加依赖即可

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

2、配置motan

Motan框架中将功能模块抽象为四个可配置的元素,分别为:

  • protocol:服务通信协议。服务提供方与消费方进行远程调用的协议,默认为Motan协议,使用hessian2进行序列化,netty作为Endpoint以及使用Motan自定义的协议编码方式。

  • registry:注册中心。服务提供方将服务信息(包含ip、端口、服务策略等信息)注册到注册中心,服务消费方通过注册中心发现服务。当服务发生变更,注册中心负责通知各个消费方。

  • service:服务提供方提供的服务。使用方将核心业务抽取出来,作为独立的服务。通过暴露服务并将服务注册至注册中心,从而使调用方调用。

  • referer:服务消费方对服务的引用,即服务调用方。

一般来说,在server端需要配置registry、protocol和service;在client端需要配置registry、protocol和referer。

Motan推荐使用spring配置rpc服务,目前Motan扩展了6个自定义Spring xml标签:

  • motan:protocol
  • motan:registry
  • motan:basicService
  • motan:service
  • motan:basicReferer
  • motan:referer

详细配置:

<motan:registry/>

  注册中心配置。用于配置注册中心的注册协议、地址端口、超时时间等。motan:registry包含以下常用属性:

    • name:标识配置名称
    • regProtocol:标识注册中心协议
    • address:标识注册中心地址

  Motan支持使用多种Registry模块,使用不同注册中心需要依赖对应jar包。

  以consul为注册中心举例:

<motan:registry  regProtocol="consul" 
          name="my_consul"
          address="${my.consul.address}"/>

  下表是registry的所有属性说明:

Property name Type Default Comment
name String   注册配置名称
regProtocol String   注册协议
address String   注册中心地址
port int 0 注册中心缺省端口
connectTimeout int 1000 注册中心连接超时时间(毫秒)
requestTimeout int 200 注册中心请求超时时间(毫秒)
registrySessionTimeout int 60s 注册中心会话超时时间(毫秒)
registryRetryPeriod int 30s 失败后重试的时间间隔
check boolean true 启动时检查失败后是否仍然启动
register boolean true 在该注册中心上服务是否暴露
subscribe boolean true 在该注册中心上服务是否引用
default boolean   是否缺省的配置

<motan:service/> 和 <motan:basicService/>

protocol、basic service、extConfig、service中定义相同属性时,优先级为service > extConfig > basic service > protocol

  <motan:service .../>

  motan:service包含以下常用属性:

    • interface:标识服务的接口类名
    • ref:标识服务的实现类,引用具体的spring业务实现对象
    • export:标识服务的暴露方式,格式为“protocolId:port”(使用的协议及对外提供的端口号),其中protocolId:应与motan:protocol中的id一致
    • group:标识服务的分组
    • module:标识模块信息
    • basicService:标识使用的基本配置,引用motan:basicService对象

  Motan在注册中心的服务是以group的形式保存的,一般推荐一个分组以机房+业务线进行命名,如yf-user-rpc。一个分组中包含若干的Service,一个Service即是java中的一个接口类名,每个Service下有一组能够提供对应服务的Server。

<motan:basicService .../>

  rpc服务的通用配置,用于配置所有服务接口的公共配置,减少配置冗余。basicService包含以下常用属性:

    • id:标识配置项
    • export:标识服务的暴露方式,格式为“protocolId:port”(使用的协议及对外提供的端口号),其中protocolId:应与motan:protocol中的id一致
    • group:标识服务的分组
    • module:标识模块信息
    • registry:标识service使用的注册中心,与motan:registry中的name对应

  motan:service可以通过以下方式引用基本配置。

<!-- 通用配置,多个rpc服务使用相同的基础配置. group和module定义具体的服务池。export格式为“protocol id:提供服务的端口” -->
<motan:basicService id="serviceBasicConfig" export="demoMotan:8002" group="motan-demo-rpc" module="motan-demo-rpc" registry="registry"/>
<!-- 通用配置,多个rpc服务使用相同的基础配置. group和module定义具体的服务池。export格式为“protocol id:提供服务的端口” -->
<motan:service interface="com.weibo.motan.demo.service.MotanDemoService" ref="demoServiceImpl" basicService="serviceBasicConfig"/>

motan:service中的basicService属性用来标识引用哪个motan:basicService对象,对于basicService中已定义的内容,service不必重复配置。

下表是service的所有属性说明:

Property name Type Default Comment
export String   服务暴露的方式,包含协议及端口号,多个协议端口用"," 分隔
basicService     基本service配置
interface Class   服务接口名
ref String   接口实现的类
class String   实现service的类名
host String   如果有多个ip,但只想暴露指定的某个ip,设置该参数
path String   服务路径
serialization String hessian2 序列化方式
extConfig String   扩展配置
proxy String   代理类型
group String default_rpc 服务分组
version String 1.0 版本
throwException String true 抛出异常
requestTimeout String 200 (目前未用)请求超时时间(毫秒)
connectTimeout String 1000 (目前未用)连接超时时间(毫秒)
retries int 0 (目前未用)重试次数
filter String   过滤器配置
listener String   监听器配置
connections int   连接数限制,0表示共享连接,否则为该服务独享连接数;默认共享
application String motan 应用信息
module String motan 模块信息
shareChannel boolean false 是否共享channel
timeout int   方法调用超时时间
actives int 0 最大请求数,0为不做并发限制
async boolean false 方法是否异步
mock String false 设为true,表示使用缺省Mock类名,即:接口名+Mock 后缀,服务接口调用失败Mock实现类
check boolean true 检查服务提供者是否存在
registry String   注册中心的id 列表,多个用“,”分隔,如果为空,则使用所有的配置中心
register boolean true 在该注册中心上服务是否暴露
subscribe boolean true 在该注册中心上服务是否引用
accessLog String false 设为true,将向logger 中输出访问日志
usegz boolean false 是否开启gzip压缩.只有compressMotan的codec才能支持
mingzSize int 1000 开启gzip压缩的阈值.usegz开关开启,且传输数据大于此阈值时,才会进行gzip压缩。只有compressMotan的codec才能支持
codec String motan 协议编码

<motan:referer/>和<motan:basicReferer/>

protocol、basic referer、extConfig、referer中定义相同属性时,优先级为referer > extConfig > basic referer > protocol

<motan:referer/>

调用方对象,motan:referer包含以下常用属性:

  • id:标识配置项
  • group:标识服务的分组
  • module:标识模块信息
  • protocol:标识referer使用的协议,与motan:protocol中的name对应,默认为Motan协议
  • registry:标识referer使用的注册中心,与motan:registry中的name对应
  • basicReferer:标识使用的基本配置,引用motan:basicReferer对象

Client端订阅Service后,会从Registry中得到能够提供对应Service的一组Server,Client把这一组Server看作一个提供服务的cluster。当cluster中的Server发生变更时,Client端的register模块会通知Client进行更新。

<motan:basicReferer/>

调用方基础配置。用于配置所有服务代理的公共属性。

  • id:标识配置项
  • group:标识服务的分组
  • module:标识模块信息
  • protocol:标识referer使用的协议,与motan:protocol中的name对应,默认为Motan协议
  • registry:标识referer使用的注册中心,与motan:registry中的name对应

motan:referer可以通过以下方式引用基本配置。

<!-- 通用referer基础配置 -->
<motan:basicReferer id="clientBasicConfig" group="motan-demo-rpc" module="motan-demo-rpc" registry="registry" protocol="motan"/> <!-- 具体referer配置。使用方通过beanid使用服务接口类 -->
<motan:referer id="demoReferer" interface="com.weibo.motan.demo.service.MotanDemoService" basicReferer="clientBasicConfig"/>

motan:referer中的basicService属性用来标识引用哪个motan:basicReferer对象,对于basicReferer中已定义的内容,service不必重复配置。

下表是referer的所有属性说明:

Property name Type Default Comment
id String   服务引用 BeanId
protocol String motan 使用的协议
interface Class   服务接口名
client String   客户端类型
directUrl String   点对点直连服务提供地址
basicReferer String   基本 referer 配置
extConfig String   扩展配置
proxy String   代理类型
group String default_rpc 服务分组
version String 1.0 版本
throwException String true 抛出异常
requestTimeout String 200 请求超时时间(毫秒)
connectTimeout String 1000 连接超时时间(毫秒)
retries int 0 重试次数
filter String   过滤器配置
listener String   监听器配置
connections int   连接数限制,0表示共享连接,否则为该服务独享连接数;默认共享
application String motan 应用信息
module String motan 模块信息
shareChannel boolean false 是否共享channel
timeout int   (目前未用)方法调用超时时间
actives int 0 最大请求数,0为不做并发限制
async boolean false 方法是否异步
mock String false 设为true,表示使用缺省Mock类名,即:接口名+Mock 后缀,服务接口调用失败Mock实现类
check boolean true 检查服务提供者是否存在
registry String   注册中心的id 列表,多个用“,”分隔,如果为空,则使用所有的配置中心
register boolean true 在该注册中心上服务是否暴露
subscribe boolean true 在该注册中心上服务是否引用
accessLog String false 设为true,将向logger 中输出访问日志
usegz boolean false 是否开启gzip压缩.只有compressMotan的codec才能支持
mingzSize int 1000 开启gzip压缩的阈值.usegz开关开启,且传输数据大于此阈值时,才会进行gzip压缩。只有compressMotan的codec才能支持
codec String motan 协议编码

再探motan的更多相关文章

  1. 【再探backbone 02】集合-Collection

    前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...

  2. ViewPager+Fragment再探:和TAB滑动条一起三者结合

    Fragment前篇: <Android Fragment初探:静态Fragment组成Activity> ViewPager前篇: <Android ViewPager初探:让页面 ...

  3. 再探jQuery

    再探jQuery 前言:在使用jQuery的时候发现一些知识点记得并不牢固,因此希望通过总结知识点加深对jQuery的应用,也希望和各位博友共同分享. jQuery是一个JavaScript库,它极大 ...

  4. [老老实实学WCF] 第五篇 再探通信--ClientBase

    老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...

  5. Spark Streaming揭秘 Day7 再探Job Scheduler

    Spark Streaming揭秘 Day7 再探Job Scheduler 今天,我们对Job Scheduler再进一步深入一下,对一些更加细节的源码进行分析. Job Scheduler启动 在 ...

  6. 再探ASP.NET 5(转载)

    就在最近一段时间,微软又有大动作了,在IDE方面除了给我们发布了Viausl Studio 2013 社区版还发布了全新的Visual Studio 2015 Preview. Visual Stud ...

  7. 再探java基础——break和continue的用法

    再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...

  8. 第四节:SignalR灵魂所在Hub模型及再探聊天室样例

    一. 整体介绍 本节:开始介绍SignalR另外一种通讯模型Hub(中心模型,或者叫集线器模型),它是一种RPC模式,允许客户端和服务器端各自自定义方法并且相互调用,对开发者来说相当友好. 该节包括的 ...

  9. 深入出不来nodejs源码-内置模块引入再探

    我发现每次细看源码都能发现我之前写的一些东西是错误的,去改掉吧,又很不协调,不改吧,看着又脑阔疼…… 所以,这一节再探,是对之前一些说法的纠正,另外再缝缝补补一些新的内容. 错误在哪呢?在之前的初探中 ...

随机推荐

  1. html中块级元素和行内元素

    块级元素和行内元素的三个区别 1.行内元素与块级元素直观上的区别: 行内元素会在一条直线上排列,都是同一行,水平方向排列 块级元素独占一行,垂直方向排列.块级元素从新行开始结束接着一个断行 2.块级元 ...

  2. require'模块化jquery和angular问题

    require 模块化开发问题,正常自己写的模块 是exports 导出一个模块 //模块化引入jquery 不同和问题 require 引入jquery swiper .... 插件和库的时候需要 ...

  3. SpringCloud+Git+Maven+Docker+Jenkins自动化构建

    1.JDK安装-OpenJDK安装 yum list java-1.8* yum install -y java-1.8.0-openjdk-devel.x86_64 PS: JDK安装有两种方法:一 ...

  4. git使用笔记 bitbucket基本操作

    实现目标: 1.将本地已经存在的项目文件保存到 bitbucket.org 2.从 bitbucket.org 检出代码库到本地 操作笔记: 1.首先在bitbucket.org创建一个代码库,并得到 ...

  5. 是否应该开启WebView硬件加速?

    android webview 在3.0+后显示flash要启用硬件加速,开启硬件加速也能够使绘制更加平滑. 开启硬件加速是在manifest中加入: android:hardwareAccelera ...

  6. Android进入页面开始就自动弹出软键盘

    EditText edittext = (EditText)findViewById(R.id.edittext);   edittext.setFocusable(true);   edittext ...

  7. MyEclipse打开JSP文件报"Failed to create the part's controls"解决方法汇总

    有时候,打开别人的开发环境中导过来的项目的JSP文件,会出现“Failed to create the part's controls”的错误! 解决的方法有: 方法1:关闭myeclipse的jsp ...

  8. Session、Cookie详解(2)

    session是web开发里一个重要的概念,在大多数web应用里session都是被当做现成的东西,拿来就直接用,但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求,当碰到这样的 ...

  9. .Net程序员应该掌握的正则表达式

    Regular Expression Net程序员必然要掌握正则的核心内容:匹配.提取.替换.常用元字符. 正则表达式是用来进行文本处理的技术,是语言无关的,在几乎所有语言中都有实现. 常用元字符 . ...

  10. linux 问题总结

    1.The program 'make' can be found in the following packages: 解决方法:sudo apt-get install build-essenti ...