架构师之路--应用架构的选型和dubbo

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 架构师之路--应用架构的选型和dubbo

小时候总是跟妈妈着去上班。妈妈是儿科医生。有一天来了一个妈妈带着他的宝宝挂了妈妈的专家号。宝宝长得很可爱,但是脸上没有任何表情,脑袋很大,四肢和刚出生的宝宝一样大。妈妈抬起宝宝的四肢,一放手它又耷拉回去。妈妈说话声音很沉重,说我直接给你开个证明吧,你可以再要一个孩子。那个妈妈一句话都没说,只是坐在那里抱着她的宝宝。这个妈妈在化工厂工作,天天和染料打交道。这已经不是她的第一个宝宝了,每个宝宝命运都差不多。这个妈妈的绝望和医学无关。所以高考的时候,怎么都不肯听妈妈的。自己报了计算机。妈妈知道后让我去找老师改回来。我走到半路给妈妈买了件衣服就回来了。妈妈虽然还是很想让我学医,但是看到我买的衣服显然很高兴,也明白她是拗不过我的,只好作罢。


这个选型主要决定于系统复杂度。先回顾一下。

 

  1>单一应用架构:对于一个流量很小的网站来说,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。之前在上家公司做过一个微信公众号的开发就是基于这种架构,我和一个大牛的前端架构师两个人就是一个项目,还是挺happy的。但是这种架构其实用java的成本有点高,用PHP更快。所以我自己接了个私活做个类似携程+如家的网站用的就是php。

 

  2>垂直应用架构:访问量再大一点,可以将应用拆成互不相干的几个应用,以提升效率。8年前刚进人人网的时候用的就是这个架构。因为是社交网站,被拆分成了SNS,UGC,各个游戏等子模块。

 

  3>分布式服务架构:垂直应用多了,交互不可避免,将核心业务抽取出来作为独立的服务,形成稳定的服务中心。大概从11年起,人人网逐渐采用这种架构。随之而来的是采用一些技术,记得最初也采用过RMI的,都是内部调用,防火墙也应该不是问题。但是后来hession和thrift开始流行,我们又进行了这方面的尝试。zookeeper用作注册中心,主要是配置管理方面。

 

  4>流动计算架构:当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需要增加一个调度中心基于访问压力实时管理集群容量,资源调度和提高集群利用率。

 

  Dubbo是Alibaba开源的分布式服务框架,按照分层来架构,使各个层之间解耦合。在我们项目中,作为服务层和业务层的桥梁来使用。Dubbo层可以用servlet容器启动,也可以直接用main函数直接加载ApplicationContext。总之,dubbo是依赖于spring来管理的。Dubbo框架设计共划分了10层。其中服务接口层,配置层,服务代理层是开发需要自行写入的,用法自行百度。

 

下面说一下服务注册层。它以服务URL为中心,扩展接口为RegistryFactory,Registry和RegistryService。打开RegistryFactory的源码可以看到,这是一个SPI的,核心工作就是取得其注册的信息。内部实现类是DubboRegistryFactory。作用就是根据url从一个本地的concurrenthashmap中取出其注册信息,如果注册信息不存在,则创建一个。同时将此注册目录加入集群。这种concurrenthashmap的东西要返回视图,返回的一般都是一个unmodify的拷贝。Dubbo里为了减少对apache的依赖,用的是java.util里的Collections.unmodifiableCollection。


集群层。这一层是上面提到的流动架构的体现。封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster,Directory,Router和LoadBalance。从SPI的配置文件来看,支持4种常用的负载均衡


random=com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance


roundrobin=com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance


leastactive=com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance


consistenthash=com.alibaba.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalance


具体类里基本都是算法的实现,可以不用看了。Cluster支持的算法如下:


mock=com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterWrapper


failover=com.alibaba.dubbo.rpc.cluster.support.FailoverCluster


failfast=com.alibaba.dubbo.rpc.cluster.support.FailfastCluster


failsafe=com.alibaba.dubbo.rpc.cluster.support.FailsafeCluster


failback=com.alibaba.dubbo.rpc.cluster.support.FailbackCluster


forking=com.alibaba.dubbo.rpc.cluster.support.ForkingCluster


available=com.alibaba.dubbo.rpc.cluster.support.AvailableCluster


mergeable=com.alibaba.dubbo.rpc.cluster.support.MergeableCluster


broadcast=com.alibaba.dubbo.rpc.cluster.support.BroadcastCluster


监控层:RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory, Monitor和MonitorService。实现上和注册层的实现是一样的。


远程调用层:封装RPC调用,以Invocation和Result为中心,扩展接口为Protocol,Invoker和Exporter。Protocal是服务域,它是Invoker暴露和引用的主功能入口,负责Invoker的生命周期管理。Invoker是实体域,它是Dubbo的核心模型,其他模型转换成它。它代表一个可执行体,可向它发起invoker调用,它有可能是一个本地实现,也可能是一个远程的实现,也可能是一个集群实现。相信了解过java动态代理的话,这个不难理解。


信息交换层:封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger,ExchangeChannel,ExchangeClient和ExchangeServer。


网络传输层:抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel,Transporter,Client,Server和Codec。


数据序列化层:可复用的一些工具,扩展接口为Serialization,ObjectInput,ObjectOutput和ThreadPool。


可以以dubbo配置项的解析为入口跟进源码。在dubbo jar包下META-INF里面的spring.handlers里,有自定义的spring命名空间处理器,可以找到对应的java类。dubbo的引入不可避免的带来IO,像咱们写代码的,这儿压缩几个字节,那儿解开一个循环,这些代码优化可能轻易就被低效的IO所抵消。IO操作比在内存中进行数据处理所需的时间一般长20倍。前段时间用CAT做性能监控就发现,如果没有dubbo层大概几ms的操作,引入dubbo执行时间正常都在几百ms。所以SOA要谨慎。要懂一些底层原理的话,其实架构的选择就能少些纠结,看各种框架也能马上就明白。网友问我在读什么书,其实现在很少有时间读,开放平台项目进入联调阶段了,还有很多细节可以优化的地方,还是挺忙的。之所以看到我的文章乱序严重也是因为我是用特别零散的时间来写的。但是前段时间不是看了<netty in action>嘛,看这本书就不得不再看看<java nio>做一下对比,看了<java nio>呢,里面作者又推荐读一下《操作系统第六版》,话说我大学也是计算机的,但是这本书还是需要重新看一遍的。每本书作者都会引入一些相关的好书,所以我的书单永远空不了。

 

  dubbo底层不管是用mina也好,netty也好,IO原理都是一样的。比如和底层相关的,之前我也提到我曾经自己分析过图片的二进制流来获取图片翻转信息。在这个过程中我了解到和底层操作系统相关的两个标准,Intel标准和摩托罗拉标准。分别对应两种字节顺序:大端字节顺序和小端字节顺序。了解这个对于nio的缓冲区也有帮助。而通道不是分为单工,双工,半双工嘛。面向流的socket肯定是双工的,所以流在网络中请求和响应的读写操作才可以同时进行。而像文件IO这样的,读写肯定是分离的,单工进行的。

 

上周有人问我我们的项目使用缓存和数据库就能解决问题,为啥要开发一个搜索引擎,考虑问题的角度不是应该放在数据分析上吗?我表示同意他的观点,因为我自己没组织好语言说服不了人家的时候我都是这个态度。实际上,首先说我们已经分析出来了,瓶颈就在缓存上了。缓存采用memcached也是缓存,redis也是缓存。实际上solr也是缓存啊!这种缓存是基于多维数据结构的获取,合适我们的项目也合适很多列表带维度的项目。我认为以后是很有前景的。而solr或者说es或者说dubbo或者memcached或者redis面临的问题都是一样的,性能嘛,而性能最大的消耗点就是io。我们项目用的dubbo+缓存。是两次跨网络的io。dubbo解决的是服务复用的问题,缓存解决的是空间换时间的问题,搜索引擎可以做为一个独立的服务一次io同时解决这两个问题,我为啥让人家明白不了呢

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
1天前
|
Cloud Native Go API
Go语言在微服务架构中的创新应用与实践
本文深入探讨了Go语言在构建高效、可扩展的微服务架构中的应用。Go语言以其轻量级协程(goroutine)和强大的并发处理能力,成为微服务开发的首选语言之一。通过实际案例分析,本文展示了如何利用Go语言的特性优化微服务的设计与实现,提高系统的响应速度和稳定性。文章还讨论了Go语言在微服务生态中的角色,以及面临的挑战和未来发展趋势。
|
4天前
|
存储 监控 前端开发
掌握微前端架构:构建未来前端应用的基石
【10月更文挑战第12天】随着前端技术的发展,传统的单体应用架构已无法满足现代应用的需求。微前端架构通过将大型应用拆分为独立的小模块,提供了更高的灵活性、可维护性和快速迭代能力。本文介绍了微前端架构的概念、核心优势及实施步骤,并探讨了其在复杂应用中的应用及实战技巧。
|
2天前
|
运维 Go 开发者
Go语言在微服务架构中的应用与优势
本文深入探讨了Go语言在构建微服务架构中的独特优势和实际应用。通过分析Go语言的核心特性,如简洁的语法、高效的并发处理能力以及强大的标准库支持,我们揭示了为何Go成为开发高性能微服务的首选语言。文章还详细介绍了Go语言在微服务架构中的几个关键应用场景,包括服务间通信、容器化部署和自动化运维等,旨在为读者提供实用的技术指导和启发。
|
4天前
|
设计模式 测试技术 持续交付
架构视角下的NHibernate:设计模式与企业级应用考量
【10月更文挑战第13天】随着软件开发向更复杂、更大规模的应用转变,数据访问层的设计变得尤为重要。NHibernate作为一个成熟的对象关系映射(ORM)框架,为企业级.NET应用程序提供了强大的支持。本文旨在为有一定经验的开发者提供一个全面的指南,介绍如何在架构层面有效地使用NHibernate,并结合领域驱动设计(DDD)原则来构建既强大又易于维护的数据层。
21 2
|
5天前
|
存储 消息中间件 人工智能
ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用
本文整理自2024年云栖大会阿里云智能集团高级技术专家金吉祥的演讲《ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用》。
|
2天前
|
Kubernetes 监控 持续交付
深入理解微服务架构及其在现代应用开发中的应用
【10月更文挑战第15天】深入理解微服务架构及其在现代应用开发中的应用
11 0
|
4天前
|
存储 前端开发 数据库
一文搞懂SaaS应用架构:应用服务、应用结构、应用交互设计
【10月更文挑战第21天】本文介绍了 SaaS 应用服务的多租户服务、安全服务和更新与维护服务,以及 SaaS 应用的前后端结构和交互设计。多租户服务涉及数据隔离和资源分配;安全服务包括身份认证与授权及数据安全;更新与维护服务涵盖版本管理和技术支持。前端结构关注用户界面设计和前端技术选型;后端结构则涉及微服务架构和数据库管理。交互设计强调租户与应用的交互和应用内部模块间的交互。
|
5月前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
2天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
11 2
|
2月前
|
Dubbo Java 应用服务中间件
💥Spring Cloud Dubbo火爆来袭!微服务通信的终极利器,你知道它有多强大吗?🔥
【8月更文挑战第29天】随着信息技术的发展,微服务架构成为企业应用开发的主流模式,而高效的微服务通信至关重要。Spring Cloud Dubbo通过整合Dubbo与Spring Cloud的优势,提供高性能RPC通信及丰富的生态支持,包括服务注册与发现、负载均衡和容错机制等,简化了服务调用管理并支持多种通信协议,提升了系统的可伸缩性和稳定性,成为微服务通信领域的优选方案。开发者仅需关注业务逻辑,而无需过多关心底层通信细节,使得Spring Cloud Dubbo在未来微服务开发中将更加受到青睐。
77 0