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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月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月前
|
运维 负载均衡 安全
深度解析:Python Web前后端分离架构中WebSocket的选型与实现策略
深度解析:Python Web前后端分离架构中WebSocket的选型与实现策略
97 0
|
2月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
3月前
|
存储 架构师 测试技术
架构之道——人人都是架构师
本文的探讨和编写主要围绕三个方面:架构是什么?架构师要解决的问题有哪些?解决这些问题的方法论是什么?最后作者希望人人都能具备架构师思维。
|
1月前
|
缓存 NoSQL Java
秒杀圣经:10Wqps秒杀,16大架构绝招,一文帮你秒变架构师 (2)
高并发下的秒杀系统设计是一个复杂的挑战,涉及多个关键技术点。40岁老架构师尼恩在其读者交流群中分享了16个关键架构要点,帮助解决高并发下的秒杀问题,如每秒上万次下单请求的处理、超卖问题的解决等。这些要点包括业务架构设计、流量控制、异步处理、缓存策略、限流熔断、分布式锁、消息队列、数据一致性、存储架构等多个方面。尼恩还提供了详细的实战案例和代码示例,帮助读者全面理解和掌握秒杀系统的架构设计。此外,他还分享了《尼恩Java面试宝典》等资源,帮助读者在面试中脱颖而出。如果你对高并发秒杀系统感兴趣,可以关注尼恩的技术自由圈,获取更多详细资料。
秒杀圣经:10Wqps秒杀,16大架构绝招,一文帮你秒变架构师 (2)
|
29天前
|
Dubbo 应用服务中间件 Apache
Dubbo 应用切换 ZooKeeper 注册中心实例,流量无损迁移
如果 Dubbo 应用使用 ZooKeeper 作为注册中心,现在需要切换到新的 ZooKeeper 实例,如何做到流量无损?
19 4
|
1月前
|
缓存 NoSQL Java
秒杀圣经:10Wqps高并发秒杀,16大架构杀招,帮你秒变架构师 (1)
高并发下,如何设计秒杀系统?这是一个高频面试题。40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试Shopee时遇到了这个问题,未能很好地回答,导致面试失败。为此,尼恩进行了系统化、体系化的梳理,帮助大家提升“技术肌肉”,让面试官刮目相看。秒杀系统设计涉及16个架构要点,涵盖业务架构、流量架构、异步架构、分层架构、缓存架构、库存扣减、MQ异步处理、限流、熔断、降级、存储架构等多个方面。掌握这些要点,可以有效应对高并发场景下的秒杀系统设计挑战。
秒杀圣经:10Wqps高并发秒杀,16大架构杀招,帮你秒变架构师 (1)
|
1月前
|
消息中间件 运维 NoSQL
基础架构组件选型及服务化
【10月更文挑战第15天】本文概述了分布式系统中常见的基础架构组件及其选型与服务化的重要性。
|
2月前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
81 6
|
1月前
|
消息中间件 运维 NoSQL
基础架构组件选型及服务化
【10月更文挑战第2天】本文介绍了常见的分布式基础架构组件,包括分布式服务化框架(如Dubbo、Spring Cloud)、分布式缓存(如Redis、Memcached)、数据库及分布式数据库框架(如MySQL、TiDB)、消息中间件(如Kafka、RabbitMQ)和前端接入层(如LVS、Nginx)。文中探讨了组件选型问题,强调统一标准的重要性,避免重复劳动与维护难题。最后,提出基础架构服务化的必要性,通过标准化和平台化提升运维效率
|
4月前
|
存储 架构师 测试技术
架构之道:人人都是架构师(2)
每个业务系统的开发者都应该具备一定的架构师素养,架构师的重要职责不仅仅是做决策,更重要的是提升团队的整体能力。一个好的架构师应该聚焦于业务和系统,定义问题和结果,设计系统、模块和代码,同时也需要解决跨域问题,确定团队间的边界,制定规范,统一语言,并创建一个让每个人都能成长为架构师的环境,以促进团队的敏捷性。本文旨在探讨如何培养架构思维,并阐述了架构师的职责、能力模型、方法论,以及如何成为架构师。
142 10
下一篇
无影云桌面