它是什麼
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):
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/ .