2013年4月25日星期四

使用Git(GitLab)和Maven向Nexus发布Release

前置工具

Git配合GitLab;使用Nexus Sonatype管理本地maven仓库。

Maven主要命令

mvn release:prepare #设定本次版本信息和接下来的开发版本信息,并准备提交用到的一些jar文件。
mvn release:prepare -Dresume=false #重新开始prepare操作,忽略之前的release设置
mvn release:perform #发布release到maven仓库

Maven主要配置

<scm>
   <connection>scm:git:git@serverIp:root/project.git</connection>
   <url>scm:git:git@serverIp:root/project.git</url>
   <developerConnection>scm:git:git@serverIp:root/project.git</developerConnection>
</scm>
<plugins>
    <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-release-plugin</artifactId>
       <version>2.1</version>
    </plugin>
</plugins>
如果release中报Source files encoding not set的错误,还需要增加encoding的设置:
<properties>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

Git主要命令

git tag #查看本地的tag,release后会增加一个tag
git tag -d {tag_name} #删除tag
git push origin:refs/tags/{tag_name} #删除远程tag,先删除本地,在push到远端

Release成功后

GitLab上可以看到增加了一个xxx-1.0的tag。
本地代码的pom文件版本已经更新至下一版本,例如1.1-SNAPSHOT

2013年4月18日星期四

一致性Hash算法原理

算法介绍

consistent hash算法如图所示:首先将服务节点映射到一个0~2^32的圆上。例如server1~server3,hash(server1), hash(server2), hash(server3)
图1. 将server映射到圆上
然后将key值同样映射到圆上,并沿着顺时针查找第一个server节点,那么这个key值就会被保存到对应的server上。如图2.
图2.将key用同样的算法映射到圆上并寻找对应的server
如果添加或减少一个节点,响应会调整对应的节点和server的对应关系。如图3.
图3. 增加server4后,节点重新分布。
从图3看出,只有server4到server4之间的key会改变映射关系,key5会保存到server4.其他部分不会受到影响。

均匀分布

如图1-3, server在圆上的映射可能不是均匀的,这会导致有些节点映射的key比较多,有些则比较少。为了尽可能的均匀分布,我们引入了虚节点的概念。
所谓虚节点,就是将每个server在圆上映射多个hash值,例如server1,可以通过编号进行hash值映射计算:hash(server1#1),hash(server1#2)...hash(server1#n).一般每个server在圆上映射100-200个虚节点以后,key的分布会比较平均。
之前有一篇测试hash平均分布的文章,传送门