它是什么
diamond为应用系统提供了获取配置的服务,应用不仅可以在启动时从diamond获取相关的配置,
而且可以在运行中对配置数据的变化进行感知并获取变化后的配置数据.
为什么需要它
diamond的特点是简单、可靠、易用:
简单:整体结构非常简单,从而减少了出错的可能性。
可靠:应用方在任何情况下都可以启动,在承载阿里核心系统并正常运行多年来,没有出现过任何重大故障。
易用:客户端使用只需要两行代码,暴露的接口都非常简单,易于理解。
常见应用场景
- 分表分库的DB服务器地址.
- 中间件的服务地址.
- 经常变化的开关,配置.
简单使用
引入
<
dependency
>
<
groupId
>com.taobao.diamond</
groupId
>
<
artifactId
>diamond-client</
artifactId
>
<
version
>2.0.5.4.taocode-SNAPSHOT</
version
>
</
dependency
>
客户端代码(推荐使用方式3,若想绕过其它使用方式,强制使用方式三,DefaultDiamondManager最后一个参数写成true):
DiamondClientExample
package
com.taobao.diamond.client;
import
java.util.concurrent.Executor;
import
com.taobao.diamond.manager.DiamondManager;
import
com.taobao.diamond.manager.ManagerListener;
import
com.taobao.diamond.manager.impl.DefaultDiamondManager;
/**
* <pre>
* diamond-server的ip列表依次按如下方式<1>,<2>,<3>寻找,寻到配置的ip列表就结束寻找,没寻找到就报异常.
* 使用diamond时,
*
* 方式<1>:
* DefaultDiamondManager构造器中如果指定了ip列表,则以这个ip列表为准
* 方式<2>:
* 类路径下,增加配置文件ServerAddress,其中指定ip列表
* 新方式<3>(兼容老方式):
* diamond-client首次启用会自动添加.diamond.domain文件到用户目录下
* 客户端会使用文件中配置的域名来访问diamond-server
* 各环境域名:
* diamond.sit.ds.gome.com.cn
* diamond.uat.ds.gome.com.cn
* diamond.pre.ds.gome.com.cn
* diamond.live.ds.gome.com.cn
*
* 文件.diamond.domain说明:
* (1)windows和mac的操作系统默认内容是diamond.sit.ds.gome.com.cn,可以自行修改
* (2)linux操作系统不设置默认内容,需要修改.diamond.domain来选择域名
* (3)若要兼容老的域名访问方式,请在.diamond.domain中配置a.b.c,同时在/etc/hosts配置a.b.c指向自己的nginx
*
*
* </pre>
*
* @author liutingfeng
*
*/
public
class
DiamondTestClient {
public
static
DiamondManager manager;
public
static
void
main(String[] str) {
initDiamondManager();
}
private
static
void
initDiamondManager() {
manager =
new
DefaultDiamondManager(
"group_test"
,
"dataId_test"
,
new
ManagerListener() {
public
void
receiveConfigInfo(String configInfo) {
restart();
}
public
Executor getExecutor() {
return
null
;
}
},
true
);
//true表示强制使用域名
restart();
}
private
static
void
restart() {
String availableConfigureInfomation = manager.getAvailableConfigureInfomation(
5000
);
System.out.println(
"availableConfigureInfomation="
+ availableConfigureInfomation);
}
}
服务端配置
国美线上的部署结构
容灾性
1、数据库不可用.
2、所有server均不可用.
3、client主动删除了snapshot.
4、client没有备份配置数据,导致其不能配置“容灾目录”.
diamond与springPropertyPlaceholder动态集成
///动态配置说明/
1.引入
<
dependency
>
<
groupId
>com.gome</
groupId
>
<
artifactId
>gome-common-spring</
artifactId
>
<
version
>1.0.0</
version
>
</
dependency
>
<
dependency
>
<
groupId
>com.taobao.diamond</
groupId
>
<
artifactId
>diamond-client</
artifactId
>
<
version
>2.0.5.4.taocode-SNAPSHOT</
version
>
</
dependency
>
<
dependency
>
<
groupId
>com.taobao.diamond</
groupId
>
<
artifactId
>diamond-utils</
artifactId
>
<
version
>2.0.5.4.taocode-SNAPSHOT</
version
>
</
dependency
>
2.项目下
config.properties //配置了diamond定义的配置信息的 groupId和dataId 名称
//注意这个配置规范
ServerAddress //配置diamond的服务器pi地址
3.spring 配置
<
bean
id
=
"diamondProperties"
class
=
"com.gome.spring.utils.DiamondProperties"
/>
<
bean
id
=
"customPropertyConfigurer"
class
=
"com.gome.spring.lang.CustomPropertyPlaceholderConfigurer"
>
<
constructor-arg
index
=
"0"
>
<
set
>
<!-- 注意这里若没有本地配置文件时可以不配置value,但constructor-arg index set必须保留 若配置了本地配置文件,则该配置将和diamond远程配置文件合并 -->
<
value
>classpath:internal.properties</
value
>
</
set
>
</
constructor-arg
>
<
constructor-arg
index
=
"1"
ref
=
"diamondProperties"
/>
</
bean
>
diamond执行流程
1.读本地用户目录下 .diamond.domain 文件中的域名 ,比如 diamond.uat.ds.gome.com.cn , 如果使用a.b.c 需要在服务器hosts文件中配置
2.读步骤1中域名对应的ip , 比如:ping diamond.uat.ds.gome.com.cn ==> 10.58.50.110
3.通过步骤2中的ip取出可用的diamond-server列表, 访问 http://ip/url , 比如:curl 'http://diamond.uat.ds.gome.com.cn/url' ==> 10.58.50.204,10.58.50.205
4.通过步骤3中的ip列表,提取数据,比如(苦中group,dataId由程序中给定):curl 'http://10.58.50.204/diamond-server/config.co?group=zookeeper&dataId=url' ==> 10.58.50.203:2181,10.58.50.204:2181,10.58.50.205:2181
相关链接
阿里中间件团队技术博客 http://jm.taobao.org/ .