如何向Motan贡献代码
概述
Motan遵循Apache 2.0开源协议,我们欢迎所有人向Motan项目贡献代码,为开源社区贡献力量。
流程
- (可选)提交Issue,说明你想要增加或修改的功能,我们会与你进行讨论修改的可行性并给出开发的建议。
- (可选)你也可以认领Issue列表中已有的问题,在Issue中留言告知我们。
- 开始开发,Motan的开发流程基于Github flow,请参考Understanding the GitHub Flow
- fork Motan仓库(详细步骤请参考Working with forks)
- 在你的仓库中创建新的分支并提交代码。
- 创建pull request
- 我们会review你的代码并给出修改的建议。
- 代码符合要求后,我们会将代码合并到主分支。
- 我们会把你的名字更新到Motan的贡献者列表,感谢你对Motan的贡献!
要求
- 所有Motan源文件头需要包含Apache 2.0协议:
/*
* Copyright 2009-2016 Weibo, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
代码注释及提交注释使用英文,并使用清晰的描述语句,提交Pull Request前请使用git rebase功能完善提交记录。
代码格式请参考Google Java Style Guide或已有的源文件,保持风格一致。
开发过程中如果遇到问题可以随时通过Issue与我们联系。
如何更新Motan Wiki
由于github wiki不提供pull request机制,我们在motan项目中放置了wiki目录,你可以提交pull request来修改这些文件,我们会将更新合并到wiki页面中。
扩展机制
概述
Motan框架基于扩展机制开发,增加新功能只需按照扩展机制实现对应的接口,甚至可以在不改造Motan代码本身的基础上增加新的功能。
扩展点
- Filter 发送/接收请求过程中增加切面逻辑,默认提供日志统计等功能
- HAStrategy 扩展可用性策略,默认提供快速失败等策略
- LoadBalance 扩展负载均衡策略,默认提供轮询等策略
- Serialization 扩展序列化方式,默认使用Hession序列化
- Protocol 扩展通讯协议,默认使用Motan自定义协议
- Registry 扩展服务发现机制,默认支持Zookeeper、Consul等服务发现机制
- Transport 扩展通讯框架,默认使用Netty框架
编写一个Motan扩展
实现SPI扩展点接口
实现类增加注解
@Spi(scope = Scope.SINGLETON) //扩展加载形式,单例或多例
@SpiMeta(name = "motan") //name表示扩展点的名称,根据name加载对应扩展
@Activation(sequence = 100) //同类型扩展生效顺序,部分扩展点支持。非必填
- 增加SPI实现声明${classpath}/META-INF/services/${SPI interface fullname}文件中添加对应SPI接口实现类全名。可参照motan-core模块/META-INF/services/下的配置
扩展Motan的filter
filter机制是在client端与server端请求处理是都会经过的过滤机制,使用者可以通过filter来实现对请求的request和response进行定制化处理。filter扩展的实现方式是通过上述的SPI扩展,使用中有如下问题需要注意。
1、如何使扩展的filter生效。
SPI扩展必须对应一个唯一的name,实际使用中通过name来加载扩展。一般扩展需要在配置中设置对应的name,然后自动加载。
filter扩展默认是不生效的,加载filter的方式分为强制加载和指定加载。如果需要强制生效,可以通过配置@Activation来实现,MotanConstants.NODE_TYPE_SERVICE表示在server端强制生效,MotanConstants.NODE_TYPE_REFERER表示在client端强制生效。 强制生效情况下,不管任何service都会进行filter过滤。 配置样例如下:
- @Activation(key = { MotanConstants.NODE_TYPE_SERVICE, MotanConstants.NODE_TYPE_REFERER })
如果只需要在某些service中生效,则可以直接通过在basicService或者service中配置 filter="filter_name"即可,其中的filter_name就是扩展filter中声明的@SpiMeta(name = "*")中name的值
推荐通过配置方式使用filter,减少不必要的filter装载
示例插件
请参考`com.weibo.api.motan.filter`包下的filter实现