#徐员外#阿里巴巴Dubbo开源服务框架|100本技术书之3
Posted xuyuanwai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#徐员外#阿里巴巴Dubbo开源服务框架|100本技术书之3相关的知识,希望对你有一定的参考价值。
一、为什么要介绍dubbo?
目前互联网分布式服务框架有很多,例如我上次介绍spring cloud 技术时提到的Netflix公司eureka等,但从实战的角度讲,Dubbo无疑是目前最好的选择。
Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2000+个服务提供30+亿次访问量支持,广泛应用于阿里集团的各成员站点。从上述数据来看,世界范围内也没有那家互联网企业的技术能够支撑到这么高的数据,可以说Dubbo是经历了淘宝双11秒杀生产环境检验的而留下来的优秀技术框架。阿里在几年前已经选择将此项技术进行了开源,我们可以通过https://github.com/apache/incubator-dubbo获取源代码或相关文档。
这篇文章的主要内容是基于梁飞的《Dubbo用户指南》进行总结的,当然这么强大的技术也不是通过这篇小文能介绍清楚的,这里主要介绍的阅读的思路及梳理关键技术点。
二、为什么会是dubbo?
我们从文档中会发现下面这张图,这既是一张技术演变的路线图,也是互联网项目业务膨胀后的优化图,从图中来看,单一ORM框架及传统的MVC框架,无论怎么优化,它所支持的并发数量都是有限的,1000已经是一个瓶颈,SOA框架才能支持到10000+的并发
在互联网领域,你所在的项目,如果所有的服务器加起来不到100台,那都称不上互联网项目,`一个高可用、高性能的互联网项目,下面两项大的关键技术是必须要考虑的。
1、 集群
分为应用、数据库、资源文件等服务器的集群,也就是把同样的系统部署到多台机器上,统一对外提供服务。由此引发了如何调度、数据一致性等一系列问题,在单一的架构里面,数据、控制逻辑、页面全在一个项目里面,耦合性太高,根本无法去做集群,即使做了集群,性能也上不去,我们知道如在数据层面IO读写是性能的关键,在逻辑层面计算能力是关键,在文层面存储磁盘大小传输速度是关键,都捆绑在一起,怎么可能做到高性能高可用。
2、 负载均衡
集群带来的统一分批和管理调度的问题,此时出现了负载均衡的解决方案,如负载均衡的硬件服务器F5 、软件nginx等
当我们的系统的逻辑、页面、数据、文件等分层解耦后,此时将系统里面不同的业务逻辑封装成API,通过接口对外提供服务,每个业务逻辑能够单独运行部署,能够独立存在,存在依赖关系但又互不干涉,但是在系统集群和负载部署后,这么多的服务如何进行对接、管理和监控,Dubbo技术的出现,专门解决了互联网分布式项目服务的治理问题。
三、dubbo如何使用?
从上面这张图可以看出,不同的服务首先要在注册中心进行注册,才能够通过服务治理中心实现服务的调度和监控,由此引发下述概念。
依赖关系图
1、 服务提供者(provider)
将业务逻辑代码封装好,供其它服务或系统调用。
2、 服务消费者(consumer)
调用服务提供者提供的业务逻辑代码。
3、 服务注册(Registry)
服务提供者和消费者都需要在此登记。
4、 监听器(monitor)
统计监控双方之间的调用情况。
在了解上述基本概念后,可以通过下面这张图从整体上了解dubbo所涉及到的技术及它们之间的关系。
整体设计图
图例说明:
· 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。
· 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI。
· 图中绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类。
· 图中蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行时调时链,紫色三角箭头为继承,可以把子类看作父类的同一个节点,线上的文字为调用的方法。
各层说明
· config 配置层:对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类
· proxy 服务代理层:服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton, 以 ServiceProxy 为中心,扩展接口为 ProxyFactory
· cluster 路由层:封装多个提供者的路由及负载均衡,并桥接注册中心,以 Invoker 为中心,扩展接口为 Cluster, Directory, Router, LoadBalance
· monitor 监控层:RPC 调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactory, Monitor, MonitorService
· protocol 远程调用层:封装 RPC 调用,以 Invocation, Result 为中心,扩展接口为 Protocol, Invoker, Exporter
· exchange 信息交换层:封装请求响应模式,同步转异步,以 Request, Response 为中心,扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer
· transport 网络传输层:抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Channel, Transporter, Client, Server, Codec
· serialize 数据序列化层:可复用的一些工具,扩展接口为 Serialization, ObjectInput, ObjectOutput, ThreadPool
关系说明
· 在 RPC 中,Protocol 是核心层,也就是只要有 Protocol + Invoker +Exporter 就可以完成非透明的 RPC 调用,然后在 Invoker 的主过程上 Filter 拦截点。
· 图中的 Consumer 和 Provider 是抽象概念,只是想让看图者更直观的了解哪些类分属于客户端与服务器端,不用 Client 和 Server 的原因是 Dubbo 在很多场景下都使用 Provider, Consumer, Registry, Monitor 划分逻辑拓普节点,保持统一概念。
· 而 Cluster 是外围概念,所以 Cluster 的目的是将多个 Invoker 伪装成一个 Invoker,这样其它人只要关注 Protocol 层 Invoker 即可,加上 Cluster 或者去掉 Cluster 对其它层都不会造成影响,因为只有一个提供者时,是不需要 Cluster 的。
· Proxy 层封装了所有接口的透明化代理,而在其它层都以 Invoker 为中心,只有到了暴露给用户使用时,才用 Proxy 将 Invoker 转成接口,或将接口实现转成 Invoker,也就是去掉 Proxy 层 RPC 是可以 Run 的,只是不那么透明,不那么看起来像调本地服务一样调远程服务。
· 而 Remoting 实现是 Dubbo 协议的实现,如果你选择 RMI 协议,整个 Remoting 都不会用上,Remoting 内部再划为 Transport 传输层和 Exchange 信息交换层,Transport 层只负责单向消息传输,是对 Mina, Netty, Grizzly 的抽象,它也可以扩展 UDP 传输,而 Exchange 层是在传输层之上封装了 Request-Response 语义。
· Registry 和 Monitor 实际上不算一层,而是一个独立的节点,只是为了全局概览,用层的方式画在一起。
调用链图
这部分内容的技术细节不在此文中做描述,感兴趣的读者可以查看《开发者文档》 http://dubbo.apache.org/books/dubbo-dev-book/design.html,如果能够把整体设计图和调用链图对照着讲清楚,那么从理解技术的逻辑上来看,对于dubbo技术的技术路线在理解上应该没有什么问题了,剩下的具体技术细节,配置参数也没有必要去死记硬背,知道去翻手册和github上的源代码就可以了。
对于后面的章节,主要围绕着集群和负载均衡,在测试环境、正式环境下怎样去配置和使用、性能如何提升和优化,此处涉及到zookeeper和redis的使用和集群,在实际的工作中会常用到,大家可以通过手册中提供的案例源代码进行试验。
最后像dubbo 这样优秀的SOA服务治理框架,在项目实际的测试、发布和分布式部署都要实现自动化,所以在实际的生产环境会写很多自动化的脚本文件来启动或停止和监控,结合管理控制台如hudson来实现项目的开发和上线。
以上是关于#徐员外#阿里巴巴Dubbo开源服务框架|100本技术书之3的主要内容,如果未能解决你的问题,请参考以下文章