dubbo入门
发布日期:2021-09-16 04:36:20 浏览次数:1 分类:技术文章

本文共 2702 字,大约阅读时间需要 9 分钟。

由于篇幅过长,转载:

1、概念:

Dubbo 是一款高性能 Java RPC 架构。它实现了面向接口代理的 RPC 调用,服务注册和发现,负载均衡,容错,扩展性等等功能。

2、结构:

Dubbo 大致上分为三层,分别是:

业务层

RPC 层

Remoting 层

3、dubbo调用工作流

工作流涉及到服务提供者(Provider),注册中心(Registration),网络(Network)和服务消费者(Consumer):

  • 服务提供者在启动的时候,会通过读取一些配置将服务实例化。(服务提供者实例化服务)
  • Proxy 封装服务调用接口,方便调用者调用。
  • 客户端获取 Proxy 时,可以像调用本地服务一样,调用远程服务。
  • Proxy 在封装时,需要调用 Protocol 定义协议格式,例如:Dubbo Protocol。
  • 将 Proxy 封装成 Invoker,它是真实服务调用的实例。
  • 将 Invoker 转化成 Exporter,Exporter 只是把 Invoker 包装了一层,是为了在注册中心中暴露自己,方便消费者使用。
  • 将包装好的 Exporter 注册到注册中心。
  • 服务消费者建立好实例,会到服务注册中心订阅服务提供者的元数据。元数据包括服务 IP 和端口以及调用方式(Proxy)。
  • 消费者会通过获取的 Proxy 进行调用。
  • 通过服务提供方包装过程可以知道,Proxy 实际包装了 Invoker 实体,因此需要使用 Invoker 进行调用。
  • 在 Invoker 调用之前,通过 Directory 获取服务提供者的 Invoker 列表。
  • 在分布式的服务中有可能出现同一个服务,分布在不同的节点上。
  • 通过路由规则了解,服务需要从哪些节点获取。
  • Invoker 调用过程中,通过 Cluster 进行容错,如果遇到失败策略进行重试。
  • 调用中,由于多个服务可能会分布到不同的节点,就要通过 LoadBalance 来实现负载均衡。
  • Invoker 调用之前还需要经过 Filter,它是一个过滤链,用来处理上下文,限流和计数的工作。
  • 生成过滤以后的 Invoker。
  • 用 Client 进行数据传输。
  • Codec 会根据 Protocol 定义的协议,进行协议的构造。
  • 构造完成的数据,通过序列化 Serialization 传输给服务提供者。
  • Request 已经到达了服务提供者,它会被分配到线程池(ThreadPool)中进行处理。
  • Server 拿到请求以后查找对应的 Exporter(包含有 Invoker)。
  • 由于 Export 也会被 Filter 层层包裹通过 Filter 以后获得 Invoker最后,对服务提供者实体进行调用。

上面调用步骤经历了这么多过程,其中出现了 Proxy,Invoker,Exporter,Filter。

实际上都是调用实体在不同阶段的不同表现形式,本质是一样的,在不同的使用场景使用不同的实体。

例如 Proxy 是用来方便调用者调用的。Invoker 是在调用具体实体时使用的。Exporter 用来注册到注册中心的等等。

4、服务提供者暴露实现原理

  • 读取其他配置信息到 map 中,用来后面构造 URL。
  • 读取全局配置信息。
  • 配置不是 remote,也就是暴露本地服务。
  • 如果配置了监控地址,则服务调用信息会上报。
  • 通过 Proxy 转化成 Invoker,RegistryURL 存放的是注册中心的地址。
  • 暴露服务以后,向注册中心注册服务信息。
  • 没有注册中心直接暴露服务。
  • 一旦服务注册到注册中心以后,注册中心会通过 RegistryProtocol 中的 Export 方法将服务暴露出去,
  • 并依次做以下操作:
  • 委托具体协议进行服务暴露,
  • 创建 NettyServer 监听端口,并保持服务实例。
  • 创建注册中心对象,创建对应的 TCP 连接。
  • 注册元数据到注册中心。
  • 订阅 Configurators 节点。
  • 如果需要销毁服务,需要关闭端口,注销服务信息。

5、服务消费者暴露原理

  • 检查是否是同一个 JVM 内部引用。如果是同一个 JVM 的引用,直接使用 injvm 协议从内存中获取实例。
  • 注册中心地址后,添加 refer 存储服务消费元数据信息。
  • 单注册中心消费。
  • 依次获取注册中心的服务,并且添加到 Invokers 列表中。
  • 通过 Cluster 将多个 Invoker 转换成一个 Invoker。
  • 把 Invoker 转换成接口代理。

6、注册中心

  • 动态载入服务。服务提供者通过注册中心,把自己暴露给消费者,无须消费者逐个更新配置文件。
  • 动态发现服务。消费者动态感知新的配置,路由规则和新的服务提供者。
  • 参数动态调整。支持参数的动态调整,新参数自动更新到所有服务节点。
  • 服务统一配置。统一连接到注册中心的服务配置。

 

7、注册中心调用的流程图:

  • 提供者(Provider)启动时,会向注册中心写入自己的元数据信息(调用方式)。
  • 消费者(Consumer)启动时,也会在注册中心写入自己的元数据信息,并且订阅服务提供者,路由和配置元数据的信息。
  • 服务治理中心(duubo-admin)启动时,会同时订阅所有消费者,提供者,路由和配置元数据的信息。
  • 当提供者离开或者新提供者加入时,注册中心发现变化会通知消费者和服务治理中心。

8、

注册中心工作原理

Dubbo 有四种注册中心的实现,分别是 ZooKeeper,Redis,Simple 和 Multicast。

这里着重介绍一下 ZooKeeper 的实现。ZooKeeper 是负责协调服务式应用的。

它通过树形文件存储的 ZNode 在 /dubbo/Service 目录下面建立了四个目录,分别是:

 

Providers 目录下面,存放服务提供者 URL 和元数据。

Consumers 目录下面,存放消费者的 URL 和元数据。

Routers 目录下面,存放消费者的路由策略。

Configurators 目录下面,存放多个用于服务提供者动态配置 URL 元数据信息。

 

客户端第一次连接注册中心的时候,会获取全量的服务元数据,包括服务提供者和服务消费者以及路由和配置的信息。

根据 ZooKeeper 客户端的特性,会在对应 ZNode 的目录上注册一个 Watcher,同时让客户端和注册中心保持 TCP 长连接。

如果服务的元数据信息发生变化,客户端会接受到变更通知,然后去注册中心更新元数据信息。变更时根据 ZNode 节点中版本变化进行。

 

转载地址:https://blog.csdn.net/wlg9527/article/details/107460688 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:hibernate经典问题
下一篇:详解抽象类和接口的区别

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.36.148.16]2022年06月18日 07时13分12秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章