dubbo ServiceNameMapping 源码

  • 2022-10-20
  • 浏览 (357)

dubbo ServiceNameMapping 代码

文件路径:/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/ServiceNameMapping.java

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.dubbo.metadata;

import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.SPI;
import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.rpc.model.ScopeModel;
import org.apache.dubbo.rpc.model.ScopeModelUtil;
import org.apache.dubbo.rpc.service.Destroyable;

import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import static java.util.Collections.emptySet;
import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR;
import static org.apache.dubbo.common.extension.ExtensionScope.APPLICATION;

/**
 * This will interact with remote metadata center to find the interface-app mapping and will cache the data locally.
 *
 * Call variants of getCachedMapping() methods whenever need to use the mapping data.
 */
@SPI(value = "metadata", scope = APPLICATION)
public interface ServiceNameMapping extends Destroyable {

    String DEFAULT_MAPPING_GROUP = "mapping";

    /**
     * Map the specified Dubbo service interface, group, version and protocol to current Dubbo service name
     */
    boolean map(URL url);

    /**
     * Get the default extension of {@link ServiceNameMapping}
     *
     * @return non-null {@link ServiceNameMapping}
     */
    static ServiceNameMapping getDefaultExtension(ScopeModel scopeModel) {
        return ScopeModelUtil.getApplicationModel(scopeModel).getDefaultExtension(ServiceNameMapping.class);
    }

    static String buildMappingKey(URL url) {
        return buildGroup(url.getServiceInterface());
    }

    static String buildGroup(String serviceInterface) {
        //the issue : https://github.com/apache/dubbo/issues/4671
//        return DEFAULT_MAPPING_GROUP + SLASH + serviceInterface;
        return serviceInterface;
    }

    static String toStringKeys(Set<String> serviceNames) {
        if (CollectionUtils.isEmpty(serviceNames)) {
            return "";
        }

        StringBuilder builder = new StringBuilder();
        for (String n : serviceNames) {
            builder.append(n);
            builder.append(COMMA_SEPARATOR);
        }

        builder.deleteCharAt(builder.length() - 1);
        return builder.toString();
    }

    static Set<String> getAppNames(String content) {
        if (StringUtils.isBlank(content)) {
            return emptySet();
        }
        return new TreeSet<>(Arrays.asList(content.split(COMMA_SEPARATOR)));
    }

    /**
     * Init mapping from local storage and url parameter.
     *
     * @return app list the current interface maps to, in sequence determined by:
     * 1. PROVIDED_BY specified by user
     * 2. snapshot in local file
     */
    void initInterfaceAppMapping(URL subscribedURL);

    /**
     * Get the latest mapping result from remote center and register listener at the same time to get notified once mapping changes.
     *
     * @param listener listener that will be notified on mapping change
     * @return the latest mapping result from remote center
     */
    Set<String> getAndListen(URL registryURL, URL subscribedURL, MappingListener listener);

    MappingListener stopListen(URL subscribeURL, MappingListener listener);

    void putCachedMapping(String serviceKey, Set<String> apps);

    Set<String> getCachedMapping(String mappingKey);

    Set<String> getCachedMapping(URL consumerURL);

    Set<String> getRemoteMapping(URL consumerURL);

    Map<String, Set<String>> getCachedMapping();

    Set<String> removeCachedMapping(String serviceKey);
}

相关信息

dubbo 源码目录

相关文章

dubbo AbstractCacheManager 源码

dubbo AbstractServiceNameMapping 源码

dubbo DefaultMetadataParamsFilter 源码

dubbo InstanceMetadataChangedListener 源码

dubbo MappingCacheManager 源码

dubbo MappingChangedEvent 源码

dubbo MappingListener 源码

dubbo MetadataConstants 源码

dubbo MetadataInfo 源码

dubbo MetadataParamsFilter 源码

0  赞