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:\Users\Administrator,当然可以用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®ister.ip=192.168.0.232&side=consumer×tamp=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" />