美文网首页
Dubbo提供者的禁用

Dubbo提供者的禁用

作者: 有梦想的虫子_2018 | 来源:发表于2022-04-01 15:49 被阅读0次

    一、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上这些节点消不消失,并不是控制服务可不可以访问。

    image.png

    二、依赖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.png
    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: 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提供者的禁用启用,是比其它几种方法都优的。

    相关文章

      网友评论

          本文标题:Dubbo提供者的禁用

          本文链接:https://www.haomeiwen.com/subject/hwhajrtx.html