Dubbo 学习(一)
简介
Apache Dubbo是一款微服务开发框架,它提供了RPC通信与微服务治理两大关键能力。这意味着,使用Dubbo开发的微服务,将具备相互之间的远程发现与通信能力,同时利用Dubbo提供的丰富服务治理能力,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。同时Dubbo是高度可扩展的,用户几乎可以在任意功能点去定制自己的实现,以改变框架的默认行为来满足自己的业务需求。
作为一站式微服务解决方案,Dubbo提供了从服务定义、服务发现、服务通信到流量管控等几乎所有的服务治理能力,我们的学习也将主要聚焦在服务发现、通信协议以及流量管理这三个方面。
服务发现
官网上的图足够清晰,服务提供者Provider将服务注册到注册中心Registry,消费者Consumer通过向注册中心发起订阅获取到Provider的地址清单,之后即可发起调用。Container作为服务运行的容器,而Monitor则是统计服务的调用次数和调用时间的监控中心。
Dubbo支持对接的注册中心有ZooKeeper、Nacos、Redis等等,不过从官网上可以看到Dubbo推荐使用ZooKeeper作为注册中心。
通信协议
Dubbo支持原生的Dubbo协议。除此之外,gRPC、Hessian、Http等第三方协议Dubbo也有进行集成并纳入Dubbo的编程与服务治理体系。
协议是RPC的核心,它规范了数据在网络中的传输内容和格式。除必须的请求、响应数据外,通常还会包含额外控制数据,如单次请求的序列化方式、超时时间、压缩方式和鉴权信息等。
协议的内容包含三部分
- 数据交换格式: 定义 RPC 的请求和响应对象在网络传输中的字节流内容,也叫作序列化方式
- 协议结构: 定义包含字段列表和各字段语义以及不同字段的排列方式
- 协议通过定义规则、格式和语义来约定数据如何在网络间传输。一次成功的 RPC 需要通信的两端都能够按照协议约定进行网络字节流的读写和对象转换。如果两端对使用的协议不能达成一致,就会出现鸡同鸭讲,无法满足远程通信的需求。
RPC 协议的设计需要考虑以下内容:
- 通用性: 统一的二进制格式,跨语言、跨平台、多传输层协议支持
- 扩展性: 协议增加字段、升级、支持用户扩展和附加业务元数据
- 性能:As fast as it can be(越快越好)
- 穿透性:能够被各种中端设备识别和转发:网关、代理服务器等 通用性和高性能通常无法同时达到,需要协议设计者进行一定的取舍。
Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。反之,Dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
流量管理
流量管理的本质是将请求根据制定好的路由规则分发到应用服务上,如下图所示:
其中:
- 路由规则可以有多个,不同的路由规则之间存在优先级。如:Router(1) -> Router(2) -> …… -> Router(m)
- 一个路由规则可以路由到多个不同的应用服务。如:Router(2)既可以路由到Service(1)也可以路由到Service(2)
- 多个不同的路由规则可以路由到同一个应用服务。如:Router(1)和Router(2)都可以路由到Service(2)
- 路由规则也可以不路由到任何应用服务。如:Router(m)没有路由到任何一个Service上,所有命中Router(m)的请求都会因为没有对应的应用服务处理而导致报错
- 应用服务可以是单个的实例,也可以是一个应用集群
Dubbo将整个流量管理分成VirtualService和DestinationRule两部分。当Consumer接收到一个请求时,会根据VirtualService中定义的DubboRoute和DubboRouteDetail匹配到对应的DubboDestination中的subnet,最后根据DestinationRule中配置的subnet信息中的labels找到对应需要具体路由的Provider集群。其中:
- VirtualService主要处理入站流量分流的规则,支持服务级别和方法级别的分流。
- DubboRoute主要解决服务级别的分流问题。同时,还提供的重试机制、超时、故障注入、镜像流量等能力。
- DubboRouteDetail主要解决某个服务中方法级别的分流问题。支持方法名、方法参数、参数个数、参数类型、header等各种维度的分流能力。同时也支持方法级的重试机制、超时、故障注入、镜像流量等能力。
- DubboDestination用来描述路由流量的目标地址,支持host、port、subnet等方式。
- DestinationRule主要处理目标地址规则,可以通过hosts、subnet等方式关联到Provider集群。同时可以通过trafficPolicy来实现负载均衡。
这种设计理念很好的解决流量分流和目标地址之间的耦合问题。不仅将配置规则进行了简化有效避免配置冗余的问题,还支持VirtualService和DestinationRule的任意组合,可以非常灵活的支持各种业务使用场景。
参考资料:
http://dubbo.apache.org/zh/