如果你正在做选型工作,或者想了解现在流行的一些技术,那么这篇文章就是为你准备的。图片来自Pexels本文涵盖14个方面,涉及上百个框架和工具。会有你喜欢的人,也可能会有你讨厌的人。这是我在日常工作中接触最多的工具,适用于各种规模的公司。如果大家有更好的,欢迎留言补充:消息队列缓存分库分表数据同步通讯微服务分布式工具监控系统调度入口工具OLT(A)PCI/CD排查本地工具消息队列推荐:吞吐量优先选择卡夫卡。稳定性优于RocketMQ。物联网:VerneMQ。大型分布式系统通常是异步的,使用消息总线。消息队列作为最重要的基础组件,在整个架构中扮演着极其重要的角色。异步通常意味着编程模型的改变,时效性会降低。Kafka是目前最常用的消息队列,尤其是在大数据方面,具有极高的吞吐量。RocketMQ和RabbitMQ都是电信级别的消息队列,在业务中应用非常广泛。相比之下,ActiveMQ使用最少,属于老一代的消息框架。Pulsar是为了解决Kafka上的一些问题而诞生的消息系统。它相对年轻,工具链有限。一些有进取心的团队进行了尝试,得到了很好的反响,但实际使用的并不多。具体来说,MQTT是一种协议,主要用于物联网,能够进行双向通信,属于消息队列的范畴。推荐使用VerneMQ。缓存推荐:堆上缓存使用默认的Caffeine。分布式缓存采用Redis的Cluster集群模式,但要注意使用限制。数据缓存是减轻数据库压力的有效途径。可分为单机Java内部缓存和分布式缓存。对于单机来说,Guava的LoadingCache和ehcache都是熟悉的面孔,但是SpringBoot选择Caffeine作为默认的堆内缓存,因为Caffeine速度更快。对于分布式缓存,首选是Redis,不要犹豫。由于Redis是单线程的(6.0支持多线程,但默认不开启),不适合做高耗时的操作。所以对于一些数据量比较大的缓存,比如图片、视频,使用老式的Memcached效果会好很多。JetCache是??一个基于Java的缓存系统包,提供了统一的API和注解来简化缓存的使用。类似于SpringCache,支持本地缓存和分布式缓存,也是简化开发的利器。分表推荐:ShardingSphere中的Sharding-JDBC。分库分表,几乎每个有一定规模的公司都会有自己的方案。目前驱动层推荐使用Sharding-JDBC(Apache已经包含),代理层推荐使用Mycat。如果你没有额外的运维团队,不想花钱买其他机器,那就选择前者。如果分库分表涉及的项目不多,Spring的动态数据源是一个非常好的选择。它直接编码在代码中,直观但不易扩展。如果只是需要读写分离,那么MySQL官方驱动中的Replication协议是更轻量级的选择。上面的分库分表组件都是最终的赢家。这些组件不同于其他组件选择。方案一旦确定,几乎不可能回滚,所以要慎之又慎。分库分表是一个小case,备库分表阶段是重点:即数据同步。数据同步推荐:Canal。国内大部分公司都使用MySQL,但PostgreSQL由于性能优异,使用率也逐渐提高。无论是什么数据库,实时数据同步工具都把自己模拟成一个从库,进行数据拉取和分析。具体来说,MySQL是通过Binlog进行同步的;PostgreSQL使用Wallog进行同步。对于MySQL,Canal是国内使用最多的方案;类似Databus也是一个比较好用的工具。现在Canal、Maxwell等工具都支持将需要同步的数据写入MQ进行后续处理,方便多了。对于ETL(extraction,cleaning,transformation),基本上都是Source,Task,Sink路线,对应前面的功能。Gobblin、Datax、Logstash、Sqoop等都是这样的工具。他们的主要工作是如何方便的定义配置文件,编写各种数据源适配接口。这些ETL工具也可以作为数据同步(特别是全量同步)的工具,通常是根据ID,或者最后更新时间等,进行处理。Binlog是一个实时增量的工具,辅以ETL工具。通常一个数据同步功能需要多个组件的参与,它们共同构成一个整体。通信推荐:HTTP+Json,方便调试。高性能需要可选的二进制协议。在Java中,Netty成为了当之无愧的网络开发框架,包括上面的socketio(别跟我提mina了)。对于HTTP协议,有common-httpclient,还有一个更轻量级的工具Okhttp来支持。对于RPC,必须约定通信方法和序列化方法。Json是最常用的序列化方式,但是传输和解析的成本很高。类似于XML等文本协议,存在大量冗余信息;Avro和Kryo??是二进制序列化工具,没有这些缺点,但调试不方便。RPC表示远程过程调用。其中Thrift、Dubbo、gRPC默认都是二进制序列化的Socket通信框架;Feign和Hessian是Onhttp远程调用框架。对了,gRPC的序列化工具是Protobuf,一个压缩比很高的二进制序列化工具。通常,服务的响应时间主要花在业务逻辑和数据库上,通信层所占比例很小。您可以根据贵公司的研发水平和业务规模进行选择。微服务推荐:注册中心:Consul。网关:Nginx+网关。配置中心:Apollo。调用链:Skywalking。断路器:Resilience4j。我们不止一次地谈到微服务,这次我们将从围绕它的一堆支撑框架中窥视这个系统。是的,我们这里还是在说SpringCloud。默认注册中心Eureka不再维护,Consul成为首选。它使用Raft协议进行开箱即用的开发。Nacos、Zookeeper等都可以作为替代。其中Nacos有后台,更适合国人的使用习惯。Fuse组件,Hystrix官方不再维护。推荐使用Resilience4j,最近阿里的Sentinel也表现强劲。对于调用链,由于OpenTracing的兴起,出现了很多新面孔。推荐Jaeger或Skywalking。SpringCloud集成的Sleuth+Zipkin稍微弱了一些,甚至还不如传统的侵入式Cat。配置中心是管理多环境配置文件的强大工具,尤其是当您不想重启服务器进行配置更新时。目前开源最好的是Apollo,它提供了对SpringBoot的支持。Disconf也被广泛使用。相对来说,SpringCloudConfig的功能有限,很少有人用到。在网关方面,Nginx是用得最多的。在Nginx之上,还有基于Lua脚本的Openrestry。由于Openresty的使用非常复杂,所以有一个封装程度更高的网关,Kong。对于SpringCloud,Zuul系列推荐使用Zuul2,而Zuul1多线程阻塞,有缺陷。Spring-Cloud-Gateway是SpringCloud原生的,受到SpringCloud的大力支持,基于Spring5.0的新特性WebFlux开发而成。底层网络通信框架采用Netty,吞吐量高。分布式工具大家都知道分布式系统Zookeeper可以用在很多场景,类似于etcd和基于Raft协议的Consul。由于它们保证了极高的一致性,因此它们非常适合用作协调工具。目的集中在:配置中心、分布式锁、命名服务、分布式协调、Master选举等地方。对于分布式事务,阿里的Fescar工具是支持的。但如果不是必须的话,还是用灵活的事务,追求最终一致性比较好。监控系统推荐:Prometheus+Grafana+Telegraf。日志收集:很多ELKB,小Loki。监控系统组件有多种类型。目前比较流行的大概就是以上四类了。Zabbix在主机数量少的时候是一个非常好的选择。普罗米修斯来势汹汹,一副要一统天下的样子。也可以使用更漂亮的Grafana做前端展示。Influxdata的Influxdb和Telegraf组件都比较好用,主要是功能齐全。使用存储在ES中的ELKB工具链也是一个更好的选择。我认识的许多公司都在使用它。调度推荐:XXL-Job。您可能都使用过Cron表达式。这个表达式最初来自Linux的Crontab工具。Quartz是Java中较旧的调度方案。分布式调度使用数据库锁,管理接口需要自己开发。Elastic-Job-Cloud应用广泛,但系统运维复杂,学习成本高。相对来说,XXL-Job更加轻量。中国人开发的系统背景更漂亮。推荐入门工具:LVS。为了统一用户的访问路口,一般会使用一些入口工具进行支持。其中应用广泛的有Haproxy、LVS、Keepalived等。服务器一般使用稳定性较好的Centos,并配有Ansible工具支持,很cool。OLT(A)P建议:ES。在当今的企业中,数据量非常大,数据仓库是必不可少的。在搜索方面,Solr和Elasticsearch比较流行,都是基于Lucene的。Solr更成熟,更稳定,但在实时搜索方面不如ES。在列式存储方面,基于Hadoop的Hbase应用最为广泛;基于LSM的LevelDB具有优越的写入性能,但目前主要用作嵌入式引擎。TiDB是国内的新贵,兼容MySQL协议。公司通过培训输出DBA,未来可期。在时序数据库方面,OpentsDB更常用于超大型监控系统。Druid和Kudu更擅长处理多维数据的实时聚合。Cassandra刚出现时已经流行了一段时间。虽然有Facebook弃用的消息,但生态已经形成,常年占据数据库引擎前15名。为了支持CI/CD的持续集成和虚拟化,除了熟悉的Docker之外,我们还有其他工具。Jenkins是包发布的首选。毕竟是这么多年的大哥。当然,编写Idea的公司还发布了一个名为TeamCity的工具,界面非常流畅。Solor不得不说是神器。用了之后小伙伴的代码满天飞,我都快被吐星给淹没了。对于内部公司,一般使用Gitlab来搭建Git服务器。其实里面的GitlabCI也很好用。Harbor在DockerRegistry的基础上,扩展了权限控制、审计、镜像同步、管理接口等管理能力,推荐使用。在调度方面,K8s,Google开源,社区的大力推广,有大量的实现方案。Rancher扩展了K8s的功能,实现了一些与K8s集群交互的便捷工具,包括执行命令行、管理多个K8s集群、查看K8s集群节点运行状态等,推荐集成。排除故障Java经常会出现内存不足的问题。用Jmap导出堆栈后,我一般会用Mat进行深入分析。在线实时分析有两个工具,Arthas和Perf。当然,有大量的Linux工具支持它。本地工具本地使用的jar包和工具有很多。下面只提到一些最常用的。在数据库连接池方面,国内用的最多的是Druid。目前有号称最快的Hikari数据库连接池,还有老牌的dbcp和c3p0。Json方面,国内用的最多的是Fastjson,每三天就会出现一个漏洞;杰克逊在国外使用较多。它们的API相似,Jackson的功能更多,但Fastjson更容易使用。在工具包方面,虽然有各种Commons包,但Guava是首选。总结一下架构选型,除了对某项技术比较熟悉,用起来更放心。更重要的是,它需要大量的研究和比较,直到掌握为止。技术日新月异,新瓶装旧酒,名词一大堆,程序员很辛苦。唯有其背后的基本原则,大道至简的理念,经久不衰。作者:品味小姐姐简介:一个不允许程序员走弯路的公众号。专注于基础架构和Linux。十年架构,每天百亿流量,与你探讨高并发世界,给你不一样的滋味。编辑:陶佳龙来源:转载自公众号味觉小姐(ID:xjjdog)
