【知识积累】(一)、了解Dubbo

时间:2024-03-29 07:43:42
一、背景

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,急需一个治理系统架构有条不紊的演进。

【知识积累】(一)、了解Dubbo

1、单一垂直架构(All in One):

当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化CRUD工作量的数据访问架构(ORM)是关键。

2、垂直应用架构(Vertical Application):

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。

3、分布式服务架构(Distributed Service):

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。

4、流动计算架构(Elastic Computing):

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。

二、需求

1、当网站变大后,不可避免的需要拆分应用进行服务化,以提高开发效率,调优性能,节省关键竞争资源等。

2、当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大。此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。并通过在消费方获取服务提供方地址列表,实现软负载均衡和 Failover,降低对 F5 硬件负载均衡器的依赖,也能减少部分成本。

3、当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。

4、接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器? 为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阀值,记录此时的访问量,再以此访问量乘以机器数反推总容量。

三、Dubbo是什么?

Dubbo是一个分布式服务框架,基于注册中心模式实现RPC远程服务调用,以及SOA服务治理方案。

四、Dubbo的设计思路

该框架具有极高的扩展性,采用微核+插件体系,并且文档齐全,方便二次开发,适应能力强。

五、Dubbo的依赖

JDK 1.5 以上,缺省依赖javassist、netty、spring等jar包,但不是必须依赖,通过配置Dubbo可不依赖任何第三方库运行。

六、为什么使用Dubbo?

1、提供了RPC调用和SOA治理;

2、开源

3、相对其他RPC框架,应用广泛,更加成熟。

其他RPC框架补充:

Thrift:开发团队是FaceBook,优点是支持多语言,缺点没有自带SOA;

Duddox:开发团队是当当,为Dubbo提供了一些新的功能,REST风格远程调用,Kryo/FST序列化等。

Motan:开发团队是微软,基于Java的轻量级RPC框架,相对Dubbo而言,没有那么多功能以及扩展实现。

七、Dubbo的性能

Dubbo通过长连接减少握手,通过NIO及线程池在单连接上并发拼包处理消息,通过二进制流压缩数据,比常规HTTP等短连接协议更快。在alibaba内部,每天可支撑2000+服务,30亿+访问量,最大单机支持大约1亿访问量。

八、与HSF(High Speed Framework)的对比

1、Dubbo比HSF的部署方式更轻量

HSF要求使用指定的JBoss等容器,还需要在JBoss等容器中加入jar包扩展,对用户侵入性较大,如果要运行在Weblogic或Websphere等其他容器上,需要自行扩展容器以兼容HSF的ClassLoader加载,而Bubbo没有任何要求,可运行在任何Java环境;

2、Dubbo比HSF扩展性更好,方便二次开发

一个框架不可能覆盖所有需求,Dubbo始终保持平等对待第三方理念,即所有功能,都可以在不修改Dubbo原生代码的情况下,在外围扩展,包括Dubbo自己内置的功能,也和第三方一样,是通过扩展的方式实现的,而HSF如果你要加功能或替换某部分实现是很困难的,比如支付宝和淘宝用的就是不同的HSF分支,因为加功能时改了核心代码,不得不拷一个分支单独发展,HSF现阶段就算开源出来,也很难复用,除非对架构重写。 一个框架不可能覆盖所有需求,Dubbo始终保持平等对待第三方理念,即所有功能,都可以在不修改Dubbo原生代码的情况下,在外围扩展,包括Dubbo自己内置的功能,也和第三方一样,是通过扩展的方式实现的,而HSF如果你要加功能或替换某部分实现是很困难的,比如支付宝和淘宝用的就是不同的HSF分支,因为加功能时改了核心代码,不得不拷一个分支单独发展,HSF现阶段就算开源出来,也很难复用,除非对架构重写。 

3、HSF依赖较多内部系统

比如配置中心,通知中心,监控中心,单点登录等等,如果要开源还需要做很多剥离工作,而Dubbo为每个系统的集成都留出了扩展点,并已梳理干清所有依赖,同时为开源社区提供了替代方案,用户可以直接使用。 

4、Dubbo比HSF的功能更多

除了ClassLoader隔离,Dubbo基本上是HSF的超集,Dubbo也支持更多协议,更多注册中心的集成,以适应更多的网站架构。 

九、Dubbo的安全机制

Dubbo主要针对内部服务,对外的服务,阿里有开放平台来处理安全和流控,所以Dubbo在安全方面实现的功能较少,基本上只防君子不防小人,只防止误调用。 

Dubbo通过Token令牌防止用户绕过注册中心直连,然后在注册中心上管理授权。Dubbo还提供服务黑白名单,来控制服务所允许的调用方。 

十、Dubbo的应用情况

在阿里内部,除淘系以外的其它阿里子公司,都在使用Dubbo,包括:中文主站,国际主站,AliExpress,阿里云,阿里金融,阿里学院,良无限,来往等等。 

开源后,已被:去哪儿,京东,吉利汽车,方正证劵,海尔,焦点科技,中润四方,华新水泥,海康威视,等公司广泛使用,并不停的有新公司加入,社区讨论及贡献活跃,得到用户很高的评价。 

十一、Dubbo的分布式事务和多语言支持

分布式事务可能暂不会支持,因为如果只是支持简单的XA/JTA两阶段提交事务,实用性并不强。用户可以自行实现业务补偿的事件,或更复杂的分布式事务,Dubbo有很多扩展点可以集成。 

在多语言方面,Dubbo实现了C++版本,但在内部使用面极窄,没有得到很强的验证,并且C++开发资源紧张,没有精力准备C++开源事项。 

十二、Dubbo采用的开源协议以及商业应用应注意事项

Dubbo采用Apache License 2.0开源协议,它是一个商业友好的协议,你可以免费用于非开源的商业软件中。 
你可以对它进行改造和二次发布,只要求保留阿里的著作权,并在再发布时保留原始许可声明。 

十三、核心功能

高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。

远程通讯:提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及"请求-响应"模式的信息交换方式;

自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供者,使地址透明,使服务提供方可以平滑增加或减少机器;

集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。

十四、架构

【知识积累】(一)、了解Dubbo

角色说明:

registry:服务注册与发现的注册中心

contrainer:服务运行容器

provider:暴露服务的服务提供方

consumer:调用远程服务的服务消费方

monitor:统计服务调用次数和调用时间的监控中心

调用关系:

0、start:服务容器负责启动,加载,运行服务提供者;

1、register:服务提供者在启动时,向注册中心注册自己提供的服务;

2、subscribe:服务消费者在启动时,想注册中心订阅自己所需服务;

3、notify:注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者;

4、invoke:服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用;

5、conut:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

十五、特点

连通性

  • 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小;
  • 监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示;
  • 服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销;
  • 服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销;
  • 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
  • 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者;
  • 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
  • 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者

健壮性

  • 监控中心宕机不影响使用,只是丢失部分采样数据
  • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务;
  • 注册中心对等集群,任意一台宕机后,将自动切换到另一台
  • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
  • 服务提供者无状态,任意一台宕掉后,不影响使用
  • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

伸缩性

  • 注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心;
  • 服务提供者无状态,可动态增加机器部署实例,注册中心推送新的服务提供者信息给消费者。

升级性

  • 当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力。

未来可能的架构

【知识积累】(一)、了解Dubbo

Deployer:自动部署服务的的本地代理

Repository:仓库用于存储服务应用发布包

Scheduler:调度中心基于访问压力自动增减服务提供者

Admin:统一管理控制台

Registry:服务注册与发现的注册中心

Monitor:统计服务的调用次数和调用事件的监控中心

十六、优缺点

优点:

1、使用简单方便

2、统一的服务调用地址

3、能进行软负载均衡,降低对F5硬件负载均衡器的依赖,也能减少部分成本。

4、连通性

5、健壮性

6、伸缩性

7、升级性

缺点:

只支持Java语言

十七、Dubbo未来的发展计划

Dubbo的RPC框架已基本稳定,未来的重心会放在服务治理上,包括架构分析、监控统计、降级控制、流程协作等等。