作为一名架构师,老板要求你把公司的后端技术栈搞一下,那你该如何去做呢?
对我而言我,我的答案是综合考虑下面的这些内容然后进行决定。
本文福利, 免费领取C/C++ 开发学习资料包、技术视频/代码,1000道大厂面试题,内容包括(C++基础,网络编程,数据库,中间件,后端开发/音视频开发/Qt开发/游戏开发/Linuxn内核等进阶学习资料和最佳学习路线)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
整个后台技术架构,主要包括 4 个层面的内容:
结合以上的的 4 个层面的内容,整个后台技术栈的结构如图1 所示:
图1 后台技术栈结构
咱们一个个系统和组件的做选型,最终形成我们的后台技术栈。
团队协助基础工具链的选型和培训
团队协助基础工具链, 主要是三大管理
项目管理软件是整个业务的需求,问题,流程等等的集中地,大家的跨部门沟通协同大多依赖于项目管理工具。
有一些 SaaS 的项目管理服务可以使用,但是很多时间不满足需求,此时我们可以选择一些开源的项目,这些项目本身有一定的定制能力,有丰富的插件可以使用,一般的创业公司需求基本上都能得到满足,常用的项目如下:
这些平台我都用过,有些甚至还搭建过,惭愧地说一句,盗版的,目前建议是 Jira。像银行,基本上conflue+jira是标配了。
搭建微服务开发基础设施
搭建微服务开发基础设施需要考虑多个方面,包括但不限于以下几点:
在搭建微服务开发基础设施之前,需要对自己的业务场景进行分析和规划,确定需要哪些基础设施和技术栈,然后再逐步实现。同时,需要注重可扩展性和可维护性,以便在业务发展过程中能够快速适应变化。
选择合适的微服务框架和技术栈
选择合适的微服务框架和技术栈需要考虑多个因素,包括以下几个方面:
常见的微服务框架和技术栈包括:
在选择时,需要根据具体的业务需求和开发团队技能来选择合适的微服务框架和技术栈。
建议选用 SpringCloud Alibaba+ Dubbo RPC + Dubbo-Go,两个原因:
(1) 高性能:做过的性能测试中, Dubbo比Feign性能 强10倍。
(2) 兼顾团队技术栈:可以跨Go 和Java 多语言微服务架构,Java技术栈的同学们,可以基于 Java开发业务微服务,这块侧重业务开发。Go 技术栈的同学们,可以基于 Go 开发高性能的 技术微服务,这块侧重技术开发和性能优化。
(3)功能和性能兼顾:Java侧重功能的快速开发, Go侧重性能的快速提升。
选择合适的RPC框架
维基百科对 RPC 的定义是:远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。
通俗来讲,一个完整的 RPC 调用过程,就是 Server 端实现了一个函数,客户端使用 RPC 框架提供的接口,调用这个函数的实现,并获取返回值的过程。
业界 RPC 框架大致分为两大流派,一种侧重跨语言调用,另一种是偏重服务治理。
跨语言调用型 RPC:
跨语言调用型的 RPC 框架有 Thrift、gRPC、Hessian、Hprose 等。这类 RPC 框架侧重于服务的跨语言调用,能够支持大部分的语言进行语言无关的调用,非常适合多语言调用场景。但这类框架没有服务发现相关机制,实际使用时需要代理层进行请求转发和负载均衡策略控制。
其中,gRPC 是 Google 开发的高性能、通用的开源 RPC 框架,其由 Google 主要面向移动应用开发并基于 HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以要实现框架的功能需要进一步的开发。
Hprose(High Performance Remote Object Service Engine)是一个 MIT 开源许可的新型轻量级跨语言跨平台的面向对象的高性能远程动态通讯中间件。
冶理型 RPC:
服务治理型的 RPC 框架的特点是功能丰富,提供高性能的远程调用、服务发现及服务治理能力,适用于大型服务的服务解耦及服务治理,对于特定语言(Java)的项目可以实现透明化接入。缺点是语言耦合度较高,跨语言支持难度较大。
国内常见的冶理型 RPC 框架如下:
但是 rpcx 基本只有一个人在维护,没有完善的社区,使用前要慎重。
建议选用Dubbo,两个原因:
(1) 高性能:性能测试案例中, Dubbo比Feign性能 强10倍
(2) 跨语言:可以跨Go 和Java 进行 双语言的 RPC调用,从而实现 多语言微服务架构。
选择和搭建高可用的注册中心
名字发现和服务发现分为两种模式,一个是客户端发现模式,一种是服务端发现模式。框架中常用的服务发现是客户端发现模式。
所谓服务端发现模式是指客户端通过一个负载均衡器向服务发送请求,负载均衡器查询服务注册表并把请求路由到一台可用的服务实例上。现在常用的负载均衡器都是此类模式,常用于微服务中。
所有的名字发现和服务发现都要依赖于一个可用性非常高的服务注册表,业界常用的服务注册表有如下三个:
etcd,一个高可用、分布式、一致性、key-value 方式的存储,被用在分享配置和服务发现中。两个著名的项目使用了它:Kubernetes 和 Cloud Foundry。Consul,一个发现和配置服务的工具,为客户端注册和发现服务提供了API,Consul还可以通过执行健康检查决定服务的可用性。Apache ZooKeeper,是一个广泛使用、高性能的针对分布式应用的协调服务。Apache ZooKeeper 本来是 Hadoop 的子工程,现在已经是顶级工程了。除此之外还有eureka, nacos等,大家可以根据相关的组件特性,选择适合自己的组件。
选择和搭建高可用的注册中心,需要考虑以下几个方面:
常见的注册中心有 ZooKeeper、Etcd、Consul 等,它们都具备高可用性和安全性,并且都支持服务发现和配置管理等功能。其中,ZooKeeper 是最早的分布式协调服务,具备成熟的生态系统和广泛的应用场景;Etcd 是 CoreOS 推出的开源分布式键值存储系统,具备高可用性和一致性保证;Consul 是 HashiCorp 推出的服务发现和配置管理工具,具备易用性和可扩展性。
在搭建高可用的注册中心时,需要采用集群部署的方式,避免单点故障。同时,为了保证数据的安全性,可以启用 SSL/TLS 加密功能,并采用访问控制机制来限制访问权限。
建议是高可用的nacos,也就是 nacos+mysql的版本
选择和搭建统一配置中心
随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、降级开关,灰度开关,参数的配置、服务器的地址、数据库配置等等,除此之外,对后台程序配置的要求也越来越高:配置修改后实时生效,灰度发布,分环境、分用户,分集群管理配置,完善的权限、审核机制等等,在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求,需要统一的、基础的配置系统
统一配置系统是指在一个大型系统中,将所有的配置信息集中管理,以便于对系统进行管理和维护。常见的统一配置系统架构包括以下几个组件:
在实际应用中,可以选择使用开源的配置中心工具,如 ZooKeeper、Etcd、Consul 、Nacos、Apollo等,也可以自己开发一套配置中心系统。
同时,还需要根据实际情况选择合适的配置客户端和配置发布工具。在配置管理和监控方面,可以使用一些开源的工具或者自己开发一套系统。总之,统一配置系统的架构需要根据实际需求进行设计和选择。
建议是高可用的nacos,也就是 nacos+mysql的版本
选择和搭建高性能的缓存中间件
选择和搭建高性能的缓存中间件需要考虑多个因素,包括性能、可靠性、可扩展性、易用性等。以下是一些常见的高性能缓存中间件:
在搭建高性能缓存中间件时,需要考虑以下几个方面:
总之,选择和搭建高性能缓存中间件需要综合考虑多个因素,根据具体需求和场景进行选择和配置。
建议是高可用的redis cluster
要特别注意的是,redis关系到系统的高可用,很容易出生产事故。
如果redis出现big key,在高并发场景下,很容易出现系统瘫痪,严重影响系统的可用性,导致系统瘫痪。
选择和搭建高性能的消息中间件
消息中间件在后台系统中是必不可少的一个组件,一般我们会在以下场景中使用消息中间件:
异步处理是使用消息中间件的一个主要原因,在工作中最常见的异步场景有用户注册成功后需要发送注册成功邮件、缓存过期时先返回老的数据,然后异步更新缓存、异步写日志等等;通过异步处理,可以减少主流程的等待响应时间,让非主流程或者非重要业务通过消息中间件做集中的异步处理。
比如在电商系统中,当用户成功支付完成订单后,需要将支付结果给通知ERP系统、发票系统、WMS、推荐系统、搜索系统、风控系统等进行业务处理;这些业务处理不需要实时处理、不需要强一致,只需要最终一致性即可,因此可以通过消息中间件进行系统解耦。通过这种系统解耦还可以应对未来不明确的系统需求。
当系统遇到大流量时,监控图上会看到一个一个的山峰样的流量图,通过使用消息中间件将大流量的请求放入队列,通过消费者程序将队列中的处理请求慢慢消化,达到消峰填谷的效果。最典型的场景是秒杀系统,在电商的秒杀系统中下单服务往往会是系统的瓶颈,因为下单需要对库存等做数据库操作,需要保证强一致性,此时使用消息中间件进行下单排队和流控,让下单服务慢慢把队列中的单处理完,保护下单服务,以达到削峰填谷的作用。
业界消息中间件是一个非常通用的东西,大家在做选型时有使用开源的,也有自己造轮子的,甚至有直接用 MySQL 或 Redis 做队列的,关键看是否满足你的需求.
选择合适的消息中间件需要考虑多个因素,包括但不限于:
如果需要处理大量的消息并且需要高吞吐量和低延迟,可以考虑使用 Kafka。如果需要实时处理消息并且需要高可用性和容错性,可以考虑使用 RabbitMQ。如果需要处理轻量级的消息,并且需要高性能和低延迟,可以考虑使用 Redis。
在选择消息中间件时,需要根据具体的业务需求和技术栈进行综合考虑,选择最合适的中间件。
目前建议 kafka + RocketMQ
选择和搭建高性能的关系数据库
关系数据库分为两种,一种是传统关系数据,如 Oracle,MySQL,Maria,DB2,PostgreSQL 等等,另一种是 NewSQL,即至少要满足以下五点的新型关系数据库:
传统关系数据库用得最多的是 MySQL,成熟,稳定,一些基本的需求都能满足,在一定数据量级之前基本单机传统数据库都可以搞定,而且现在较多的开源系统都是基于 MySQL,开箱即用,再加上主从同步和前端缓存,百万 pv 的应用都可以搞定了。
不过 CentOS 7 已经放弃了 MySQL,而改使用 MariaDB。MariaDB 数据库管理系统是 MySQ L的一个分支,主要由开源社区在维护,采用 GPL 授权许可。开发这个分支的原因之一是:甲骨文公司收购了 MySQL 后,有将 MySQL 闭源的潜在风险,因此社区采用分支的方式来避开这个风险。
在 Google 发布了 F1: A Distributed SQL Database That Scales 和 Spanner: Google’s Globally-Distributed Databasa 之后,业界开始流行起 NewSQL。于是有了 CockroachDB,以及PingCAP的 TiDB。
国内已经有比较多的公司使用 TiDB,之前在创业公司时在大数据分析时已经开始应用 TiDB,当时应用的主要原因是 MySQL 要使用分库分表,逻辑开发比较复杂,扩展性不够。
选择和搭建高性能的NoSQL
NoSQL 顾名思义就是 Not-Only SQL,也有人说是 No – SQL,个人偏向于 Not-Only SQL,它并不是用来替代关系库,而是作为关系型数据库的补充而存在。
常见 NoSQL 有4个类型:
除了以上4种类型,还有一些特种的数据库,如对象数据库,XML 数据库,这些都有针对性对某些存储类型做了优化的数据库。
在实际应用场景中,何时使用关系数据库,何时使用 NoSQL,使用哪种类型的数据库,这是我们在做架构选型时一个非常重要的考量,甚至会影响整个架构的方案。
CICD发布系统/部署系统的架构
软件生产的层面看,代码到最终服务的典型流程如图2 所示:
图2 流程图
从上图中可以看出,从开发人员写下代码到服务最终用户是一个漫长过程,整体可以分成三个阶段:
发布系统集成了制品管理,发布流程,权限控制,线上环境版本变更,灰度发布,线上服务回滚等几方面的内容,是开发人员工作结晶最终呈现的重要通道。
CI/CD 发布系统/部署系统的架构通常包括以下组件:
这些组件可以根据实际需求进行选择和组合,形成一个完整的 CI/CD 发布系统/部署系统。
其中,持续集成工具和部署工具是核心组件,它们负责自动化构建、测试、打包和部署应用程序,从而实现快速、可靠、可重复的软件发布流程。
项目初期可以集成 Jenkins + Gitlab + Harbor,以上方案基本包括制品管理,发布流程,权限控制,线上环境版本变更,灰度发布(需要自己实现),线上服务回滚等功能。
代码管理工具选型
代码是项目的命脉之一,代码管理很重要,常见的考量点包括两块:
安全和权限管理,将代码放到内网并且对于关系公司命脉的核心代码做严格的代码控制和机器的物理隔离;代码管理工具,Git 作为代码管理的不二之选,你值得拥有。
GitLab 是当今最火的开源 Git 托管服务端,没有之一,虽然有企业版,但是其社区版基本能满足我们大部分需求,结合 Gerrit 做 Code review,基本就完美了。
当然 GitLab 也有代码对比,但没 Gerrit 直观。
Gerrit 比 GitLab 提供了更好的代码检查界面与主线管理体验,更适合在对代码质量有高要求的文化下使用。
持续集成工具选型
持续集成简称 CI(continuous integration),是一种软件开发实践,即团队开发成员经常集成他们的工作,每天可能会发生多次集成。
每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
持续集成为研发流程提供了代码分支管理/比对、编译、检查、发布物输出等基础工作,为测试的覆盖率版本编译、生成等提供统一支持。
业界免费的持续集成工具中系统我们有如下一些选择:
自动化测试平台的架构
接下来,就是自动化测试平台的搭建。
搭建自动化测试平台需要考虑以下几个方面:
以上是搭建自动化测试平台的一般步骤,具体实现方式还需要根据实际情况进行调整。
可以结合 SpringBoot + TestNG 测试框架,搭建自己的 自动化测试平台
提示,不用自己从0到1 去搭建自动化测试平台,可以基于开源的自动化测试平台进行改造。
下面的两个测试平台,就是非常好的改造项目:
360度全方位监控和维护的架构
360度全方位监控和维护的架构包括
日志系统
日志系统一般包括打日志,采集,中转,收集,存储,分析,呈现,搜索还有分发等。
一些特殊的如染色,全链条跟踪或者监控都可能需要依赖于日志系统实现。
日志系统的建设不仅仅是工具的建设,还有规范和组件的建设,最好一些基本的日志在框架和组件层面加就行了,比如全链接跟踪之类的。
对于常规日志系统ELK能满足大部分的需求,ELK 包括如下组件:
ElasticSearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,RESTful 风格接口,多数据源,自动搜索负载等。
Logstash 是一个完全开源的工具,它可以对你的日志进行收集、分析,并将其存储供以后使用。Kibana 是一个开源和免费的工具,它可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
Filebeat 已经完全替代了 Logstash-Forwarder 成为新一代的日志采集器,同时鉴于它轻量、安全等特点,越来越多人开始使用它。
因为免费的 ELK 没有任何安全机制,所以这里使用了 Nginx 作反向代理,避免用户直接访问 Kibana 服务器。
加上配置 Nginx 实现简单的用户认证,一定程度上提高安全性。
另外,Nginx 本身具有负载均衡的作用,能够提高系统访问性能。
ELK 架构如图3 所示:
图3 ELK 流程图
对于有实时计算的需求,可以使用 Flume + Kafka + Storm + MySQL 方案,一 般架构如图4 所示:
图4 实时分析系统架构图
其中:
Flume 是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的日志收集系统,支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume 提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。Kafka 是由 Apache 软件基金会开发的一个开源流处理平台,由 Scala 和 Java 编写。其本质上是一个“按照分布式事务日志架构的大规模发布/订阅消息队列”,它以可水平扩展和高吞吐率而被广泛使用。
Kafka 追求的是高吞吐量、高负载,Flume 追求的是数据的多样性,二者结合起来简直完美。
监控系统
监控系统只包含与后台相关的,这里主要是两块,一个是操作系统层的监控,比如机器负载,IO,网络流量,CPU,内存等操作系统指标的监控。
另一个是服务质量和业务质量的监控,比如服务的可用性,成功率,失败率,容量,QPS 等等。
常见业务的监控系统先有操作系统层面的监控(这部分较成熟),然后扩展出其它监控,如 Zabbix,小米的 Open-Falcon,也有一出来就是两者都支持的,如 Prometheus。
如果对业务监控要求比较高一些,在创业选型中建议可以优先考虑 Prometheus。
这里有一个有趣的分布,如图5 所示。
图5 监控系统分布
亚洲区域使用 Zabbix 较多,而美洲和欧洲,以及澳大利亚使用 Prometheus 居多,换句话说,英文国家地区(发达国家?)使用 Prometheus 较多。
Prometheus 是由 SoundCloud 开发的开源监控报警系统和时序列数据库(TSDB)。
Prometheus 使用 Go 语言开发,是 Google BorgMon 监控系统的开源版本。
相对于其它监控系统使用的 push 数据的方式,Prometheus 使用的是 pull 的方式,其架构如图6 所示:
图6 Prometheus 架构图
如上图所示,Prometheus 包含的主要组件如下:
根据这些目标会,Server 定时去抓取 metrics 数据,每个抓取目标需要暴露一个 http 服务的接口给它定时抓取。
与传统的数据采集组件不同的是,它并不向中央服务器发送数据,而是等待中央服务器主动前来抓取。
创业公司选择 Prometheus + Grafana 的方案,再加上统一的服务框架(如 gRPC),可以满足大部分中小团队的监控需求。
生产环境高并发高吞吐负载均衡部署架构
高并发高吞吐负载均衡链路架构,包括:
DNS的选型和使用设计
DNS 是一个很通用的服务,创业公司基本上选择一个合适的云厂商就行了,国内主要是两家:
阿里万网:阿里 2014 年收购了万网,整合了其域名服务,最终形成了现在的阿里万网,其中就包含 DNS 这块的服务;
腾讯 DNSPod:腾讯 2012 年以 4000 万收购 DNSPod 100% 股份,主要提供域名解析和一些防护功能;
如果你的业务是在国内,主要就是这两家,选 一个就好,像今日头条这样的企业用的也是 DNSPod 的服务,除非一些特殊的原因才需要自建,比如一些 CDN 厂商,或者对区域有特殊限制的。
要实惠一点用阿里最便宜的基础版就好了,要成功率高一些,还是用 DNSPod 的贵的那种。
在国外还是选择亚马逊吧,阿里的 DNS 服务只有在日本和美国有节点,东南亚最近才开始部点, DNSPod 也只有美国和日本,像一些出海的企业,其选择的云服务基本都是亚马逊。
如果是线上产品,DNS 强烈建议用付费版,阿里的那几十块钱的付费版基本可以满足需求。如果还需要一些按省份或按区域调试的逻辑,则需要加钱,一年也就几百块,省钱省力。
如果是国外,优先选择亚马逊,如果需要国内外互通并且有自己的 APP 的话,建议还是自己实现一些容灾逻辑或者智能调度,因为没有一个现成的 DNS 服务能同时较好的满足国内外场景,或者用多个域名,不同的域名走不同的 DNS 。
LB(负载均衡)的选型和使用设计
LB(负载均衡)是一个通用服务,一般云厂商的 LB 服务基本都会如下功能:
如果你线上的服务机器都是用的云服务,并且是在同一个云服务商的话,可以直接使用云服务商提供的 LB 服务,如阿里云的 SLB,腾讯云的 CLB,亚马逊的 ELB 等等。如果是自建机房基本都是 LVS + Nginx。
CDN的选型和使用设计
CDN 现在已经是一个很红很红的市场,基本上只能挣一些辛苦钱,都是贴着成本在卖。国内以网宿为龙头,他们家占据整个国内市场份额的 40% 以上,后面就是腾讯,阿里。网宿有很大一部分是因为直播的兴起而崛起。
国外,Amazon 和 Akamai合起来占比大概在 50%,曾经的国际市场老大 Akamai 拥有全球超一半的份额,在 Amazon CDN入局后,份额跌去了将近 20%,众多中小企业都转向后者,Akamai 也是无能为力。
国内出海的 CDN 厂商,更多的是为国内的出海企业服务,三家大一点的 CDN 服务商里面也就网宿的节点多一些,但是也多不了多少。阿里和腾讯还处于前期阶段,仅少部分国家有节点。
好的架构不是一蹴而就的,而是演变出来的。对于一个问题,架构师需要做出正确的判断,而这个“正确”与否,在不同的场景下,也是不同的,也就是说答案是开放的。那么提高自己的技术能力、认知能力,就相当重要了。这就要求我们不断地学习,保持对技术的敏锐,才能做出正确的选择。
路漫漫其修远兮,架构求索无止尽也。
本文福利, 免费领取C/C++ 开发学习资料包、技术视频/代码,1000道大厂面试题,内容包括(C++基础,网络编程,数据库,中间件,后端开发/音视频开发/Qt开发/游戏开发/Linuxn内核等进阶学习资料和最佳学习路线)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓