Dubbo提供者的禁用

2022-04-01  本文已影响0人  有梦想的虫子_2018

一、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配置生效规则 :

@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 

参考官方文档:配置规则

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提供者的禁用启用,是比其它几种方法都优的。

上一篇 下一篇

猜你喜欢

热点阅读