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

com.github.df.restypass.lb.server.ConfigurableServerContext Maven / Gradle / Ivy

There is a newer version: 1.5.1
Show newest version
package com.github.df.restypass.lb.server;

import com.github.df.restypass.util.StreamTools;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.yaml.snakeyaml.Yaml;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

/**
 * 配置化
 * 服务容器
 * Created by darrenfu on 17-6-28.
 */
@Slf4j
public class ConfigurableServerContext implements ServerContext {

    public static final String CONFIG_FILE_NAME = "resty-server.yaml";

    private Map> instanceMap;

    public ConfigurableServerContext() {
        this.instanceMap = new ConcurrentHashMap<>();
        loadServerFromConfigFile();
    }

    /**
     * 加载配置文件
     */
    private void loadServerFromConfigFile() {
        InputStream inputStream = parseYamlFile(CONFIG_FILE_NAME, true);
        Yaml yaml = new Yaml();
        YamlServerConfig config = yaml.loadAs(inputStream, YamlServerConfig.class);

        List servers = config.servers;
        for (YamlServerList server : servers) {
            for (ServerInstance instance : server.getInstances()) {
                instance.setServiceName(server.getServiceName());
                instance.initProps();
            }
            instanceMap.put(server.getServiceName(), server.getInstances());
        }
        log.info("成功加载server的配置文件:{},Server:{}", CONFIG_FILE_NAME, instanceMap);
    }


    private InputStream parseYamlFile(String file, boolean required) {

        List cls = new ArrayList<>();

        ClassLoader cl = Thread.currentThread().getContextClassLoader();
        if (cl != null) {
            cls.add(cl);
        }
        cl = getClass().getClassLoader();
        if (cl != null) {
            cls.add(cl);
        }
        cl = ClassLoader.getSystemClassLoader();
        if (cl != null) {
            cls.add(cl);
        }

        InputStream is = null;
        for (ClassLoader classLoader : cls) {
            is = classLoader.getResourceAsStream(file);
            if (is != null) {
                break;
            }
        }

        if (is != null) {
            return is;
        } else if (required) {
            throw new IllegalArgumentException("Can't locate config file " + file);
        }
        return null;
    }

    @Override
    public List getAllServiceName() {
        return instanceMap.keySet().stream().collect(Collectors.toList());
    }

    @Override
    public List getAllServerList() {
        return getServer(null);
    }

    @Override
    public List getServerList(String serviceName) {
        return getServer(serviceName);
    }

    private List getServer(String serviceName) {
        List instances = new LinkedList<>();
        if (StringUtils.isEmpty(serviceName)) {
            instanceMap.forEach((k, v) -> instances.addAll(v));
            return instances;
        }
        return instanceMap.get(serviceName);
    }

    @Override
    public void refreshServerList() {
        loadServerFromConfigFile();
    }

    @Override
    public void refreshServerList(String serviceName) {
        loadServerFromConfigFile();
    }

    @Override
    public List setServerList(List instanceList) {
        instanceList.forEach(ServerInstance::initProps);
        this.instanceMap = StreamTools.groupBy(instanceList, ServerInstance::getServiceName);
        return instanceList;
    }

    @Override
    public List addServerList(List instanceList) {

        instanceList.forEach(ServerInstance::initProps);
        Map> map = StreamTools.groupBy(instanceList, ServerInstance::getServiceName);


        this.instanceMap.forEach((k, v) -> {
            if (map.containsKey(k)) {
                v.addAll(map.get(k));
            }
        });

        return getAllServerList();
    }


    @Data
    public static class YamlServerConfig {
        private List servers;
    }

    @Data
    public static class YamlServerList {
        private List instances;
        private String serviceName;
    }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy