從零開始搭建創(chuàng)業(yè)公司后臺技術(shù)棧
- 前言 -
語言:用了哪些開發(fā)語言,如:C++/Java/Go/PHP/Python/Ruby 等等; 組件:用了哪些組件,如:MQ 組件,數(shù)據(jù)庫組件等等; 流程:怎樣的流程和規(guī)范,如:開發(fā)流程,項(xiàng)目流程,發(fā)布流程,監(jiān)控告警流程,代碼規(guī)范等等; 系統(tǒng):系統(tǒng)化建設(shè),上面的流程需要有系統(tǒng)來保證,如:規(guī)范發(fā)布流程的發(fā)布系統(tǒng),代碼管理系統(tǒng)等等;


- 各系統(tǒng)組件選型 -
1、項(xiàng)目管理/Bug管理/問題管理
Redmine:用 Ruby 開發(fā)的,有較多的插件可以使用,能自定義字段,集成了項(xiàng)目管理,Bug 問題跟蹤,WIKI 等功能,不過好多插件 N 年沒有更新了; Phabricator:用 PHP 開發(fā)的,F(xiàn)acebook 之前的內(nèi)部工具,開發(fā)這工具的哥們離職后自己搞了一個公司專門做這個軟件,集成了代碼托管, Code Review,任務(wù)管理,文檔管理,問題跟蹤等功能,強(qiáng)烈推薦較敏捷的團(tuán)隊(duì)使用; Jira:用 Java 開發(fā)的,有用戶故事,task 拆分,燃盡圖等等,可以做項(xiàng)目管理,也可以應(yīng)用于跨部門溝通場景,較強(qiáng)大; 悟空 CRM :這個不是項(xiàng)目管理,這個是客戶管理,之所以在這里提出來,是因?yàn)樵?To B 的創(chuàng)業(yè)公司里面,往往是以客戶為核心來做事情的,可以將項(xiàng)目管理和問題跟進(jìn)的在悟空 CRM 上面來做,他的開源版本已經(jīng)基本實(shí)現(xiàn)了 CR< 的核心 功能,還帶有一個任務(wù)管理功能,用于問題跟進(jìn),不過用這個的話,還是需要另一個項(xiàng)目管理的軟件協(xié)助,順便說一嘴,這個系統(tǒng)的代碼寫得很難維護(hù),只能適用于客戶規(guī)模?。?萬以內(nèi))時。
2、DNS
阿里萬網(wǎng):阿里 2014 年收購了萬網(wǎng),整合了其域名服務(wù),最終形成了現(xiàn)在的阿里萬網(wǎng),其中就包含 DNS 這塊的服務(wù); 騰訊 DNSPod:騰訊 2012 年以 4000 萬收購 DNSPod 100% 股份,主要提供域名解析和一些防護(hù)功能;
3、LB(負(fù)載均衡)
支持四層協(xié)議請求(包括 TCP、UDP 協(xié)議); 支持七層協(xié)議請求(包括 HTTP、HTTPS 協(xié)議); 集中化的證書管理系統(tǒng)支持 HTTPS 協(xié)議; 健康檢查;
4、CDN
5、RPC 框架
Dubbo:Dubbo 是阿里巴巴公司開源的一個 Java 高性能優(yōu)秀的服務(wù)框架,使得應(yīng)用可通過高性能的 RPC 實(shí)現(xiàn)服務(wù)的輸出和輸入功能,可以和 Spring 框架無縫集成。當(dāng)年在淘寶內(nèi)部,Dubbo 由于跟淘寶另一個類似的框架 HSF 有競爭關(guān)系,導(dǎo)致 Dubbo 團(tuán)隊(duì)解散,最近又活過來了,有專職同學(xué)投入。 DubboX:DubboX 是由當(dāng)當(dāng)在基于 Dubbo 框架擴(kuò)展的一個 RPC 框架,支持 REST 風(fēng)格的遠(yuǎn)程調(diào)用、Kryo/FST 序列化,增加了一些新的feature。Motan:Motan 是新浪微博開源的一個 Java 框架。它誕生的比較晚,起于 2013 年,2016 年 5 月開源。Motan 在微博平臺中已經(jīng)廣泛應(yīng)用,每天為數(shù)百個服務(wù)完成近千億次的調(diào)用。 rpcx:rpcx 是一個類似阿里巴巴 Dubbo 和微博 Motan 的分布式的 RPC 服務(wù)框架,基于 Golang net/rpc 實(shí)現(xiàn)。但是 rpcx 基本只有一個人在維護(hù),沒有完善的社區(qū),使用前要慎重,之前做 Golang 的 RPC 選型時也有考慮這個,最終還是放棄了,選擇了 gRPC,如果想自己自研一個 RPC 框架,可以參考學(xué)習(xí)一下。
6、名字發(fā)現(xiàn)/服務(wù)發(fā)現(xiàn)
etcd,一個高可用、分布式、一致性、key-value 方式的存儲,被用在分享配置和服務(wù)發(fā)現(xiàn)中。兩個著名的項(xiàng)目使用了它:Kubernetes 和 Cloud Foundry。 Consul,一個發(fā)現(xiàn)和配置服務(wù)的工具,為客戶端注冊和發(fā)現(xiàn)服務(wù)提供了API,Consul還可以通過執(zhí)行健康檢查決定服務(wù)的可用性。 Apache ZooKeeper,是一個廣泛使用、高性能的針對分布式應(yīng)用的協(xié)調(diào)服務(wù)。Apache ZooKeeper 本來是 Hadoop 的子工程,現(xiàn)在已經(jīng)是頂級工程了。
7、關(guān)系數(shù)據(jù)庫
完整地支持 SQL,支持 JOIN / GROUP BY /子查詢等復(fù)雜 SQL 查詢。 支持傳統(tǒng)數(shù)據(jù)標(biāo)配的 ACID 事務(wù),支持強(qiáng)隔離級別。 具有彈性伸縮的能力,擴(kuò)容縮容對于業(yè)務(wù)層完全透明。 真正的高可用,異地多活、故障恢復(fù)的過程不需要人為的接入,系統(tǒng)能夠自動地容災(zāi)和進(jìn)行強(qiáng)一致的數(shù)據(jù)恢復(fù)。 具備一定的大數(shù)據(jù)分析能力。
8、NoSQL
鍵值,適用于內(nèi)容緩存,適合混合工作負(fù)載并發(fā)高擴(kuò)展要求大的數(shù)據(jù)集,其優(yōu)點(diǎn)是簡單,查詢速度快,缺點(diǎn)是缺少結(jié)構(gòu)化數(shù)據(jù),常見的有 Redis,Memcache,BerkeleyDB 和 Voldemort 等等; 列式,以列簇式存儲,將同一列數(shù)據(jù)存在一起,常見于分布式的文件系統(tǒng),其中以 Hbase,Cassandra 為代表。Cassandra 多用于寫多讀少的場景,國內(nèi)用得比較多的有 360,大概 1500 臺機(jī)器的集群,國外大規(guī)模使用的公司比較多,如 eBay,Instagram,Apple 和沃爾瑪?shù)鹊龋?/section> 文檔,數(shù)據(jù)存儲方案非常適用承載大量不相關(guān)且結(jié)構(gòu)差別很大的復(fù)雜信息。性能介于 kv 和關(guān)系數(shù)據(jù)庫之間,它的靈感來于 lotus notes,常見的有 MongoDB,CouchDB 等等; 圖形,圖形數(shù)據(jù)庫擅長處理任何涉及關(guān)系的狀況。社交網(wǎng)絡(luò),推薦系統(tǒng)等。專注于構(gòu)建關(guān)系圖譜,需要對整個圖做計(jì)算才能得出結(jié)果,不容易做分布式的集群方案,常見的有 Neo4J,InfoGrid 等。
9、消息中間件
異步處理:異步處理是使用消息中間件的一個主要原因,在工作中最常見的異步場景有用戶注冊成功后需要發(fā)送注冊成功郵件、緩存過期時先返回老的數(shù)據(jù),然后異步更新緩存、異步寫日志等等;通過異步處理,可以減少主流程的等待響應(yīng)時間,讓非主流程或者非重要業(yè)務(wù)通過消息中間件做集中的異步處理。 系統(tǒng)解耦:比如在電商系統(tǒng)中,當(dāng)用戶成功支付完成訂單后,需要將支付結(jié)果給通知ERP系統(tǒng)、發(fā)票系統(tǒng)、WMS、推薦系統(tǒng)、搜索系統(tǒng)、風(fēng)控系統(tǒng)等進(jìn)行業(yè)務(wù)處理;這些業(yè)務(wù)處理不需要實(shí)時處理、不需要強(qiáng)一致,只需要最終一致性即可,因此可以通過消息中間件進(jìn)行系統(tǒng)解耦。通過這種系統(tǒng)解耦還可以應(yīng)對未來不明確的系統(tǒng)需求。 削峰填谷:當(dāng)系統(tǒng)遇到大流量時,監(jiān)控圖上會看到一個一個的山峰樣的流量圖,通過使用消息中間件將大流量的請求放入隊(duì)列,通過消費(fèi)者程序?qū)㈥?duì)列中的處理請求慢慢消化,達(dá)到消峰填谷的效果。最典型的場景是秒殺系統(tǒng),在電商的秒殺系統(tǒng)中下單服務(wù)往往會是系統(tǒng)的瓶頸,因?yàn)橄聠涡枰獙齑娴茸鰯?shù)據(jù)庫操作,需要保證強(qiáng)一致性,此時使用消息中間件進(jìn)行下單排隊(duì)和流控,讓下單服務(wù)慢慢把隊(duì)列中的單處理完,保護(hù)下單服務(wù),以達(dá)到削峰填谷的作用。

10、代碼管理
安全和權(quán)限管理,將代碼放到內(nèi)網(wǎng)并且對于關(guān)系公司命脈的核心代碼做嚴(yán)格的代碼控制和機(jī)器的物理隔離; 代碼管理工具,Git 作為代碼管理的不二之選,你值得擁有。GitLab 是當(dāng)今最火的開源 Git 托管服務(wù)端,沒有之一,雖然有企業(yè)版,但是其社區(qū)版基本能滿足我們大部分需求,結(jié)合 Gerrit 做 Code review,基本就完美了。當(dāng)然 GitLab 也有代碼對比,但沒 Gerrit 直觀。Gerrit 比 GitLab 提供了更好的代碼檢查界面與主線管理體驗(yàn),更適合在對代碼質(zhì)量有高要求的文化下使用。
11、持續(xù)集成
Jenkins:Java 寫的有強(qiáng)大的插件機(jī)制,MIT 協(xié)議開源 (免費(fèi),定制化程度高,它可以在多臺機(jī)器上進(jìn)行分布式地構(gòu)建和負(fù)載測試)。Jenkins 可以算是無所不能,基本沒有 Jenkins 做不了的,無論從小型團(tuán)隊(duì)到大型團(tuán)隊(duì) Jenkins 都可以搞定。不過如果要大規(guī)模使用,還是需要有人力來學(xué)習(xí)和維護(hù)。 TeamCity:TeamCity 與 Jenkins 相比使用更加友好,也是一個高度可定制化的平臺。但是用的人多了,TeamCity就要收費(fèi)了。 Strider:Strider 是一個開源的持續(xù)集成和部署平臺,使用 Node.js 實(shí)現(xiàn),存儲使用的是 MongoDB,BSD 許可證,概念上類似 Travis 和Jenkins。 GitLab CI:從GitLab 8.0開始,GitLab CI 就已經(jīng)集成在 GitLab,我們只要在項(xiàng)目中添加一個 .gitlab-ci.yml 文件,然后添加一個 Runner,即可進(jìn)行持續(xù)集成。并且 GitLab 與 Docker 有著非常好的相互協(xié)作的能力。免費(fèi)版與付費(fèi)版本不同可以參見這里:https://about.gitlab.com/products/feature-comparison/。 Travis:Travis 和 GitHub 強(qiáng)關(guān)聯(lián);閉源代碼使用 SaaS 還需考慮安全問題;不可定制;開源項(xiàng)目免費(fèi),其它收費(fèi)。 Go:Go 是 ThoughtWorks 公司最新的 Cruise Control 的化身。除了 ThoughtWorks 提供的商業(yè)支持,Go 是免費(fèi)的。它適用于 Windows,Mac 和各種 Linux 發(fā)行版。
12、日志系統(tǒng)
ElasticSearch 是個開源分布式搜索引擎,它的特點(diǎn)有:分布式,零配置,自動發(fā)現(xiàn),索引自動分片,索引副本機(jī)制,RESTful 風(fēng)格接口,多數(shù)據(jù)源,自動搜索負(fù)載等。 Logstash 是一個完全開源的工具,它可以對你的日志進(jìn)行收集、分析,并將其存儲供以后使用。 Kibana 是一個開源和免費(fèi)的工具,它可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助匯總、分析和搜索重要數(shù)據(jù)日志。 Filebeat 已經(jīng)完全替代了 Logstash-Forwarder 成為新一代的日志采集器,同時鑒于它輕量、安全等特點(diǎn),越來越多人開始使用它。


Flume 是一個分布式、可靠、和高可用的海量日志采集、聚合和傳輸?shù)娜罩臼占到y(tǒng),支持在日志系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方,用于收集數(shù)據(jù);同時,F(xiàn)lume 提供對數(shù)據(jù)進(jìn)行簡單處理,并寫到各種數(shù)據(jù)接受方(可定制)的能力。 Kafka 是由 Apache 軟件基金會開發(fā)的一個開源流處理平臺,由 Scala 和 Java 編寫。其本質(zhì)上是一個“按照分布式事務(wù)日志架構(gòu)的大規(guī)模發(fā)布/訂閱消息隊(duì)列”,它以可水平擴(kuò)展和高吞吐率而被廣泛使用。
13、監(jiān)控系統(tǒng)


Prometheus Server 主要負(fù)責(zé)數(shù)據(jù)采集和存儲,提供 PromQL 查詢語言的支持。Server 通過配置文件、文本文件、ZooKeeper、Consul、DNS SRV Lookup 等方式指定抓取目標(biāo)。根據(jù)這些目標(biāo)會,Server 定時去抓取 metrics 數(shù)據(jù),每個抓取目標(biāo)需要暴露一個 http 服務(wù)的接口給它定時抓取。 客戶端 SDK:官方提供的客戶端類庫有 Go、Java、Scala、Python、Ruby,其他還有很多第三方開發(fā)的類庫,支持 Nodejs、PHP、Erlang 等。 Push Gateway 支持臨時性 Job 主動推送指標(biāo)的中間網(wǎng)關(guān)。 Exporter Exporter 是 Prometheus 的一類數(shù)據(jù)采集組件的總稱。它負(fù)責(zé)從目標(biāo)處搜集數(shù)據(jù),并將其轉(zhuǎn)化為 Prometheus 支持的格式。與傳統(tǒng)的數(shù)據(jù)采集組件不同的是,它并不向中央服務(wù)器發(fā)送數(shù)據(jù),而是等待中央服務(wù)器主動前來抓取。Prometheus 提供多種類型的 Exporter 用于采集各種不同服務(wù)的運(yùn)行狀態(tài)。目前支持的有數(shù)據(jù)庫、硬件、消息中間件、存儲系統(tǒng)、HTTP 服務(wù)器、JMX 等。 Alertmanager:是一個單獨(dú)的服務(wù),可以支持 Prometheus 的查詢語句,提供十分靈活的報(bào)警方式。 Prometheus HTTP API 的查詢方式,自定義所需要的輸出。 Grafana 是一套開源的分析監(jiān)視平臺,支持 Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch 等數(shù)據(jù)源,其 UI 非常漂亮且高度定制化。
14、配置系統(tǒng)
基于 zk 和 etcd,支持界面和 api ,用數(shù)據(jù)庫來保存版本歷史,預(yù)案,走審核流程,最后下發(fā)到 zk 或 etcd 這種有推送能力的存儲里(服務(wù)注冊本身也是用 zk 或 etcd,選型就一塊了)??蛻舳硕贾苯雍?zk 或 etcd 打交道。至于灰度發(fā)布,各家不同,有一種實(shí)現(xiàn)是同時發(fā)布一個需要灰度的 IP 列表,客戶端監(jiān)聽到配置節(jié)點(diǎn)變化時,對比一下自己是否屬于該列表。PHP 這種無狀態(tài)的語言和其他 zk/etcd 不支持的語言,只好自己在客戶端的機(jī)器上起一個 Agent 來監(jiān)聽變化,再寫到配置文件或共享內(nèi)存,如 360 的 Qconf。 基于運(yùn)維自動化的配置文件的推送,審核流程,配置數(shù)據(jù)管理和方案一類似,下發(fā)時生成配置文件,基于運(yùn)維自動化工具如 Puppet,Ansible 推送到每個客戶端,而應(yīng)用則定時重新讀取這個外部的配置文件,灰度發(fā)布在下發(fā)配置時指定IP列表。
15、發(fā)布系統(tǒng)/部署系統(tǒng)

從代碼(Code)到成品庫(Artifact)這個階段主要對開發(fā)人員的代碼做持續(xù)構(gòu)建并把構(gòu)建產(chǎn)生的制品集中管理,是為部署系統(tǒng)準(zhǔn)備輸入內(nèi)容的階段。 從制品到可運(yùn)行服務(wù) 這個階段主要完成制品部署到指定環(huán)境,是部署系統(tǒng)的最基本工作內(nèi)容。 從開發(fā)環(huán)境到最終生產(chǎn)環(huán)境 這個階段主要完成一次變更在不同環(huán)境的遷移,是部署系統(tǒng)上線最終服務(wù)的核心能力。
16、跳板機(jī)
17、機(jī)器管理
是否簡單,是否需要每臺機(jī)器部署 Agent(客戶端) 語言的選擇(Puppet/Chef vs Ansible/SaltStack )開源技術(shù),不看官網(wǎng)不足以熟練,不懂源碼不足以精通;Puppet、Chef 基于 Ruby 開發(fā),Ansible、SaltStack 基于 Python 開發(fā)的 速度的選擇(Ansible vs SaltStack)Ansible 基于 SSH 協(xié)議傳輸數(shù)據(jù),SaltStack 使用消息隊(duì)列 zeroMQ 傳輸數(shù)據(jù);大規(guī)模并發(fā)的能力對于幾十臺-200 臺規(guī)模的兄弟來講,Ansible的性能也可接受,如果一次操作上千臺,用 salt 好一些。


- 創(chuàng)業(yè)公司的選擇 -
1、選擇合適的語言
選擇團(tuán)隊(duì)熟悉的/能掌控的,創(chuàng)業(yè)公司人少事多,無太多冗余讓研發(fā)團(tuán)隊(duì)熟悉新的語言,能快速上手,能快速出活,出了問題能快速解決的問題的語言才是好的選擇。 選擇更現(xiàn)代一些的,這里的現(xiàn)代是指語言本身已經(jīng)完成一些之前需要特殊處理的特性,比如內(nèi)存管理,線程等等。 選擇開源輪子多的或者社區(qū)活躍度高的,這個原則是為了保證在開發(fā)過程中減少投入,有穩(wěn)定可靠的輪子可以使用,遇到問題可以在網(wǎng)上快速搜索到答案。 選擇好招人的 一門合適的語言會讓創(chuàng)業(yè)團(tuán)隊(duì)減少招聘的成本,快速招到合適的人。 選擇能讓人有興趣的 與上面一點(diǎn)相關(guān),讓人感興趣,在后面留人時有用。
2、選擇合適的組件和云服務(wù)商
選擇靠譜的云服務(wù)商; 選擇云服務(wù)商的組件; 選擇成熟的開源組件,而不是最新出的組件; 選擇采用在一線互聯(lián)網(wǎng)公司落地并且開源的,且在社區(qū)內(nèi)形成良好口碑的產(chǎn)品; 開源社區(qū)活躍度;
3、制定流程和規(guī)范
制定開發(fā)的規(guī)范,代碼及代碼分支管理規(guī)范,關(guān)鍵性代碼僅少數(shù)人有權(quán)限; 制定發(fā)布流程規(guī)范,從發(fā)布系統(tǒng)落地; 制定運(yùn)維規(guī)范; 制定數(shù)據(jù)庫操作規(guī)范,收攏數(shù)據(jù)庫操作權(quán)限; 制定告警處理流程,做到告警有人看有人處理; 制定匯報(bào)機(jī)制,晨會/周報(bào);
4、自研和選型合適的輔助系統(tǒng)
5、選擇過程中需要思考的問題

- 基于云的創(chuàng)業(yè)公司后臺技術(shù)架構(gòu) -

參考資料
作者:潘錦
來源:phppan.com/2018/04/svr-stack
推薦閱讀: Spring Boot 集成 Swagger-Bootstrap-UI IDEA下創(chuàng)建SpringBoot項(xiàng)目實(shí)現(xiàn)動態(tài)登錄與注冊功能 老大懟我好幾次,不要隨便提 “分庫分表” 23 種設(shè)計(jì)模式的通俗解釋,雖然有點(diǎn)污,但是秒懂 最近面試BAT,整理一份面試資料《Java面試BAT通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。 獲取方式:關(guān)注公眾號并回復(fù) java 領(lǐng)取,更多內(nèi)容陸續(xù)奉上。 明天見(??ω??)??
評論
圖片
表情
