33

架构师的初级技能,选组件!(2020更新版,非广告)

 3 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzA4MTc4NTUxNQ%3D%3D&%3Bmid=2650522214&%3Bidx=1&%3Bsn=7830c2ed82c3ecf369424804b25ab8c2
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

e6JBVrU.gif!mobile

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。

2020年新版,对部分组件的描述进行了更新。19年文章参见这里 。如果你在做选型方面的工作,或者想了解一些现在正在流行的技术,那么这篇文章正好适合你。有什么疑问,可以加我好友 (微信号:xjjdog0),进群讨论。

本篇内容涵盖14个方面,涉及上百个框架和工具。会有你喜欢的,大概也会有你所讨厌的家伙。这是我平常工作中打交道最多的工具,大小公司都适用。如果你有更好的,欢迎留言补充。

一、消息队列
二、缓存
三、分库分表
四、数据同步
五、通讯
六、微服务
七、分布式工具
八、监控系统
九、调度
十、入口工具
十一、OLT(A)P
十二、CI/CD
十三、问题排查
十四、本地工具

一、消息队列

  • √ 推荐:(1) 吞吐量优先选择 kafka
  • (2) 稳定性优先选择 RocketMQ
  • (3) 物联网: VerneMQ

MJRNNjm.png!mobile

一个大型的分布式系统,通常都会异步化,走消息总线。消息队列作为最主要的基础组件,在整个体系架构中,有着及其重要的作用。异步通常意味着编程模型的改变,时效性会降低。

kafka 是目前最常用的消息队列,尤其是在大数据方面,有着极高的吞吐量。而 rocketmqrabbitmq ,都是电信级别的消息队列,在业务上用的比较多。相比较而言, ActiveMQ 使用的最少,属于较老一代的消息框架。

pulsar 是为了解决一些 kafka 上的问题而诞生的消息系统,比较年轻,工具链有限。有些激进的团队经过试用,反响不错,但实际使用并不多。

mqtt 具体来说是一种协议,主要用在物联网方面,能够双向通信,属于消息队列范畴,推荐使用 vernemq

二、缓存

  • √ 推荐:(1)  堆内缓存使用默认的 caffeine
  • (2) 分布式缓存采用redis的cluster集群模式,但要注意使用限制

BV3I7rZ.png!mobile

数据缓存是减少数据库压力的有效途径,有单机java内缓存,和分布式缓存之分。

对于单机来说, guavaLoadingCacheehcache 都是些熟面孔,不过SpringBoot选择了 caffeine 作为它的默认堆内缓存,这是因为 caffeine 的速度比较快的原因。

对于分布式缓存来说,优先选择的就是 redis ,别犹豫。由于redis是单线程的(6.0支持多线程,但默认不开启),并不适合高耗时操作。所以对于一些数据量比较大的缓存,比如图片、视频等,使用老牌的 memcached 效果会好的多。

JetCache 是一个基于Java的缓存系统封装,提供统一的api和注解来简化缓存的使用。类似SpringCache,支持本地缓存和分布式缓存,也是简化开发的利器。

三、分库分表

  • √ 推荐:shardingsphere中的sharding-jdbc

umA32iU.png!mobile

分库分表,几乎每一个上点规模的公司,都会有自己的方案。目前,推荐使用驱动层的 sharding-jdbc (已经进入apache),或者代理层的 mycat 。如果你没有额外的运维团队,又不想花钱买其他机器,那么就选前者。

如果分库分表涉及的项目不多,spring的动态数据源是一个非常好的选择。它直接编码在代码里,直观但不易扩展。

如果只需要 读写分离 ,那么mysql官方驱动里的replication协议,是更加轻量级的选择。

上面的分库分表组件,都是大浪淘沙,最终的优胜品。这些组件不同于其他组件选型,方案一旦确定,几乎无法回退,所以要慎之又慎。

分库分表是小 case ,准备分库分表的阶段,才是重点:也就是数据同步。

四、数据同步

  • √ 推荐:canal

ZzeUBjM.png!mobile

国内使用 mysql 的公司居多,但postgresql凭借其优异的性能,使用率逐渐攀升。

不管什么数据库,实时数据同步工具,都是把自己模拟成一个从库,进行数据拉取和解析。具体来说,mysql是通过binlog进行同步;postgresql使用wal日志进行同步。

对mysql来说,canal是国内用的最多的方案;类似的databus也是比较好用的工具。

现在,canal、maxwell等工具,都支持将要同步的数据写入到mq中,进行后续处理,方便了很多。

对于ETL(抽取、清洗、转换)来说,基本上都是source、task、sink路线,与前面的功能对应。gobblin、datax、logstash、sqoop等,都是这样的工具。

它们的主要工作,就是怎么方便的定义配置文件,编写各种各样的数据源适配接口等。这些ETL工具,也可以作为数据同步(尤其是全量同步)的工具,通常是根据 ID ,或者 最后更新时间 等,进行处理。

binlog是实时增量工具,ETL工具做辅助。通常一个数据同步功能,需要多个组件的参与,他们共同组成一个整体。

五、通讯

  • √ 推荐:http+json,方便调试。高性能要求可选二进制协议

yeQJZjv.png!mobile

Java 中,netty已经成为当之无愧的网络开发框架,包括其上的 socketio (不要再和我提mina了)。对于http协议,有 common-httpclient ,以及更加轻量级的工具 okhttp 来支持。

对于一个rpc来说,要约定一个通讯方式和序列化方式。 json 是最常用的序列化方式,但是传输和解析成本大,xml等文本协议与其类似,都有很多冗余的信息; avrokryo 是二进制的序列化工具,没有这些缺点,但调试不便。

rpc是远程过程调用的意思,其中, thriftdubbogRPC 默认都是二进制序列化方式的socket通讯框架; feignhessian 都是 onhttp 的远程调用框架。

对了,gRPC的序列化工具是protobuf,一个压缩比很高的二进制序列化工具。

通常,服务的响应时间主要耗费在业务逻辑以及数据库上,通讯层耗时在其中的占比很小。可以根据自己公司的研发水平和业务规模来选择。

相关文章:

「网络开发」 使用Netty,我们到底在开发些什么?

「WS」 WebSocket协议 8 问

六、微服务

  • √ 推荐:(1) 注册中心:consul

  • (2)网关:nginx+Gateway

  • (3)配置中心:Apollo

  • (4)调用链:Skywalking

  • (5)熔断:resilience4j

QB7riev.png!mobile

我们不止一次说到微服务,这一次我们从围绕它的一堆支持框架,来窥探一下这个体系。是的,这里依然是在说 spring cloud

默认的注册中心 eureka 不再维护, consul 已经成为首选,它使用raft协议开发开箱即用。nacos、zookeeper等,都可以作为备选方案。其中nacos带有后台,比较适合国人使用习惯。

熔断组件,官方的 hystrix也 已经不维护了。推荐使用 resilience4j ,最近阿里的 sentinel 也表现强劲。

对于调用链来说,由于OpenTracing的兴起,有了很多新的面孔。推荐使用 jaeger 或者 skywalking 。spring cloud集成的sleuth+zipkin功能稍弱,甚至不如传统侵入式的cat。

配置中心是管理多环境配置文件的利器,尤其在你不想重启服务器的情况下进行配置更新。目前,开源中做的最好的要数 apollo ,并提供了对spring boot的支持。disconf使用也较为广泛。相对来说,spring cloud config功能就局限了些,用的很少。

网关方面,使用最多的就是 nginx ,在 nginx 之上,有基于lua脚本的 openrestry 。由于 openresty 的使用非常繁杂,所以有了kong这种封装级别更高的网关。

对于spring cloud来说,zuul系列推荐使用zuul2,zuul1是多线程阻塞的,有硬伤。spring-cloud-gateway是spring cloud亲生的,Spring Cloud 大力支持,基于 Spring5.0 的新特性 WebFlux 进行开发。底层网络通信框架采用的是 Netty,吞吐量高。

七、分布式工具

V7FRfmJ.png!mobile

大家都知道分布式系统zookeeper能用在很多场景,与其类似的还有基于raft协议的etcd和consul。

由于它们能够保证极高的一致性,所以用作协调工具是再好不过了。 用途集中在:配置中心、分布式锁、命名服务、分布式协调、master选举等场所。

对于分布式事务方面,则有阿里的fescar工具进行支持。但如非特别的必要,还是使用 柔性事务 ,追寻 最终一致性 ,比较好。

八、监控系统

  • √ 推荐:prometheus + grafana + telegraf

  • 日志收集:大量ELKB,小量loki

yqInMbQ.png!mobile

监控系统组件种类繁多,目前,最流行的大概就是上面四类。

zabbix在主机数量不多的情况下,是非常好的选择。

prometheus来势凶猛,大有一统天下的架势。它也可以使用更加漂亮的grafana进行前端展示。

influxdata的influxdb和telegraf组件,都比较好用,主要是功能很全。

使用es存储的elkb工具链,也是一个较好的选择。我所知道的很多公司,都在用。

相关文档:

九、调度

  • √ 推荐:xxl-job

zqa6Nfv.png!mobile

大家可能都用过cron表达式。这个表达式,最初就是来自linux的crontab工具。

quartz是java中比较古老的调度方案,分布式调度采用数据库锁的方式,管理界面需要自行开发。

elastic-job-cloud应用比较广泛,但系统运维复杂,学习成本较高。相对来说,xxl-job就更加轻量级一些。中国人开发的系统,后台都比较漂亮。

十、入口工具

  • √ 推荐:lvs

    yqMNR3f.png!mobile

为了统一用户的访问路口,一般会使用一些入口工具进行支持。

其中,haproxy、lvs、keepalived等,使用非常广泛。

服务器一般采用稳定性较好的centos,并配备ansible工具进行支持,那叫一个爽。

十一、OLT(A)P

√ 推荐:ES

现在的企业,数据量都非常大,数据仓库是必须的。

2yYfQ3F.png!mobile

搜索方面,solr和elasticsearch比较流行,它们都是基于lucene的。solr比较成熟,稳定性更好一些,但实时搜索方面不如es。

列式存储方面,基于Hadoop 的hbase,使用最是广泛;基于LSM的leveldb写入性能优越,但目前主要是作为嵌入式引擎使用多一些。

tidb是国产新贵,兼容mysql协议,公司通过培训向外输出dba,未来可期。

时序数据库方面,opentsdb用在超大型监控系统多一些。druid和kudu,在处理多维度数据实时聚合方面,更胜一筹。

cassandra在刚出现时火了一段时间,虽然有facebook弃用的新闻,但生态已经形成,常年霸占数据库引擎前15名。

十二、CI/CD

jIF3qe.png!mobile

为了支持持续集成和虚拟化,除了耳熟能详的docker,我们还有其他工具。

jenkins是打包发布的首选,毕竟这么多年了,一直是老大哥。当然,写Idea的那家公司,还出了一个叫TeamCity的工具,操作界面非常流畅。

solor不得不说是一个神器,用了它之后,小伙伴们的代码一片飘红,我都快被吐沫星子给淹没了。

对于公司内部来说,一般使用gitlab搭建git服务器。其实,它里面的gitlab CI,也是非常好用的。

Harbor ,在 docker registry 基础上扩展了权限控制,审计,镜像同步,管理界面等治理 能力,推荐使用。

调度方面, k8s Google 开源,社区的强力推动,有大量的落地方案。 Rancher 对k8s进行了功能的拓展,实现了和k8s集群交互的一些便捷工具,包括执行命令行,管理多个 k8s集群,查看k8s集群节点的运行状态等,推荐集成。

十三、问题排查

b2quu2B.png!mobile

java经常发生内存溢出问题。使用jmap导出堆栈后,我一般使用mat进行深入分析。

如果在线上实时分析,有arthas和perf两款工具。

当然,有大批量的linux工具进行支持。

十四、本地工具

ABVbIjf.png!mobile

本地使用的jar包和工具,那就多了去了。下面仅仅提一下最最常用的几个。

数据库连接池方面,国内使用druid最多。目前,有号称速度最快的hikari数据库连接池,以及老掉牙的dbcp和c3p0。

json方面,国内使用fastjson最多,三天两头冒出个漏洞;国外则使用jackson多一些。它们的api都类似,jackson特性多一些,但fastjson更加容易使用。

工具包方面,虽然有各种commons包,guava首选。

End

今天是2020年9月08日。

这种文章,每一年我都会整理一次。有些新面孔,也有些被我个人t出局。架构选型,除了你本身对某项技术比较熟悉,用起来更放心。更多的是需要进行大量调研、对比,直到掌握。

技术日新月异,新瓶装旧酒,名词一箩筐,程序员很辛苦。唯有那背后的基础原理,大道至简的思想,经久不衰。

作者简介: 小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。

推荐阅读:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK