motan系列0——motan的简单使用和配置
这里我们只介绍motan的注解方式。
1、server端配置
(1)声明Annotation用来指定需要解析的包名
@Bean public AnnotationBean motanAnnotationBean() { AnnotationBean motanAnnotationBean = new AnnotationBean(); motanAnnotationBean.setPackage("com.weibo.motan.demo.server"); return motanAnnotationBean; }
(2)配置ProtocolConfig、RegistryConfig、BasicServiceConfig的bean对象,功能与xml配置中的<motan:protocol ....>、<motan:registry .....>、<motan:basicService ....>标签一致。
@Bean(name = "demoMotan") public ProtocolConfigBean protocolConfig1() { ProtocolConfigBean config = new ProtocolConfigBean(); config.setDefault(true); config.setName("motan"); config.setMaxContentLength(1048576); return config; } @Bean(name = "registryConfig1") public RegistryConfigBean registryConfig() { RegistryConfigBean config = new RegistryConfigBean(); config.setRegProtocol("local"); return config; } @Bean public BasicServiceConfigBean baseServiceConfig() { BasicServiceConfigBean config = new BasicServiceConfigBean(); config.setExport("demoMotan:8002"); config.setGroup("testgroup"); config.setAccessLog(false); config.setShareChannel(true); config.setModule("motan-demo-rpc"); config.setApplication("myMotanDemo"); config.setRegistry("registryConfig1"); return config; }
(3)service的实现类上添加@MotanService注解,注解的配置参数与xml配置方式的<motan:service ....>标签一致。
@MotanService(export = "demoMotan:8002") public class MotanDemoServiceImpl implements MotanDemoService { public String hello(String name) { System.out.println(name); return "Hello " + name + "!"; } }
(4)使用spring-boot启动服务
@EnableAutoConfiguration @SpringBootApplication public class SpringBootRpcServerDemo { public static void main(String[] args) { System.setProperty("server.port", "8081"); ConfigurableApplicationContext context = SpringApplication.run(SpringBootRpcServerDemo.class, args); MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true); System.out.println("server start..."); } }
这里为什么要设置一个开关,引用作者在github中的解释:
motan是通过这个开关控制是否对外提供rpc服务的。
一般正式环境使用时是需要验证服务正常后才正式对外提供服务的,防止有问题的服务注册到线上。另外在停机的时候,可以先通过开关暂停服务,等没有请求后在进行shutdown。
2、client端的配置
(1)声明Annotation、protocolConfig、RegistryConfig的配置bean。方式与server端配置类似。
(2)配置basicRefererConfig bean
@Bean(name = "motantestClientBasicConfig") public BasicRefererConfigBean baseRefererConfig() { BasicRefererConfigBean config = new BasicRefererConfigBean(); config.setProtocol("demoMotan"); config.setGroup("motan-demo-rpc"); config.setModule("motan-demo-rpc"); config.setApplication("myMotanDemo"); config.setRegistry("registry"); config.setCheck(false); config.setAccessLog(true); config.setRetries(2); config.setThrowException(true); return config; }
(3)在使用motan service 的对象上添加@MotanReferer注解,注册配置与xml方式的<motan:referer ....>标签一致
@RestController public class HelloController { @MotanReferer(basicReferer = "motantestClientBasicConfig", group = "testgroup", directUrl = "127.0.0.1:8002") MotanDemoService service; @RequestMapping("/") @ResponseBody public String home() { String result = service.hello("test"); return result; } }
3、配置说明
这里只说下<motan:service .../>和<motan:basicService .../>两个(<motan:refer .../>和<motan:basicRefer .../>同理)
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可以通过以下方式引用基本配置。
协议配置列表
<motan:protocol/>
Property name | Type | Default | Comment |
---|---|---|---|
name | String | 服务协议名 | |
serialization | String | hessian2 | 序列化方式 |
payload | int | 最大请求数据长度 | |
buffer | int | 缓存区大小 | |
heartbeat | int | 心跳间隔 | |
transporter | String | 网络传输方式 | |
threads | int | 线程池大小 | |
iothreads | int | availableProcessors+1 | IO线程池大小 |
requestTimeout | int | 200 | 请求超时 |
minClientConnection | int | 2 | client最小连接数 |
maxClientConnection | int | 10 | client最大连接数 |
minWorkerThread | int | 20 | 最小工作pool线程数 |
maxWorkerThread | int | 200 | 最大工作pool线程数 |
maxContentLength | int | 10M | 请求响应包的最大长度限制 |
maxServerConnection | int | 100000 | server支持的最大连接数 |
poolLifo | boolean | true | 连接池管理方式,是否lifo |
lazyInit | boolean | false | 是否延迟init |
endpointFactory | boolean | motan | endpoint factory |
cluster | String | default | 采用哪种cluster的实现 |
loadbalance | String | activeWeight | 负载均衡策略 |
haStrategy | String | failover | 高可用策略 |
workerQueueSize | String | 0 | Server工作队列大小 |
acceptConnections | int | 0 | Server可接受连接数 |
proxy | String | jdk | proxy type, like jdk or javassist |
filter | String | filter, 多个filter用","分割,blank String 表示采用默认的filter配置 | |
retries | int | 0 | 调用失败时重试次数 |
async | boolean | false | if the request is called async, a taskFuture result will be sent back |
queueSize | Int | 线程池队列大小 | |
accepts | Int | 最大接收连接数 | |
dispatcher | String | 信息线程模型派发方式 | |
server | String | 服务器端实现 | |
client | String | 客户端端实现 | |
default | boolean | 是否缺省的配置 | |
switcherService | String | localSwitcherService | |
heartbeatFactory | String | motan |
注册中心配置列表
<motan: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
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 | 协议编码 |
client配置列表
<motan:referer/>
<motan:basicReferer/>
protocol、basic referer、extConfig、referer中定义相同属性时,优先级为referer > extConfig > basic referer > protocol
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:method/>
需要定义在motan:referer内,用于控制某个函数的行为
Property name | Type | Default | Comment |
---|---|---|---|
name | String | 函数名 | |
argumentTypes | String | 参数类型(逗号分隔), 无参数用void. 如果方法无重载,则可不写 | |
requestTimeout | int | 200 | 请求超时时间(毫秒) |
connectTimeout | int | 1000 | 连接超时时间(毫秒) |