zoukankan      html  css  js  c++  java
  • dubbo直连提供者 & 只订阅 & 只注册

    1.    dubbo直连提供者

      在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直连方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获取列表为了避免复杂化线上环境,不要在线上使用这个功能,只应在测试阶段使用。

    其配置方式有如下三种:

    1.     通过xml配置

    点对点,可在 <dubbo:reference> 中配置 url 指向提供者,将绕过注册中心,多个地址用分号隔开,配置如下

        <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
        <dubbo:reference id="dubboService" interface="dubbo.DubboService"
            url="dubbo://localhost:20880" />

    2.通过 -D 参数指定

    在 JVM 启动参数中加入-D参数映射服务地址,如:

    java -Ddubbo.DubboService=dubbo://localhost:20880

    3. 通过文件映射

    如果服务比较多,也可以用文件映射,用 -Ddubbo.resolve.file 指定映射文件路径,此配置优先级高于 <dubbo:reference> 中的配置,如:

    java -Ddubbo.resolve.file=xxx.properties

    然后在映射文件 xxx.properties 中加入配置,其中 key 为服务名,value 为服务提供者 URL:

    dubbo.DubboService=dubbo://localhost:20880

    注意:

     1.0.15 及以上版本支持,2.0 以上版本自动加载 ${user.home}/dubbo-resolve.properties文件,不需要配置 

    ${user.home}指的是当前操作系统用户目录,如 Windows系统 Administrator的用户目录就是 C:UsersAdministrator,当然可以用git工具查看

    Administrator@MicroWin10-1535 MINGW64 ~/Desktop
    $ cd ~
    
    Administrator@MicroWin10-1535 MINGW64 ~
    $ pwd
    /c/Users/Administrator

    测试方法如下:

    dubbo-resolve.properties内容:

    dubbo.DubboService=dubbo://localhost:20880

     consumer.xml内容如下:

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
        <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
        <dubbo:application name="consumer-of-helloworld-app">
            <!-- 关闭QOS:Quality of Service -->
            <dubbo:parameter key="qos.enable" value="false" />
        </dubbo:application>
    
        <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
        <dubbo:reference id="dubboService" interface="dubbo.DubboService" />
    </beans>

     消费者代码:

    package dubbo;
    
    import java.util.concurrent.CountDownLatch;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Consumer {
        public static void main(String[] args) throws InterruptedException {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "consumer.xml" });
            context.start();
            for (int i = 0; i < 2; i++) {
                DubboService service = (DubboService) context.getBean("dubboService");
                System.out.println(service.sayHello(" china "));
            }
    
            CountDownLatch countDownLatch = new CountDownLatch(1);
            countDownLatch.await();
        }
    }

     2. dubbo 只订阅(也就是只获取服务不发布服务)

      为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。

      可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务

         

    禁用注册配置:

    <dubbo:registry address="10.20.153.10:9090" register="false" />

    或者:

    <dubbo:registry address="10.20.153.10:9090?register=false" />

    例如:

    provider.xml(只订阅,不注册服务)

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
        <!-- 提供方应用信息,用于计算依赖关系 -->
        <dubbo:application name="hello-world-app">
            <!-- 关闭QOS:Quality of Service -->
            <dubbo:parameter key="qos.enable" value="false" />
            <dubbo:parameter key="qos.accept.foreign.ip" value="true" />
            <dubbo:parameter key="qos.port" value="2222" />
        </dubbo:application>
    
        <dubbo:registry address="zookeeper://127.0.0.1:2181" register="false"/>
    
        <!-- 用dubbo协议在20880端口暴露服务 -->
        <dubbo:protocol name="dubbo" port="20880" />
    
        <!-- 声明需要暴露的服务接口 -->
        <dubbo:service interface="dubbo.DubboService" ref="demoService"
            timeout="50000" />
    
        <!-- 和本地bean一样实现服务 -->
        <bean id="demoService" class="dubbo.DubboServiceImpl"  />
    </beans>

     consumer.xml

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
        <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
        <dubbo:application name="consumer-of-helloworld-app">
            <!-- 关闭QOS:Quality of Service -->
            <dubbo:parameter key="qos.enable" value="false" />
        </dubbo:application>
    
        <!-- 使用multicast广播注册中心暴露发现服务地址 -->
        <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    
        <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
        <dubbo:reference id="dubboService" interface="dubbo.DubboService" />
    </beans>

    消费者代码如下:

    package dubbo;
    
    import java.util.concurrent.CountDownLatch;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Consumer {
        public static void main(String[] args) throws InterruptedException {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "consumer.xml" });
            context.start();
            for (int i = 0; i < 2; i++) {
                DubboService service = (DubboService) context.getBean("dubboService");
                System.out.println(service.sayHello(" china "));
            }
    
            CountDownLatch countDownLatch = new CountDownLatch(1);
            countDownLatch.await();
        }
    }

    直接运行会报错如下:

    Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dubboService': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: Failed to check the status of the service dubbo.DubboService. No provider available for the service dubbo.DubboService from the url zookeeper://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=consumer-of-helloworld-app&dubbo=2.0.2&interface=dubbo.DubboService&methods=sayHello&pid=13640&qos.enable=false&register.ip=192.168.0.232&side=consumer&timestamp=1554363548873 to the consumer 192.168.0.232 use dubbo version 2.6.6
    通过管理界面查看也没有服务:

     修改上面consumer.xml通过直连提供者即可:

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
        <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
        <dubbo:application name="consumer-of-helloworld-app">
            <!-- 关闭QOS:Quality of Service -->
            <dubbo:parameter key="qos.enable" value="false" />
        </dubbo:application>
    
        <!-- 使用multicast广播注册中心暴露发现服务地址 -->
        <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    
        <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
        <dubbo:reference id="dubboService" interface="dubbo.DubboService"
            url="dubbo://localhost:20880" />
    </beans>

    3.只注册(也就是只发布服务不获取服务)

      如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务。这个时候,可以让服务提供者方只注册服务到另一注册中心,而不从另一注册中心订阅服务。

    禁用订阅配置:

    <dubbo:registry id="hzRegistry" address="10.20.153.10:9090" />
    <dubbo:registry id="qdRegistry" address="10.20.141.150:9090" subscribe="false" />

    或者:

    <dubbo:registry id="hzRegistry" address="10.20.153.10:9090" />
    <dubbo:registry id="qdRegistry" address="10.20.141.150:9090?subscribe=false" />

    测试方法如下:

    provider.xml还是上面的配置,发布以及注册服务均可以

    修改consumer.xml,只注册不订阅,如下:

    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
        <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
        <dubbo:application name="consumer-of-helloworld-app">
            <!-- 关闭QOS:Quality of Service -->
            <dubbo:parameter key="qos.enable" value="false" />
        </dubbo:application>
    
        <!-- 使用multicast广播注册中心暴露发现服务地址 -->
        <dubbo:registry address="zookeeper://127.0.0.1:2181"
            subscribe="false" />
    
        <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
        <dubbo:reference id="dubboService" interface="dubbo.DubboService" />
    </beans>

    消费者运行报错如下:

    Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dubboService': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: No such any registry to reference dubbo.DubboService on the consumer 192.168.0.232 use dubbo version 2.6.6, please config <dubbo:registry address="..." /> to your spring config.
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:177)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:103)

    去掉上面  consumer.xml  的  subscribe="false"  的限制即可

        <!-- 使用multicast广播注册中心暴露发现服务地址 -->
        <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    或者:直连提供者:

        <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
        <dubbo:reference id="dubboService" interface="dubbo.DubboService"
            url="dubbo://localhost:20880" />
  • 相关阅读:
    一个拖延症晚期患者的锦囊妙计
    阔别三十天后每天一博客卷土重来——互联网时代的个体户(上)
    阔别三十天后每天一博客卷土重来——互动交流新思路(下)
    阔别三十天后每天一博客卷土重来——互动交流新思路(中)
    阔别三十天后每天一博客卷土重来——互动交流新思路(上)
    渣渣小本求职复习之路每天一博客系列——想想大学里最后半年该怎么过(最终篇)
    渣渣小本求职复习之路每天一博客系列——回顾走过的四个礼拜
    渣渣小本求职复习之路每天一博客系列——Unix&Linux入门(5)
    渣渣小本求职复习之路每天一博客系列——Unix&Linux入门(4)
    渣渣小本求职复习之路每天一博客系列——Unix&Linux入门(3)
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/10655098.html
Copyright © 2011-2022 走看看