vlambda博客
学习文章列表

调用指定IP上的Dubbo服务

前言

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


实践



Dubbo 获取接口的工具类

public class DubboUtils {
/** * 通过服务提供者ip获取dubbo 服务,不通过zookeeper * className provider 的class * ip provider * port provider */ public static <T> 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> T getDubboService(Class<?> className, String dubboUrl, String appName) { //消费者应用名 ApplicationConfig application = new ApplicationConfig(); application.setName(appName);
//获取服务 ReferenceConfig<T> referenceConfig = new ReferenceConfig<T>(); 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@Componentpublic 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; } }}


这个就是具体调用实践了