如何向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协议:
  1. /*
  2. * Copyright 2009-2016 Weibo, Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  • 代码注释及提交注释使用英文,并使用清晰的描述语句,提交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扩展点接口

  • 实现类增加注解

  1. @Spi(scope = Scope.SINGLETON) //扩展加载形式,单例或多例
  2. @SpiMeta(name = "motan") //name表示扩展点的名称,根据name加载对应扩展
  3. @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过滤。 配置样例如下:

  1. @Activation(key = { MotanConstants.NODE_TYPE_SERVICE, MotanConstants.NODE_TYPE_REFERER })

如果只需要在某些service中生效,则可以直接通过在basicService或者service中配置 filter="filter_name"即可,其中的filter_name就是扩展filter中声明的@SpiMeta(name = "*")中name的值

推荐通过配置方式使用filter,减少不必要的filter装载

示例插件

  1. 请参考`com.weibo.api.motan.filter`包下的filter实现