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.components.gateway.discovery;
017
018
019import io.jboot.Jboot;
020import io.jboot.utils.ConfigUtil;
021import io.jboot.core.spi.JbootSpiLoader;
022import io.jboot.utils.NetUtil;
023
024import java.util.Map;
025
026public class GatewayDiscoveryManager {
027
028    private static GatewayDiscoveryManager manager = new GatewayDiscoveryManager();
029
030    private GatewayDiscoveryManager() {
031    }
032
033    public static GatewayDiscoveryManager me() {
034        return manager;
035    }
036
037    private GatewayDiscoveryConfig discoveryConfig;
038    private GatewayDiscovery gatewayDiscovery;
039    private boolean isInited = false;
040
041
042    public void init() {
043        discoveryConfig = Jboot.config(GatewayDiscoveryConfig.class);
044
045        gatewayDiscovery = createDiscovery(discoveryConfig);
046
047        exportLocalInstance(gatewayDiscovery);
048
049        isInited = true;
050    }
051
052    /**
053     * 暴露本地的示例到 nacos 等服务注册中心
054     *
055     * @param gatewayDiscovery
056     */
057    private void exportLocalInstance(GatewayDiscovery gatewayDiscovery) {
058        if (gatewayDiscovery == null) {
059            return;
060        }
061
062        Map<String, GatewayInstanceConfig> instanceConfigMap = ConfigUtil.getConfigModels(GatewayInstanceConfig.class, "jboot.gateway.instance");
063        for (GatewayInstanceConfig instanceConfig : instanceConfigMap.values()) {
064
065            GatewayInstance instance = new GatewayInstance();
066            instance.setHealthy(true);
067            instance.setServiceName(instanceConfig.getName());
068            instance.setUri(instanceConfig.toUri());
069
070            instance.setHost(NetUtil.getLocalIpAddress());
071            instance.setPort(Integer.parseInt(Jboot.configValue("undertow.port", "8080")));
072
073            gatewayDiscovery.registerInstance(instance);
074        }
075    }
076
077    public GatewayDiscovery getGatewayDiscovery() {
078        if (!isInited){
079            init();
080        }
081        return gatewayDiscovery;
082    }
083
084    public GatewayDiscoveryConfig getDiscoveryConfig() {
085        return discoveryConfig;
086    }
087
088    public GatewayDiscovery createDiscovery(GatewayDiscoveryConfig config) {
089        if (config == null || !config.isConfigOk() || !config.isEnable()) {
090            return null;
091        }
092
093        switch (config.getType()) {
094            case GatewayDiscoveryConfig.TYPE_NACOS:
095                return new NacosGatewayDiscovery();
096            default:
097                return JbootSpiLoader.load(GatewayDiscovery.class, config.getType());
098        }
099    }
100
101
102}
103
104
105
106
107
108