一、注册中心Zookeeper剖析

​ 注册中心是Dubbo的重要组成部分,主要用于服务的注册与发现,我们可以选择Redis、Nacos、 Zookeeper作为Dubbo的注册中心,Dubbo推荐用户使用Zookeeper作为注册中心。

注册中心Zookeeper目录结构

例如:只有一个提供者和消费者。 com.lagou.service.HelloService 为我们所提供的服务。

public interface HelloService {
    String sayHello(String name);
}

则Zookeeper的目录结构如下:

+- dubbo
|  +- com.lagou.service.HelloService
|  |  +- consumers
|  |  |  +- consumer://192.168.1.102/com.lagou.service.HelloService?
application=dubbo-demo-annotation-
consumer&category=consumers&check=false&dubbo=2.0.2&init=false&interface=com.lag
ou.service.HelloService&methods=sayHello,sayHelloWithPrint,sayHelloWithTransmiss
ion,sayHelloWithException&pid=25923&release=2.7.5&side=consumer&sticky=false&tim
estamp=1583896043650
|  |  +- providers
|  |  |  +- dubbo://192.168.1.102:20880/com.lagou.service.HelloService?
anyhost=true&application=dubbo-demo-annotation-
provider&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.l
agou.service.HelloService&methods=sayHello,sayHelloWithPrint,sayHelloWithTransmi
ssion,sayHelloWithException&pid=25917&release=2.7.5&side=provider&telnet=clear,e
xit,help,status,log,ls,ps,cd,pwd,invoke,trace,count,select,shutdown&timestamp=15
83896023597
|  |  +- configuration
|  |  +- routers
  • 可以在这里看到所有的都是在dubbo层级下的
  • dubbo跟节点下面是当前所拥有的接口名称,如果有多个接口,则会以多个子节点的形式展开
  • 每个服务下面又分别有四个配置项
    • consumers: 当前服务下面所有的消费者列表(URL)
    • providers: 当前服务下面所有的提供者列表(URL)
    • configuration: 当前服务下面的配置信息信息,provider或者consumer会通过读取这里的配 置信息来获取配置
    • routers: 当消费者在进行获取提供者的时,会通过这里配置好的路由来进行适配匹配规则
  • 可以看到,dubbo基本上很多时候都是通过URL的形式来进行交互获取数据的,在URL中也会保存 很多的信息。后面也会对URL的规则做详细介绍

image-20220306113113364

通过这张图我们可以了解到如下信息:

  • 提供者会在providers 目录下进行自身的进行注册。
  • 消费者会在 consumers 目录下进行自身注册,并且监听 provider 目录,以此通过监听提供者增 加或者减少,实现服务发现。
  • Monitor模块会对整个服务级别做监听,用来得知整体的服务情况。以此就能更多的对整体情况做 监控。

二、服务的注册过程分析

image-20220306113515135

首先ServiceConfig类拿到对外提供服务的实际类ref(如何:HelloServiceImpl),然后通过ProxyFactory接口实现类中的getInvoker方法使用ref生成一个AbstractProxyInvoker实例,到这一步 就完成了服务到Invoker的转化。接下来就是Invoker转换到Exporter的过程

三、 URL规则详解 和 服务本地缓存

URL规则详解

protocol://host:port/path?key=value&key=value
provider://192.168.20.1:20883/com.lagou.service.HelloService?
anyhost=true&application=service-
provider2&bind.ip=192.168.20.1&bind.port=20883&category=configurators&check=fals
e&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.lagou.se
rvice

URL主要有以下几部分组成:

  • protocol: 协议,一般像我们的 provider 或者 consumer 在这里都是人为具体的协议
  • host: 当前 provider 或者其他协议所具体针对的地址,比较特殊的像 override 协议所指定的 host就是 0.0.0.0 代表所有的机器都生效
  • port: 和上面相同,代表所处理的端口号
  • path: 服务路径,在 provider 或者 consumer 等其他中代表着我们真实的业务接口
  • key=value: 这些则代表具体的参数,这里我们可以理解为对这个地址的配置。比如我们 provider 中需要具体机器的服务应用名,就可以是一个配置的方式设置上去。

服务本地缓存

dubbo调用者需要通过注册中心(例如:ZK)注册信息,获取提供者,但是如果频繁往从ZK获取信 息,肯定会存在单点故障问题,所以dubbo提供了将提供者信息缓存在本地的方法

Dubbo在订阅注册中心的回调处理逻辑当中会保存服务提供者信息到本地缓存文件当中(同步/异步两 种方式),以URL纬度进行全量保存

Dubbo在服务引用过程中会创建registry对象并加载本地缓存文件,会优先订阅注册中心,订阅注册中 心失败后会访问本地缓存文件内容获取服务提供信息。

三、Dubbo 消费过程分析

image-20220306115423327

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐