本篇次要介绍一下 Dubbo 运维命令的应用以及实现原理。平时咱们的服务曾经上线了之后呈现问题怎么下线?如何晓得咱们上线的服务有哪些?通过 Dubbo QOS能够一一实现。

QOS应用

生产端和服务端启动的时候,Dubbo默认都会启动一个后盾端口来监听运维命令,生产上不必倡议关掉。通过以下配置能够对QOS性能进行自定义配置。

//是否启用QOS性能,默认truedubbo.application.qos.enable=true//启动QOS性能开启的端口,默认22222dubbo.application.qos.port=8998//QOS性能是否只能本机执行,默认falsedubbo.application.qos.accept.foreign.ip=true

目前 Dubbo的QOS命令次要有5种,看上面的表格

命令含意
help查看所有能用的命令
ls查看裸露的服务以及援用的服务
offline下线服务
online上线服务
quit退出控制台

咱们来一一应用看下以上命令,基于telnet形式来演示(QOS命令反对http协定以及telnet协定),这里我启动一个dubbo服务并且设置qos端口为8999,先通过控制台连贯下来

telnet localhost 8999

后果如下图

阐明曾经连贯胜利了

  • help
    先来应用一下 help 命令

    能够看到控制台列出了所有能用的命令,和咱们下面表格列出来的一样,对于不同版本的 Dubbo,可能命名会有些不一样的,所以应用之前先通过 help 命令来看下有哪些可用。咱们还能够通过 help 来查看某个命令是如何应用的,比方我要看 ls 命令如何应用

    help ls


    如果看 online 命令,则

    help online


    其余的命令应用以此类推

  • ls
    这个命令比拟繁多,间接

    ls

    后果如图

    下面是 Provider 相干状况,上面是 Consumer 相干状况,PUB 指的是是否注册胜利了,NUM 指的是有几个服务在注册核心

  • offline
    将服务从注册核心移除,能够指定某个服务或者所有服务,能够应用正则匹配,默认所有服务
    举例:我当初启动一个服务端和一个消费者,先应用ls命令别离看下服务状况,
    服务端:

    生产端:

    此时能够看到有一个服务并且只有一个节点注册了,接着咱们将该服务下线

    offline com.example.dubboprovider.rpc.CityService

    再看下服务状况

    能够看到此时服务曾经被下线,注册核心也没有,不信你能够本人找一下注册核心中是否还存在,因为该服务从注册核心下线了,注册核心会告诉生产端,导致生产端也移除了该服务,此时咱们看下生产端的状况确认下

    能够看到生产端也没有任何可用的服务节点了,发动调用试下:

    和预期一样,抛出了没有服务可用的异样,看到这应该对于offline的性能理解了吧。当然你能够通过正则形式移除某类服务,默认是所有服务

    offline com.example.dubboprovider.rpc.*
  • online
    和 offline 对应,这个命令是上线服务。接着方才offline的例子,此时服务复原了,咱们须要上线。
    连贯服务端执行

    online com.example.dubboprovider.rpc.CityService

    看下后果

    能够看到服务又有了,此时注册核心也有了该服务,生产端同样也收到了告诉,所以咱们再看下生产端的服务状况

    合乎预期,和offline一样,也能够用正则匹配服务

  • quit
    这个命名顾名思义,就是退出控制台的意思,间接执行试下

    quit

    原理

    QOS看起来是不是很神奇,咱们竟然能够间接用控制台进行管制(当然也能够用http形式,url + /ls,这个ls就是命令),Dubbo 是怎么做到的,咱们来解析一下。
    首先咱们须要看到一个很要害的类QosProtocolWrapper,该类也是 Protocol 的一种SPI扩大,咱们晓得在服务裸露和服务援用的过程中,会波及到 Protocol 的 export 以及 refer,秉着SPI的有 wrapper 先 wapper 的准则,无论是 export 还是 refer,都会先走 QosProtocolWrapper 的 export 和 refer,来看下做了什么

    能够看到逻辑根本一样,就是启动了一个qos用的server,外面的逻辑比较简单,间接跟到这里org.apache.dubbo.qos.server.Server#start

    能够看到实质上就是应用netty启动了一个后盾,也就是咱们的操作实际上就是和这个后盾的一个交互而已,这里退出了一个 QosProcessHandler,看下是怎么做的

    channel注册的时候会退出一个延时工作来输入控制台信息,也就是

    申请进来的时候会先进行申请协定判断,是http还是其余,能够看到协定的判断是基于魔数来的

    http 协定应用 HttpProcessHandler,否则应用 TelnetProcessHandler,他们两者的不同是对于申请内容的解析不同,最终还是调用 CommandExecutor 去执行命令

    能够看到这里应用了SPI机制,而 BaseCommand 刚好有5种实现,别离对于每种命令,非常灵活的扩大机制

    剩下的就看每个命名的具体实现,不再多做介绍。

    总结

    QOS整体实现还是比较简单的,就是一个后盾,而后基于申请类型别离解析并解决返回,其实性能上也并不欠缺,只能解决简略的服务高低线,而且还得应用命令的形式(容易出错),所以实际上用的也不多,大多数状况下咱们都用dubbo admin这类界面化的工具来操作,然而理解一下原理还是有必要的。