调用指定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 的配置文件中的值
4j
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);
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(YmlConfigUtil.applicationContext == null){
YmlConfigUtil.applicationContext = applicationContext;
}
}
}
这个就是具体调用实践了