再探motan
前言:上周使用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的更多相关文章
- 【再探backbone 02】集合-Collection
前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...
- ViewPager+Fragment再探:和TAB滑动条一起三者结合
Fragment前篇: <Android Fragment初探:静态Fragment组成Activity> ViewPager前篇: <Android ViewPager初探:让页面 ...
- 再探jQuery
再探jQuery 前言:在使用jQuery的时候发现一些知识点记得并不牢固,因此希望通过总结知识点加深对jQuery的应用,也希望和各位博友共同分享. jQuery是一个JavaScript库,它极大 ...
- [老老实实学WCF] 第五篇 再探通信--ClientBase
老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...
- Spark Streaming揭秘 Day7 再探Job Scheduler
Spark Streaming揭秘 Day7 再探Job Scheduler 今天,我们对Job Scheduler再进一步深入一下,对一些更加细节的源码进行分析. Job Scheduler启动 在 ...
- 再探ASP.NET 5(转载)
就在最近一段时间,微软又有大动作了,在IDE方面除了给我们发布了Viausl Studio 2013 社区版还发布了全新的Visual Studio 2015 Preview. Visual Stud ...
- 再探java基础——break和continue的用法
再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...
- 第四节:SignalR灵魂所在Hub模型及再探聊天室样例
一. 整体介绍 本节:开始介绍SignalR另外一种通讯模型Hub(中心模型,或者叫集线器模型),它是一种RPC模式,允许客户端和服务器端各自自定义方法并且相互调用,对开发者来说相当友好. 该节包括的 ...
- 深入出不来nodejs源码-内置模块引入再探
我发现每次细看源码都能发现我之前写的一些东西是错误的,去改掉吧,又很不协调,不改吧,看着又脑阔疼…… 所以,这一节再探,是对之前一些说法的纠正,另外再缝缝补补一些新的内容. 错误在哪呢?在之前的初探中 ...
随机推荐
- k8s常用指令集(kubectl kubeadm)
1 Kubectl指令集 1.1 Master查询节点信息 [root@master1 kubernetes-1.10]# kubectl get nodes 1.2 查 ...
- 为什么分布式一定要有redis?(转)
为什么分布式一定要有redis? 程序员小灰 6天前 点击上方“程序员小灰”,选择“置顶公众号” 有趣有内涵的文章第一时间送达! 作者:孤独烟 来自:http://rjzheng.cnblogs.co ...
- 深入理解jQuery插件开发总结(二)
1,开始 可以通过为jQuery.fn增加一个新的函数来编写jQuery插件.属性的名字就是你的插件的名字: jQuery.fn.myPlugin = function(){ //开始写你的代码吧! ...
- BBS登录与注册功能
登录功能 视图函数 def my_login(request): if request.method == 'GET': return render(request, 'login.html') el ...
- IE8 td元素 width无效的bug;
不经意间做项目发现IE的td在某种情况下好奇怪,自己设置的width不起作用: 后经google大法,发现解决方案:已验证过完美解决bug; <table style="width: ...
- window onload || jquery $()
1.window 的 onload 机制只指定一个函数,且在页面DOM及静态资源加载完之后执行: window.onload = function(){ alert(); } 2.$(document ...
- CentOS 7运维管理笔记(12)----GUI配置工具Webmin的安装
早期的Linux系统管理员或是Web管理员在修改服务器配置时使用最多的就是vi编辑器,但是现在越来越多的基于GUI界面的配置工具出现了,毕竟人们还是喜欢以直接的可视化的方式来修改服务器的配置,而不是再 ...
- 【转】B树、B-树、B+树、B*树、红黑树、 二叉排序树、trie树Double Array 字典查找树简介
B 树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: ...
- Goclipse的Eclipse插件包安装升级地址
http://goclipse.github.io/releases/ Eclipse Software Site for Goclipse This URL is an Eclipse softwa ...
- ado.net c#基本的增加,修改,删除,查询
自己初次学习用的,各种不规范,注释没写 class AdoDemo { static string strConn = @"Data Source=server1;Initial Catal ...