1、参考
Provider直连:http://dubbo.apache.org/en-us/docs/user/demos/explicit-target.html
只定阅:http://dubbo.apache.org/zh-cn/docs/user/demos/subscribe-only.html
静态服务:http://dubbo.apache.org/zh-cn/docs/user/demos/static-service.html
本文涉及的内容大多与开发、测试相关,这些功能会为Dubbo应用的开发、测试带来便利。
2、Provider直连
正常情况下,Provider端需要向Registry注册服务,Consumer端需要从Registry定阅服务。并且Consumer端持续监听Registry,当Provider提供的服务有变化时,Consumer端能够及时发现这种变动。并且Consumer端会将同一接口的多个服务实例组成一个Cluster,基于此Cluster实现容错、负载均衡、路由等功能,基本上需要借助Registry实现服务治理功能。
但是有时候,比如在开发或者测试环境下,只是打算在Consumer端调用一下Provider码的代码,测试一下功能,不需要关心Registry提供的这种服务治理功能,这个时候可以绕过Registry,Consumer端直接连接某个Provider。并且这种直连功能是以接口为单位的,假如Consumer端调用接口A与B,如果为A接口配置了直连,则B接口是不受影响的,后者还是会从Registry取得Provider信息,还是会组成Cluster。
一般都是使用XML配置方法,就是最后一个,示例如下:
<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" />
3、只定阅
一个服务,可能依赖于系统中的其它很多服务。在开发、测试阶段,Provider可以只向系统定阅自己依赖的服务,而不会把自己的服务注册进Registry。如果想访问这种只定阅的服务,Consumer端可通过上边说的直连的方式访问。只定阅服务是正常运行的,只不过是没有注册而已。
这个图并没有体现开发中的Provider绕过了注册,却没有体现出它可以定阅其它服务。
只定阅以Provider为单位(直连以接口为单位),主要是配置Registry,如下:
<dubbo:registry address="10.20.153.10:9090" register="false" />
或者:
<dubbo:registry address="10.20.153.10:9090?register=false" />
意思就是本Provider只向Registry定阅服务,不向它注册服务。
3、静态服务
一般情况下,服务总是在启动的时候向Registry注册,并且双方之间建立长连接,Registry通过心跳检测服务是否在线,如果连接断或者心跳检测不到,那么就相当于解除注册了。
有时候需要手动控制服务的上线与下线,这个时候就可以使用静态服务了,它也是围绕着Registry展开的。服务正常启动,但它不自动向Registry注册,同样,如果服务关停,它也不会自动告诉Registry解除注册。配置如下:
<dubbo:registry address="10.20.141.150:9090" dynamic="false" />
或者:
<dubbo:registry address="10.20.141.150:9090?dynamic=false" />
我猜测,静态服务与Registry这间应该不会建立长连接,双方不会维持心跳。
默认Dubbo的Provider会启动一个telnet的监听端口,可通过向此端口发送指令命令服务主动向Registry注册,或者是向Registry发送指令强制解除注册,一般通过脚本或者页面进行。
另外,有时候不需要在配置文件中明确设置Registry地十,例如对于已经启动的每三方Memcached服务,可通过写如下代码主动完成注册:
RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("memcached://10.20.153.11/com.foo.BarService?category=providers&dynamic=false&application=foo"));
总之,静态服务就是通过人式的形式完成服务的注册与解除注册。