29.安心技术梳理 - diamond使用介绍

diamond介绍

diamond为应用系统提供了获取配置的服务,应用不仅可以在启动时从diamond获取相关的配置,而且可以在运行中对配置数据的变化进行感知并获取变化后的配置数据。

diamond特点

diamond的特点是简单、可靠、易用:

简单:整体结构非常简单,从而减少了出错的可能性。

可靠:应用方在任何情况下都可以启动,在承载阿里核心系统并正常运行多年来,没有出现过任何重大故障。

易用:客户端使用只需要两行代码,暴露的接口都非常简单,易于理解。

常见应用场景

  1. 使用tddl分表分库的DB配置。
  2. 中间件的服务地址。
  3. 经常变化的开关,配置。

简单使用

引入依赖(如果使用了tddl客户端包,会有diamond冲突,排除掉其中一个diamond即可

<dependency>

  <groupId>com.taobao.diamond</groupId>

  <artifactId>diamond-client</artifactId>

  <version>2.0.5.4.g1-SNAPSHOT</version>

</dependency>


客户端代码

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;

 

 

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() {

            //运行中动态感知配置的变更,configInfo为最新配置,或者在方法内再次执行getAvailableConfigureInfomation

            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);

    }

}

diamond环境运维

diamond客户端与服务端通过httpclient请求数据,服务端地址获取方式有以下几种:

方式一:启动用户目录下/diamond/ServerAddress中指定ip列表,ip用逗号或者空行分隔

方式二:类路径下,增加配置文件ServerAddress并指定ip列表

方式三:diamond客户端运行后,启动用户目录下会自动生成.diamond.domain文件,客户端会使用文件中配置的域名来访问服务端。

              #diamond.sit.ds.gome.com.cn(测试环境)

              #diamond.uat.ds.gome.com.cn(测试环境)

             #diamond.pre.ds.gome.com.cn(测试环境)

             #diamond.prelive.ds.gome.com.cn (4344环境)

             #diamond.live.ds.gome.com.cn(生产环境)

  (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

配置:

29.安心技术梳理 - diamond使用介绍

部署结构:

29.安心技术梳理 - diamond使用介绍

 

容灾性

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的服务器ip地址

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/ .