All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ijson.config.helper.ConfigZkResolver Maven / Gradle / Ivy

package com.ijson.config.helper;

import com.google.common.base.Charsets;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.ijson.config.api.IZkResolver;
import com.ijson.config.base.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;

import static com.ijson.config.base.ConfigConstants.ConfKeys.*;
import static com.ijson.config.base.ConfigConstants.*;

/**
 * @author *
 */
public class ConfigZkResolver extends ConfigurableZkResolver {

    public static final Logger log = LoggerFactory.getLogger(ConfigZkResolver.class);

    @Override
    protected void customSettings(ByteArrayOutputStream out) {
        Config appConfig = ConfigHelper.getApplicationConfig();
        String configUrl = appConfig.get(Ijson.CONFIG_URL);

        if (Strings.isNullOrEmpty(configUrl)) {
            configUrl = System.getProperty(Ijson.CONFIG_URL);
        }
        if (Strings.isNullOrEmpty(configUrl)) {
            configUrl = Ijson.CONFIG_URL;
        }
        String name = appConfig.get(PROCESS_PROFILE);
        if (!Strings.isNullOrEmpty(appConfig.get(ZK_SERVER_URL))) {
            configUrl = appConfig.get(ZK_SERVER_URL);
        }
        if (Strings.isNullOrEmpty(name)) {
            name = IN_ZOOKEEPER;
        }
        String s = configUrl + "?profile=" + appConfig.get(PROCESS_PROFILE, DEVELOP) + "&name=" + name;
        fetchContent(s, out);
    }

    private void fetchContent(String cmsUrl, ByteArrayOutputStream out) {
        HttpURLConnection connection = null;
        try {
            URL url = new URL(cmsUrl);
            connection = (HttpURLConnection) url.openConnection();
            connection.setConnectTimeout(3000);
            connection.setReadTimeout(5000);
            connection.connect();
            out.write('\n');

            try (InputStream in = connection.getInputStream()) {
                int ch = in.read();
                while (ch != -1) {
                    out.write(ch);
                    ch = in.read();
                }
            }
        } catch (MalformedURLException e) {
            log.error("cannot parse url={}  {}", cmsUrl, e);
        } catch (IOException e) {
            log.error("cannot load from url={}  {}", cmsUrl, e);
        } finally {
            log.info("load zookeeper settings from {}", cmsUrl);
            if (connection != null) {
                connection.disconnect();
            }
        }
    }


}

class ConfigurableZkResolver implements IZkResolver {


    public static final Logger log = LoggerFactory.getLogger(ConfigurableZkResolver.class);


    private boolean enable = false;
    private String servers;
    private String auth;
    private String authType;
    private String basePath;

    /**
     * 
    *
  • 从本地application-xxx.properties加载
  • *
  • 从autoconf/cms-zookeeper加载
  • *
  • 从环境变量加载
  • *
*/ @Override public void resolve() { Config app = ConfigHelper.getApplicationConfig(); if (app.getBool(CONFIG_ENABLE_ZOOKEEPER, false)) { ByteArrayOutputStream out = new ByteArrayOutputStream(); // 复制本地配置 try { out.write(app.getContent()); } catch (IOException e) { log.error("cannot clone from appConfig ", e); } // 从本地配置 autoconf/cms-zookeeper中加载配置 appendAutoConfig(out); // 自定义加载配置 customSettings(out); // 再把环境变量的设置导入进来覆盖 appendEnvironments(out); Config config = new Config(); config.copyOf(out.toByteArray()); servers = config.get(ZOOKEEPER_SERVERS); if (Strings.isNullOrEmpty(servers)) { enable = false; return; } auth = config.get(ZOOKEEPER_AUTHENTICATION); authType = config.get(ZOOKEEPER_AUTHENTICATION_TYPE); basePath = config.get(ZOOKEEPER_BASE_PATH, "/in/config"); } } private void appendEnvironments(ByteArrayOutputStream out) { List keys = Lists.newArrayList(CONFIG_ENABLE_ZOOKEEPER, ZOOKEEPER_SERVERS, ZOOKEEPER_AUTHENTICATION, ZOOKEEPER_AUTHENTICATION_TYPE, ZOOKEEPER_BASE_PATH); for (String i : keys) { try { append(out, System.getProperty(i)); } catch (IOException e) { log.error("cannot append {} {}", i, e); } } } private void appendAutoConfig(ByteArrayOutputStream out) { Path cmsConfig = ConfigHelper.getConfigPath().resolve(IN_ZOOKEEPER); if (cmsConfig.toFile().exists()) { out.write('\n'); try { Files.copy(cmsConfig, out); } catch (IOException e) { log.error("cannot load from {} {}", cmsConfig, e); } } } /** * 可以继承并实现自定义的设置 * * @param out 将自定义的配置写入此输出流 */ protected void customSettings(ByteArrayOutputStream out) { } protected void append(OutputStream out, String s) throws IOException { if (s != null) { out.write('\n'); out.write(s.getBytes(Charsets.UTF_8)); } } @Override public boolean isEnable() { return this.enable; } @Override public String getServer() { return this.servers; } @Override public String getAuth() { return this.auth; } @Override public String getAuthType() { return this.authType; } @Override public String getBasePath() { return this.basePath; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy