Dubbo 调用指定IP上的Dubbo服务

前言

我们在使用dubbo 调用某个服务的时候,可能涉及到该服务在多台机器上面部署。但是由于一些特殊原因有时候需要调用指定IP上面的服务。

实践

dubbo 调用服务的时候,都是根据zookeeper 上面注册的dubbo 接口,根据在zookeeper 上面获取的注册地址,将其封装为invoker 。调用的时候根据dubbo 动态均衡的策略选择其中一个invoker 进行调用。invoker 调用主要是根据url 拼接为proxy 进行调用,我们就可以通过url 直接对url 进行拼接进行代理调用。

Dubbo 获取接口的工具类

public class DubboUtils {

    /**
     * 通过服务提供者ip获取dubbo 服务,不通过zookeeper
     * className provider 的class
     * ip provider
     * port provider
     */
    public static  T getDubboService(Class className, String ip,Integer port) {
        String appName = YmlConfigUtil.getConfigByKey("dubbo.application.name");
        return getDubboService(className, String.format("dubbo://%s:%s", ip, port), appName);

    }


    /**
     * 通过服务提供者ip获取dubbo 服务,不通过zookeeper
     * * className provider 的class
     *      * ip provider
     *      * port provider
     *      appName  是dubbo 消费方的应用名
     */
    public static  T getDubboService(Class className, String dubboUrl, String appName) {
        //消费者应用名
        ApplicationConfig application = new ApplicationConfig();
        application.setName(appName);

        //获取服务
        ReferenceConfig referenceConfig = new ReferenceConfig();
        referenceConfig.setApplication(application);
        referenceConfig.setInterface(className);
        referenceConfig.setUrl(dubboUrl);
        //超时时间30s
        referenceConfig.setTimeout(30 * 1000);
        //仅仅调用一次
        referenceConfig.setRetries(0);
        //看自己应用配置中配置
        String dubboVersion = YmlConfigUtil.getConfigByKey("dubbo.service.version");
        if(!StringUtils.isEmpty(dubboVersion)){
            referenceConfig.setVersion(dubboVersion);
        }
        //一般服务消费者和提供者 是一样的,但服务消费者上面不一定配置了 这里直接用dubbo 消费者分组来替代
        String dubboGroup = YmlConfigUtil.getConfigByKey("dubbo.consumer.group");
        if(!StringUtils.isEmpty(dubboGroup)){
            referenceConfig.setGroup(dubboGroup);
        }

        ReferenceConfigCache cache = ReferenceConfigCache.getCache(dubboUrl);
        return cache.get(referenceConfig);
        
    }
}

依赖的一个工具类,主要为了获取springboot 中yaml 的配置文件中的值

@Slf4j
@Component
public class YmlConfigUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext = null;

    private static Environment environment;

    public YmlConfigUtil() {
    }

    public static String getConfigByKey(String key) {
        if (environment ==null){
            YmlConfigUtil.environment = applicationContext.getBean(Environment.class);
        }
        return environment.getProperty(key);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if(YmlConfigUtil.applicationContext == null){
            YmlConfigUtil.applicationContext  = applicationContext;
        }
    }
}

这个就是具体调用实践了
在这里插入图片描述

你可能感兴趣的:(java,dubbo,tcp/ip,java-zookeeper,运维,java)