一、dynamic动态注册
dynamic
服务是否动态注册,如果设为false,注册后将显示为disable状态,需人工启用,并且服务提供者停止时,也不会自动取消注册,需人工禁用。
@Service注解
org.apache.dubbo.config.annotation.Service
dubbo2.7.2以前
boolean dynamic() default false;
dubbo2.7.2及2.7.2以后
boolean dynamic() default true;
image.png
dynamic在service上的默认值变了
image.png
参考官方文档:XML配置 dubbo:service
当把dynamic=false配置到registry和provider上时
按照dubbo配置生效规则 :
- 方法级优先,接口级次之,全局配置再次之。
- 如果级别一样,则消费方优先,提供方次之。
所以dynamic并没有生效,想要生效必须配置在service上
@Slf4j
@Service(dynamic = false, version = "1.0.0")
public class UserAuthServiceImpl implements UserAuthService
但是dynamic参数并不会产生禁用dubbo提供者的效果
dynamic=false提供者启动时,服务同样会被注册到zookeeper。消费者也会调用到相对应的服务。
当提供者停止后,dynamic=true的服务的连接在zookeeper上会消失,但是dynamic=false的服务的连接还会保存在zookeeper上,不会消失。
dynamic关键字只是控制dubbo提供者停止后,zk上这些节点消不消失,并不是控制服务可不可以访问。
二、依赖dubbo-admin的动态配置去实现禁用dubbo提供者
由于ip是动态的,采用application name的方式
以user-center-provider为例
1、给提供者的dubbo取一个新的名字
dubbo:
application:
id: user-center-provider-mc
name: user-center-provider-mc
2、在dubbo-admin上添加动态配置规则
image.png# 将应用user-center-provider-mc(user-center-provider-mc)在20880端口上提供(side:provider)的所有服务(scope:application)都禁用。
configVersion: v2.7
enabled: true
scope: application
key: user-center-provider-mc
configs: # dynamic config parameter
- side: provider # effective side, consumer or addresses
addresses:
- '0.0.0.0:20880' # 0.0.0.0 for all addresses
parameters:
disabled: true
timeout: 6000
- configVersion 表示 dubbo 的版本
- scope表示配置作用范围,分别是应用(application)或服务(service)粒度。必填。
- key 指定规则体作用在哪个服务或应用。必填。
- scope=service时,key取值为[{group}:]{service}[:{version}]的组合
- scope=application时,key取值为application名称
- enabled=true 覆盖规则是否生效,可不填,缺省生效。
- configs 定义具体的覆盖规则内容,可以指定n(n>=1)个规则体。必填。
- side,
- applications
- services
- parameters
- addresses
- providerAddresses
参考官方文档:配置规则
3、启用被禁用的提供者服务
image.pngimage.png
# 将应用user-center-provider-mc(user-center-provider-mc)在20880端口上提供(side:provider)的所有服务(scope:application)都启用。
configVersion: v2.7
enabled: true
scope: application
key: user-center-provider-mc
configs: # dynamic config parameter
- side: provider # effective side, consumer or addresses
addresses:
- '0.0.0.0:20880' # 0.0.0.0 for all addresses
parameters:
disabled: false
timeout: 6000
提前取好name、配置好动态规则,再去部署提供者就可禁用dubbo服务。
但是dubbo-admin只有先部署服务才能配置规则
image.png
三、dubbo自定义参数配合dubbo-admin实现禁用dubbo提供者
参考官方文档:XML配置 dubbo:parameter
1、dubbo进行配置
dubbo:
provider:
parameters:
disabled: true
2、部署服务
取新的applicaton name 和不取新applicaton name,结合下面【3、dubbo-admin动态配置】选择一种
dubbo:
application:
id: user-center-provider
name: user-center-provider
3、dubbo-admin动态配置,启用提供者
动态配置分两种,取新的applicaton name 和不取applicaton name
3.1 取新的applicaton name
image.png# 将应用user-center-provider-m1(user-center-provider-mc)在20880端口上提供(side:provider)的所有服务(scope:application)都启用。
configVersion: v2.7
enabled: true
scope: application
key: user-center-provider-m1
configs: # dynamic config parameter
- side: provider # effective side, consumer or addresses
addresses:
- '0.0.0.0:20880' # 0.0.0.0 for all addresses
parameters:
disabled: false
timeout: 6000
3.2 不取新的applicaton name
限制的地址需要修改
image.png
# 将应用user-center-provider-m1(user-center-provider-mc)在20880端口上提供(side:provider)的所有服务(scope:application)都启用。
configVersion: v2.7
enabled: true
scope: application
key: user-center-provider-m1
configs: # dynamic config parameter
- side: provider # effective side, consumer or addresses
addresses:
- '192.168.0.10:20880' # 0.0.0.0 for all addresses
parameters:
disabled: false
timeout: 6000
四、通过修改权重,实现禁用dubbo提供者
修改权重weight
dubbo:
provider:
weight: 0
经过测试的用例:
3节点: 2个节点权重100,1 个节点权重0 ,权重0的不可以访问
3节点:3个节点权重都是0,都可以访问
2节点: 2个节点权重都是0,都可以访问
2节点:1个节点权重100 ,1个节点权重0 ,权重0的不可以访问
例如:
user-center-provider 老节点的权重默认100,节点为A和B。
更改apollo配置weight=0,启动服务创建C和D。
同时存在四个节点A、B、C、D。由于C和D权重为0,所以流量只会进入A、B。
当A、B停止时,流量会进入C、D,此时与权重值是否为0无关了。
老节点停止,新节点瞬间可用
引发的思考:并发访问量大的情况下,老节点停止,到新节点启用,这之间的数据同步会不会有问题?
目前来看通过修改权重,实现禁用dubbo提供者的禁用启用,是比其它几种方法都优的。
网友评论