本文目录导读:

我来详细介绍Java动态配置的几种开发方案,从简单到复杂的实战案例。
基于配置文件的热加载方案
使用Spring Cloud Config + Git
// 1. 服务端配置 (config-server)
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
// application.yml
server:
port: 8888
spring:
cloud:
config:
server:
git:
uri: https://github.com/your-repo/config-repo
search-paths: '{application}'
// 2. 客户端配置 (config-client)
@SpringBootApplication
@RefreshScope // 支持动态刷新
public class ConfigClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigClientApplication.class, args);
}
}
// 配置类
@Component
@RefreshScope
public class DynamicConfig {
@Value("${app.feature.enabled:false}")
private boolean featureEnabled;
@Value("${app.timeout:5000}")
private int timeout;
// getter方法
public boolean isFeatureEnabled() {
return featureEnabled;
}
public int getTimeout() {
return timeout;
}
}
// 使用示例
@RestController
public class ConfigController {
@Autowired
private DynamicConfig dynamicConfig;
@GetMapping("/api/config")
public String getConfig() {
return "Feature: " + dynamicConfig.isFeatureEnabled()
+ ", Timeout: " + dynamicConfig.getTimeout();
}
@PostMapping("/actuator/refresh")
public String refreshConfig() {
// 手动触发刷新
return "Config refreshed";
}
}
基于数据库的动态配置方案
自定义配置表设计
-- 创建配置表
CREATE TABLE system_config (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
config_key VARCHAR(100) UNIQUE NOT NULL,
config_value VARCHAR(500),
config_desc VARCHAR(255),
version INT DEFAULT 1,
create_time DATETIME,
update_time DATETIME
);
-- 插入示例数据
INSERT INTO system_config (config_key, config_value, config_desc) VALUES
('app.feature.enabled', 'false', '功能开关'),
('app.timeout', '5000', '超时时间(ms)'),
('app.rate.limit', '100', '速率限制');
动态配置管理器
@Component
public class DynamicConfigManager {
@Autowired
private ConfigRepository configRepository;
@Autowired
private ApplicationContext applicationContext;
// 本地缓存
private final Map<String, String> configCache = new ConcurrentHashMap<>();
@PostConstruct
public void init() {
loadAllConfigs();
}
// 加载所有配置到缓存
public void loadAllConfigs() {
List<SystemConfig> configs = configRepository.findAll();
configs.forEach(config ->
configCache.put(config.getConfigKey(), config.getConfigValue())
);
}
// 获取配置值
public String getConfig(String key, String defaultValue) {
return configCache.getOrDefault(key, defaultValue);
}
// 更新配置
@Transactional
public void updateConfig(String key, String value) {
SystemConfig config = configRepository.findByConfigKey(key)
.orElse(new SystemConfig());
config.setConfigKey(key);
config.setConfigValue(value);
config.setVersion(config.getVersion() + 1);
config.setUpdateTime(LocalDateTime.now());
configRepository.save(config);
// 更新缓存
configCache.put(key, value);
// 发送配置变更事件
publishConfigChangeEvent(key, value);
}
// 发布配置变更事件
private void publishConfigChangeEvent(String key, String value) {
ConfigChangeEvent event = new ConfigChangeEvent(this, key, value);
applicationContext.publishEvent(event);
}
}
// 配置变更事件
public class ConfigChangeEvent extends ApplicationEvent {
private final String configKey;
private final String configValue;
public ConfigChangeEvent(Object source, String configKey, String configValue) {
super(source);
this.configKey = configKey;
this.configValue = configValue;
}
// getter方法
public String getConfigKey() { return configKey; }
public String getConfigValue() { return configValue; }
}
// 配置变更监听器
@Component
public class ConfigChangeListener {
@EventListener
public void handleConfigChange(ConfigChangeEvent event) {
String key = event.getConfigKey();
String value = event.getConfigValue();
System.out.println("Config changed: " + key + " = " + value);
// 根据不同key执行不同逻辑
switch (key) {
case "app.feature.enabled":
handleFeatureToggle(value);
break;
case "app.timeout":
handleTimeoutChange(value);
break;
default:
break;
}
}
private void handleFeatureToggle(String value) {
boolean enabled = Boolean.parseBoolean(value);
System.out.println("Feature toggle: " + (enabled ? "enabled" : "disabled"));
}
private void handleTimeoutChange(String value) {
int timeout = Integer.parseInt(value);
System.out.println("Timeout changed to: " + timeout + "ms");
}
}
配置API控制器
@RestController
@RequestMapping("/api/config")
public class ConfigApiController {
@Autowired
private DynamicConfigManager configManager;
// 获取所有配置
@GetMapping
public Map<String, String> getAllConfigs() {
Map<String, String> configs = new HashMap<>();
configs.put("feature.enabled", configManager.getConfig("app.feature.enabled", "false"));
configs.put("timeout", configManager.getConfig("app.timeout", "5000"));
return configs;
}
// 更新配置
@PutMapping("/{key}")
public ApiResponse updateConfig(@PathVariable String key, @RequestBody ConfigUpdateRequest request) {
try {
configManager.updateConfig(key, request.getValue());
return ApiResponse.success("Config updated successfully");
} catch (Exception e) {
return ApiResponse.error("Failed to update config: " + e.getMessage());
}
}
// 批量更新配置
@PutMapping("/batch")
public ApiResponse batchUpdate(@RequestBody Map<String, String> configs) {
configs.forEach((key, value) -> {
configManager.updateConfig(key, value);
});
return ApiResponse.success("Batch config updated");
}
}
使用开源配置中心
Apollo配置中心集成
<!-- Maven依赖 -->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.9.1</version>
</dependency>
// 1. 配置类
@Configuration
@EnableApolloConfig
public class ApolloConfig {
@Value("${app.feature.enabled:false}")
private boolean featureEnabled;
// Apollo会自动刷新@Value注解的值
}
// 2. 监听配置变化
@Component
public class ConfigChangeMonitor {
@Autowired
private ConfigChangeListener listener;
@ApolloConfigChangeListener
private void onChange(ConfigChangeEvent changeEvent) {
for (String key : changeEvent.changedKeys()) {
ConfigChange change = changeEvent.getChange(key);
System.out.println(String.format(
"Config changed - key: %s, oldValue: %s, newValue: %s, changeType: %s",
key, change.getOldValue(), change.getNewValue(), change.getChangeType()
));
}
// 如果配置变化,刷新bean
listener.refreshConfig();
}
}
// 3. 测试使用
@Service
public class FeatureService {
@Autowired
private ApolloConfig apolloConfig;
public void executeFeature() {
if (apolloConfig.isFeatureEnabled()) {
// 新功能逻辑
System.out.println("Executing new feature");
} else {
// 旧功能逻辑
System.out.println("Executing old feature");
}
}
}
实战案例:动态线程池配置
@Component
public class DynamicThreadPoolManager {
private ThreadPoolExecutor executor;
@Value("${thread.pool.coreSize:10}")
private int corePoolSize;
@Value("${thread.pool.maxSize:20}")
private int maxPoolSize;
@Value("${thread.pool.queueCapacity:100}")
private int queueCapacity;
@Autowired
private DynamicConfigManager configManager;
@PostConstruct
public void init() {
// 初始化线程池
executor = new ThreadPoolExecutor(
corePoolSize,
maxPoolSize,
60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(queueCapacity),
new ThreadPoolExecutor.CallerRunsPolicy()
);
// 注册配置变更监听
configManager.registerConfigChangeListener("thread.pool.coreSize", this::updateCorePoolSize);
configManager.registerConfigChangeListener("thread.pool.maxSize", this::updateMaxPoolSize);
}
// 动态更新核心线程数
private void updateCorePoolSize(String value) {
int newSize = Integer.parseInt(value);
executor.setCorePoolSize(newSize);
System.out.println("Core pool size updated to: " + newSize);
}
// 动态更新最大线程数
private void updateMaxPoolSize(String value) {
int newSize = Integer.parseInt(value);
executor.setMaximumPoolSize(newSize);
System.out.println("Max pool size updated to: " + newSize);
}
// 提交任务
public Future<?> submit(Runnable task) {
return executor.submit(task);
}
// 获取线程池状态
public Map<String, Object> getPoolStatus() {
Map<String, Object> status = new HashMap<>();
status.put("corePoolSize", executor.getCorePoolSize());
status.put("maxPoolSize", executor.getMaximumPoolSize());
status.put("activeCount", executor.getActiveCount());
status.put("completedTaskCount", executor.getCompletedTaskCount());
status.put("queueSize", executor.getQueue().size());
return status;
}
}
实现Java动态配置的核心要点:
- 配置存储:选择文件、数据库或配置中心
- 配置刷新:支持动态刷新机制
- 缓存策略:使用本地缓存提升性能
- 事件通知:配置变更时通知相关组件
- 监控管理:提供配置查看和修改的API
根据项目规模选择合适方案:
- 小型项目:Spring Cloud Config
- 中型项目:数据库+缓存
- 大型项目:Apollo/Nacos等专业配置中心
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播