dubbo 浅入浅出

443 阅读4分钟

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

1. Dubbo是什么?

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册) 其核心部分包含:

  1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
  2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

图片.png

Dubbo 分层

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

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

  • 业务层
  • RPC 层
  • Remoting 层 图片.png

Dubbo的主要应用场景

透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。

软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。(F5负载均衡器我也是百度来的)。

服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

图片.png

Dubbo 调用工作流

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 用来注册到注册中心的等等。