第二种是对一条或多条数据的配置系统,主要是针对数据量小的表集中通过 mars-dynamic-config配置,节省了我们创建小表带来的工作量;通过mars-dynamic-config 配置可以直接通过集成api 直接获取对应的数据,从而节省了我们的开发时间。
软件架构说明
- 后端使用技术 :springboot mybatis jwt
- 前端使用:thymeleaf 模板引擎
- 数据库 :mysql
- jdk :1.8
- 【客户端】 使用框架spring、springboot、springcloud 系统
- 先创建数据库mars_db ,导入 sql目录下的 init.sql 文件
- 修改 mars-console-2.0.1.jar 包中的配置文件 \BOOT-INF\classes\application.properties 中的mysql 配置,及端口,使用命令 java -jar mars-console-2.0.1.jar 启动
- 访问地址:ip + port 账户:mars 密码:mars 权限:超级管理员
- mars-console-2.0.1.jar 可以配置化集群模式
#【mars-console】集群配置
mars.cluster.address=ip:port,ip2:port,ip3:port
#【mars-console】同步其他服务器重试次数(默认3)
mars.cluster.sync.retry=3
<!-- spring 引入 -->
<dependency>
<groupId>com.github.fashionbrot</groupId>
<artifactId>system-dynamic-config</artifactId>
<version>2.0.1</version>
</dependency>
<!-- springboot or springcloud 引入 -->
<dependency>
<groupId>com.github.fashionbrot</groupId>
<artifactId>system-dynamic-springboot-starter</artifactId>
<version>2.0.1</version>
</dependency>
配置参数 | 配置说明 | 是否必填 |
---|---|---|
mars.dynamic.system.app-code | 应用名称 | 必填 |
mars.dynamic.system.env-code | 环境code | 必填 |
mars.dynamic.system.server-address | server地址多个逗号分隔 | 必填 |
mars.dynamic.system.listen-long-poll-ms | 客户端轮训毫秒数(默认30000) | 否 |
mars.dynamic.system.enable-local-cache | 是否开启本地缓存默认false | 否 |
mars.dynamic.system.local-cache-path | 本地缓存路径(默认user.home) | 否 |
package com.github.fashionbrot;
import com.github.fashionbrot.config.annotation.EnableSystemDynamicConfig;
import org.springframework.stereotype.Component;
@Component
@EnableSystemDynamicConfig(appCode = "app",envCode = "beta",serverAddress = "localhost:8081")
public class SystemConfig {
}
@MarsValue(value = "${abc}",autoRefreshed = true)
private String abc;
(4)、【客户端】通过@MarsConfigurationProperties 注解把对应配置映射到 TestConfig 类中
如springboot @ConfigurationProperties 功能相似 @MarsProperty 读取配置key @MarsIgnoreField忽略abc字段配置
import MarsConfigurationProperties;
import MarsIgnoreField;
import MarsProperty;
import lombok.Data;
@Data
//aaa 对应【后端系统】里面的 文件名称
@MarsConfigurationProperties(fileName = "aaa",autoRefreshed = true)
public class TestConfig {
//修改字段的绑定名称
@MarsProperty("abc")
public String name ;
//忽略字段的绑定
@MarsIgnoreField
private String abc;
}
/**
* 方式三根据 配置发生变化获取到监听
* @param
*/
@MarsConfigListener(fileName = "test",autoRefreshed = true)
public void testP(Properties properties){
System.out.println("11111:"+properties.toString());
}
安装教程如上
<!-- spring 引入 -->
<dependency>
<groupId>com.github.fashionbrot</groupId>
<artifactId>data-dynamic-config</artifactId>
<version>0.2.0</version>
</dependency>
<!-- springboot or springcloud 引入 -->
<dependency>
<groupId>com.github.fashionbrot</groupId>
<artifactId>data-dynamic-springboot-starter</artifactId>
<version>0.2.0</version>
</dependency>
配置参数 | 配置说明 | 是否必填 |
---|---|---|
mars.dynamic.data.app-code | 应用code | 必填 |
mars.dynamic.data.env-code | 环境code | 必填 |
mars.dynamic.data.server-address | server地址多个逗号分隔 | 必填 |
mars.dynamic.data.listen-long-poll-ms | 客户端轮训毫秒数(默认10000) | 否 |
package com.github.fashionbrot.config;
import com.github.fashionbrot.annotation.EnableDataDynamicConfig;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableDataDynamicConfig(appCode = "app",envCode = "beta",serverAddress = "192.168.1.15:8081")
public class DataDynamicConfig {
}
//需要继承 MarsTemplateKeyMapping 类实现 initTemplateKeyClass 方法
package com.github.fashionbrot.config;
import com.github.fashionbrot.MarsTemplateKeyMapping;
import com.github.fashionbrot.model.BannerModel;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class TemplateKeyMapping extends MarsTemplateKeyMapping {
@Override
public Map<String, Class> initTemplateKeyClass() {
Map<String,Class> map=new HashMap<>();
map.put("banner", BannerModel.class);
return map;
}
}
@RequestMapping("test")
@ResponseBody
public Object test(){
return DataDynamicCache.getTemplateObject("banner");
}
@RequestMapping("test1")
@ResponseBody
public Object test1(){
return DataDynamicCache.getTemplateObject("banner");
}
@RequestMapping("test2")
@ResponseBody
public Object test2(){
List<BannerModel> banner = DataDynamicCache.getDeepTemplateObject("banner");
if (CollectionUtil.isNotEmpty(banner)){
for (BannerModel b :banner){
b.setTitle("abc");
}
}
return banner;
}
- Fork 本仓库
- 新建 Feat_xxx 分支
- 提交代码
- 新建 Pull Request
- 使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md
- Gitee 官方博客 https://my.oschina.net/u/3301366