再探motan
前言:上周使用motan是通过group远程调用超级土豆的服务,但是因为我需要写一些服务,不得不在本地启动服务,于是就详细的自己配置了一次motan。
上一篇博客也说到了,motan主要有3部分组成:registry,server和client。其中我们的registry用的是consul。下面就这3个部分一个一个的说明:
1、pom.xml 添加motan依赖:
一般来说,在公共模块的pom文件里添加依赖就可以了,比如在server、client、dao和common的sna编程模型下,只要在common的pom文件中添加依赖即可
1 <dependency> 2 <groupid>com.weibo</groupid> 3 <artifactid>motan-core</artifactid> 4 <version>release</version> 5 </dependency> 6 <dependency> 7 <groupid>com.weibo</groupid> 8 <artifactid>motan-transport-netty</artifactid> 9 <version>release</version> 10 </dependency> 11 12 <!-- only needed for spring-based features --> 13 <dependency> 14 <groupid>com.weibo</groupid> 15 <artifactid>motan-springsupport</artifactid> 16 <version>release</version> 17 </dependency> 18 <dependency> 19 <groupid>org.springframework</groupid> 20 <artifactid>spring-context</artifactid> 21 <version>4.2.4.release</version> 22 </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 | 协议编码 |