001/** 002 * Copyright (c) 2015-2022, Michael Yang 杨福海 (fuhai999@gmail.com). 003 * <p> 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * <p> 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * <p> 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package io.jboot.app.config.support.apollo; 017 018import com.ctrip.framework.apollo.Config; 019import com.ctrip.framework.apollo.ConfigService; 020import com.ctrip.framework.apollo.enums.PropertyChangeType; 021import com.ctrip.framework.apollo.model.ConfigChange; 022import io.jboot.app.config.JbootConfigKit; 023import io.jboot.app.config.JbootConfigManager; 024 025import java.util.HashMap; 026import java.util.Map; 027import java.util.Set; 028 029 030/** 031 * @author michael yang (fuhai999@gmail.com) 032 * @Date: 2020/2/8 033 */ 034public class ApolloConfigManager { 035 036 private static final ApolloConfigManager ME = new ApolloConfigManager(); 037 038 public static ApolloConfigManager me() { 039 return ME; 040 } 041 042 public void init(JbootConfigManager configManager) { 043 044 ApolloServerConfig apolloServerConfig = configManager.get(ApolloServerConfig.class); 045 if (!apolloServerConfig.isEnable() || !apolloServerConfig.isConfigOk()) { 046 return; 047 } 048 049 //apollo 配置 050 System.setProperty("app.id", apolloServerConfig.getAppId()); 051 System.setProperty("apollo.meta", apolloServerConfig.getMeta()); 052 053 054 Config config = getDefaultConfig(configManager); 055 056 Set<String> propNames = config.getPropertyNames(); 057 if (propNames != null && !propNames.isEmpty()) { 058 Map properties = new HashMap(); 059 for (String name : propNames) { 060 String value = config.getProperty(name, null); 061 properties.put(name,value); 062 } 063 configManager.setRemoteProperties(properties); 064 } 065 066 config.addChangeListener(changeEvent -> { 067 for (String key : changeEvent.changedKeys()) { 068 ConfigChange change = changeEvent.getChange(key); 069 if (change.getChangeType() == PropertyChangeType.DELETED) { 070 configManager.removeRemoteProperty(change.getPropertyName()); 071 } else { 072 configManager.setRemoteProperty(change.getPropertyName(), change.getNewValue()); 073 } 074 configManager.notifyChangeListeners(change.getPropertyName(), change.getNewValue(), change.getOldValue()); 075 } 076 }); 077 078 079 } 080 081 private Config getDefaultConfig(JbootConfigManager configManager) { 082 ApolloServerConfig apolloServerConfig = configManager.get(ApolloServerConfig.class); 083 if (JbootConfigKit.isNotBlank(apolloServerConfig.getNamespace())) { 084 return ConfigService.getConfig(apolloServerConfig.getNamespace()); 085 } else { 086 return ConfigService.getAppConfig(); 087 } 088 } 089}