Springboot intègre Apollo pour surveiller et mettre à jour la dernière valeur en temps réel

Springboot intègre Apollo pour surveiller et mettre à jour la dernière valeur en temps réel

Avant-propos:

Apollo est un composant du centre de configuration open source de Ctrip. Lors de l'utilisation du centre de configuration Apollo, nous devons souvent écrire nous-mêmes le code des propriétés de mise à jour à chaud. Apollo fournit également des mises à jour à chaud, mais ne prend actuellement en charge que les mises à jour à chaud avec les annotations @Value, mais en quelques scénarios Ensuite, nous traitons tous les résultats obtenus par Apollo, comme l'encapsulation dans une collection ou un bean avant de l'utiliser, il y a donc un problème ici, c'est-à-dire que la configuration d'Apollo est mise à jour, mais le bean ou la collection encapsulée est pas à jour.

solution

Package dans une collection pour utiliser la mise à jour à chaud:

Première option:

Utilisez la propre mise à jour à chaud d'Apollo (@Value) configuration Apollo:

package com.lyj.demo;
import com.ctrip.framework.apollo.model.ConfigChange;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;

/**
 * @author 凌兮
 * @date 2020/8/18 14:48
 * 退货险国家配置获取(配置在Apollo中)
 */
@Component
@Data
@Slf4j
public class ReturnInsuranceCountryConfig {
    
    
    private static final String sKey = "s_insurance_country_config";
    private static final String rKey = "r_insurance_country_config";

    @Value("${" + sKey + ":''" + "}")
    private String sConfig;

    @Value("${" + rKey + ":''" + "}")
    private String rConfig;
    
}

Obtenez, divisez et encapsulez dans des collections si nécessaire:

alreadyConfigCountries = new ArrayList<>(Arrays.asList(returnInsuranceCountryConfig.getRConfig().split(",")));
alreadyConfigCountries = new ArrayList<>(Arrays.asList(returnInsuranceCountryConfig.getSConfig().split(",")));

Option II:

À l'aide de l'écouteur Apollo, écrivez un écouteur en temps réel pour les mises à jour de configuration

Configuration Apollo:

package com.lyj.demo;

import com.ctrip.framework.apollo.model.ConfigChange;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;

/**
 * @author 凌兮
 * @date 2020/8/18 14:48
 * 退货险国家配置获取(配置在Apollo中)
 */
@Component
@Data
@Slf4j
public class ReturnInsuranceCountryConfig implements InitializingBean{
    
    
    private static final String sKey = "s_insurance_country_config";
    private static final String rKey = "r_insurance_country_config";

    @Value("${" + sKey + ":''" + "}")
    private String sConfig;

    @Value("${" + rKey + ":''" + "}")
    private String rConfig;

    private List<String> sReturnInsuranceCountrys;

    private List<String> rReturnInsuranceCountrys;

    /**
     * 实时更新获取Apollo最新值
     * @Value:监听的表空间
     * @interestedKeys:监听的key
     * @param changeEvent Apollo配置变化事件
     */
    @ApolloConfigChangeListener(value = {
    
    "return_insurance_config"})
    private void onChange(ConfigChangeEvent changeEvent) {
    
    
        Set<String> changedKeys = changeEvent.changedKeys();
        log.info("changedKeys : {}", changedKeys.toString());
        for (String key : changedKeys) {
    
    
            log.info("key : {}, configValue : {}", key, changeEvent.getChange(key));
            ConfigChange change = changeEvent.getChange(key);
            if (key.equals("s_insurance_country_config")) {
    
    
                updateCountries(sReturnInsuranceCountrys, change.getNewValue());
            }
            if (key.equals("r_return_insurance_country_config")) {
    
    
                updateCountries(rReturnInsuranceCountrys, change.getNewValue());
            }
            log.info("key : {}, olderValue : {}, new Value : {}", key, change.getOldValue(), change.getNewValue());
        }
    }

    @Override
    public void afterPropertiesSet() throws Exception {
    
    
        sReturnInsuranceCountrys = new ArrayList<>(Arrays.asList(sConfig.split(",")));
        rReturnInsuranceCountrys = new ArrayList<>(Arrays.asList(rConfig.split(",")));
    }

    /**
     * 更新国家集合
     *
     * @param countries    源国家集合
     * @param newCountries 更新后的国家字符串集合
     */
    private void updateCountries(List<String> countries, String newCountries) {
    
    
        countries.clear();
        for(String country : newCountries.split(",")) {
    
    
            countries.add(country);
        }
    }
}

Obtenez-le directement là où vous en avez besoin:

@RequestMapping(value = "/test/returnInsurance")
public void returnInsuranceCountryTest() {
    
    
    log.info("returnInsuranceCountry : {}", returnInsuranceCountryConfig.getRConfig());
    log.info("returnInsuranceCountry : {}", returnInsuranceCountryConfig.getSConfig());
    System.out.println(returnInsuranceCountryConfig.getSReturnInsuranceCountrys());
    System.out.println(returnInsuranceCountryConfig.getRReturnInsuranceCountrys());
}

mise à jour à chaud de bean

Lien de référence spécifique: https://www.jianshu.com/p/7d91cb5109a4

https://github.com/flying632/ConfigRefresh/blob/master/PropertiesRefresher.java

https://juejin.im/post/6844904182118350862

Je suppose que tu aimes

Origine blog.csdn.net/qq_40093255/article/details/108507219
conseillé
Classement