Dubbo的Provider直连、只定阅、静态服务(三)

本文介绍了Dubbo中Provider的直连、只定阅和静态服务三种模式。直连模式下,Consumer直接连接特定Provider,跳过Registry,适用于开发和测试。只定阅模式下,Provider仅订阅依赖服务而不注册自身,可通过直连访问。静态服务允许手动控制服务的上线与下线,不依赖心跳机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。

/user-guide/images/dubbo-directly.jpg

一般都是使用XML配置方法,就是最后一个,示例如下:

<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" />

3、只定阅

一个服务,可能依赖于系统中的其它很多服务。在开发、测试阶段,Provider可以只向系统定阅自己依赖的服务,而不会把自己的服务注册进Registry。如果想访问这种只定阅的服务,Consumer端可通过上边说的直连的方式访问。只定阅服务是正常运行的,只不过是没有注册而已。

/user-guide/images/subscribe-only.jpg

这个图并没有体现开发中的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"));

总之,静态服务就是通过人式的形式完成服务的注册与解除注册。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值