# super-diamond-enhance
**Repository Path**: mirrors_gspandy/super-diamond-enhance
## Basic Information
- **Project Name**: super-diamond-enhance
- **Description**: 支持集群部署,动态推送,配置一键导出导入,模块管理,全局配置查询等功能,可匹敌disconf
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-09-24
- **Last Updated**: 2025-12-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#配置中心使用手册
## 问题交流
* EMAIL: kgw1681682009@126.com
## 名词介绍
* DRM
>
Distributed Resource Manager,分布式资源管理器,在本系统中特指被分布式管理器所管理的分布式资源对象,是配置的一种
* CONFIG
>
区别于DRM,类似于之前通过注入到bean中的配置
##前言
eclipse启动 jvm参数为:-DBASE_HOME=xxx\super-diamond-enhance\super-diamond-server\src\main
super-diamond-enhance基于super-diamond,变动点如下:
* 部署方式从单点到集群的改变
* 弱化用户权限的概念,只剩下admin和guest两个账号
* 支持线下线上配置的一键导出和导入

* 新增模块管理,不同的项目相同的模块无需再次创建

* 新增DRM资源推送,推送可以细粒化到单个单台服务器的单个配置


* 新增配置项的使用情况查询功能,精确到具体的项目,部署的实例节点
* 新增分环境全局配置查询,可根据关键词查询配置及其使用情况


##目录
1. [客户端使用说明](#config-1)
2. [服务端使用说明](#config-2)
4. [部署须知](#config-3)
5. [运维须知](#config-4)
6. [使用的最佳实践](#config-5)
##客户端使用说明
* maven依赖
>
com.github.diamond
super-diamond-client
1.1.1
* 业务系统的spring配置文件中引入super-diamond-client的spring配置文件,写法如下:
>
>
* 维持原来的配置不变,删除系统中所有的配置
* 在classpath下创建spring文件夹,并在其中创建diamond.properties,该文件配置了客户端连接服务器的必要信息,格式如下:
>
#url
cs.diamondHost=127.0.0.1
#netty端口
cs.diamondPort=8283
#项目编码
cs.diamondProjcode=001
#配置环境,分为development,build,test,production
cs.diamondProfile=development
>
* 如果项目为web工程,那么diamond.properties最好放在web那一层对应的classpath下,因为运维在发布时需要修改其中的连接配置
* 如果业务系统要用到DRM配置,则需要创建具体的@DResource资源,如下所示:
>
@Component("userResource")
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
@DResource
public class UserResource {
@DAttribute(key = "nameSuffix")
private String nameSuffix;
>
public String getNameSuffix()
return nameSuffix;
}
public void setNameSuffix(String nameSuffix) {
this.nameSuffix = nameSuffix;
}
@BeforeUpdate
public void before(String key, Object newValue) {
System.out.println(key + " update to " + newValue + " start...");
}
@AfterUpdate
public void after(String key, Object newValue) {
System.out.println(key + " update to " + newValue + " end...");
}
>
注解解释如下:
* @DResource标注当前类为DRM资源
* @DAttribute标识需要动态变更的属性
* @BeforeUpdate每个属性动态更新前都会运行一次
* @AfterUpdate@BeforeUpdate和@AfterUpdate所标注的方法的方法名不做限制,但是参数是做限制的,第一个参数必须为String类型,
标识当前变更的key,第二个参数必须为Object,标识配置中心新推送过来的值每个属性动态更新后都会运行一次
* @DResource标识的资源类不一定要通过@Component的方式注入到Spring容器,也可通过xml的方式定义,但必须为单例
## 服务端使用说明
* 服务端分为admin/guest两个账户,admin可以进行所有操作,guest不能不能执行任何添加和删除的动作
* development环境下可以直接导入模版配置(首页的模块管理,可以对模块进行编辑,并且模块在所有项目之间是共享的),也可以从Excel直接导入所有的配置(Excel由配置导出功能生产,不要自己创建Excel,否则服务端无法识别Excel格式)
* 其它环境下可以导出当前环境下的所有配置
* 首页的配置查询功能可以根据关键字查询所有系统的配置项,并且可以查看配置项对应的客户端连接情况
* 用自己的用户名登陆成功,并在development环境下编辑具体的配置项,其它环境只允许修改配置
* 具体的配置项说明如下:
* 资源类型(分为CONFIG和DRM两种,CONFIG方式的配置是不可变的,使用的方式和原来通过使用的方式一致,DRM类型的配置是可以动态变更的)
* 可见性(分为PRIVATE,PUBLIC两种,PRIVATE类型的配置项对guest账号是隐藏的)
* 配置类型为CONFIG的配置项只能查看当前配置项被哪些系统使用,DRM配置则可以进行全局和局部推送,进行`全局推送`之前要先修改具体的配置项,点击保存后,该配置会持久化到DB,`局部推送`需要手动填写要推送的值,可对指定的客户端进行推送,如下图所示:
## 部署须知
* 服务端至少部署两个实例,两个实例所在的服务器的时钟必须一致(心跳检测牵扯服务器之间的时间比对)*
* 每个实例分别运行着Jetty Server和Netty Server,jetty server中运行jsp,对外提供展示页面以及配置的修改,netty server提供配置的推送,所以Jetty server的访问通过Nginx(Http)负载,Netty Server的访问通过HA Proxy(TCP)负载
* 因为多个实例之间也需要进行通信,所以JettyServer的ip要手动配置当前服务器真实ip,而非`0.0.0.0`或`127.0.0.1`,Netty Server的ip可以用`0.0.0.0`
* 配置中心多个实例共享DB,所以DB数据的数据需要定时做备份
## 运维须知
* 实例的启动以及关闭使用配置中心自带的启动和关闭脚本,server的启动为: `./server.sh start`,server的关闭为: `./server stop`,不建议使用`kill -9`等强制关闭进程的命令(虽然系统有对这些情况作处理)
## 客户端使用最佳实践
1. 建议具体的业务系统把配置中心的日志输出到单独的日志文件中,如果系统出现问题方便查询
* 配置中心的客户端使用slf4j进行日志记录,具体的日志输出受具体的业务系统控制,建议业务系统使用logback日志框架(对slf4j提供原生支持),如果为其它日志框架,比如log4j,那么需要引入slf4j和log4j之间的过渡包:slf4j-log4j12-xxx.jar
* 配置中心为保证开发环境与生产环境配置的一致性,所以只有开发环境提供配置项的新增与修改,其它的环境下只能进行修改
* 虽然配置中心提供4种环境下的配置管理(development,build,test,production),但是它们共享同一个DB,所以在开发环境以及测试环境下不能使用线上的配置中心,避免照成线上配置混乱
* 测试环境测试完毕之后可以用配置导出功能导出所有的配置,这样在发布时,直接把该Excel导入生产环境就好了,有些生产的配置,运维还需要修改一下
* 配置中心通过DRMInitBeanFactoryPostProcessor完成对DRM资源的初始化,并且DRMInitBeanFactoryPostProcessor实现了Ordered接口,在Ordered级别的DRMInitBeanFactoryPostProcessor生命周期是最靠前的,所以业务系统如果用到了BeanFactoryPostProcessor,并且其中用到了DRM,那么它的生命周期一定要在DRMInitBeanFactoryPostProcessor之后,否则用到DRM时,DRM还未完成初始化
* 如果业务系统为web工程,并且对应的`[servlet-name]-servlet.xml`中也包含配置,那么这时除了在web.xml中的contextConfigLocation要指定`classpath*:spring/super-diamond-spring.xml`,在[servlet-name]-servlet.xml也要import `classpath*:spring/super-diamond-spring.xml`,因为存在spring父子容器的情况