调用指定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);//超时时间30sreferenceConfig.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 的配置文件中的值
4jpublic 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;}}}
这个就是具体调用实践了
