后端技术趋势指南|如何选择自己的技术方向
編程多條路,條條通羅馬
后臺大佬
后臺路線都是面對后臺服務器業(yè)務,比如web后臺服務器,視頻后臺服務器,搜索后臺服務器,游戲后臺服務器,直播后臺服務器,社交IM后臺服務器等等,大部分代碼和業(yè)務邏輯相關,想成為大佬,必須精通專業(yè)領域業(yè)務知識。
但同時也存在一些通用的技術要求, ?比如熟悉編程語言,數據結構與算法,?網絡編程,TCP/IP協(xié)議,數據庫,中間件,高性能,高可用技術。
后臺技術演進
架構演進
隨著 PC 局域網,特別是關系型數據庫的應用,基礎架構發(fā)展成了兩層架構;隨后是廣域網的發(fā)展,由單體的多層架構,出現了 SOA,EDA 架構盛行;接下來是虛擬機,再到今天的云計算基礎架構,又出現了微服務,之后是 Container as a Service、Serverless ,到最近很火原云生架構等,可以看到架構的變化都是要充分利用 IT 基礎設施。
業(yè)務目標演進
???????????????????以往互聯(lián)網流量爆發(fā)時代,先抗住流量峰值,高并發(fā)、高性能是,支持水平擴展是后臺設計的重要目標?。當前互聯(lián)網流量見頂,存量競爭加劇,后臺服務的穩(wěn)定性變得愈發(fā)重要,企業(yè)降本增效決心變強,研發(fā)效率,監(jiān)控運維平臺,自動化測試,CI/CD流水線等也變得重要起來。
后臺開發(fā)語言演進
服務器硬件資源昂貴年代,C++既能高性能,又能代碼復用(OOP編程),成了很多大廠后臺開發(fā)的主力語言。
第一代web后臺開發(fā)主流是PHP,那時候互聯(lián)網主流的后臺架構是LAMP架構,隨著電商興起,Android 手機普及,大數據出現,推動JAVA技術棧發(fā)展,JAVA成了互聯(lián)網主流后臺編程語言。
隨著云計算時代到來,云原生計算興起,Go語言生態(tài)發(fā)展穩(wěn)健,兼顧性能和開發(fā)速度,越來越多企業(yè)在生產中使用 Go語言落地業(yè)務,目前很多大廠后臺開發(fā)語言已經開始轉向Go。
人工智能發(fā)展,也推動Python語言發(fā)展,簡單,上手快,開發(fā)效率高,成了一些不在乎性能后臺組件的開發(fā)語言。
由于安全性,穩(wěn)定性越發(fā)重要,Rust有可能成后臺關鍵組件開發(fā)語言,兼顧性能和內存安全性,用來替換后臺系統(tǒng)核心的C++組件;
對于未來,Python、Go、Rust 成為后端未來最先考慮學習編程語言。
目前國內各個大廠主流后臺語言不盡相同:
騰訊偏向C++,Go等,Go越來越流行
阿里,拼多多,美團,京東偏向Java
字節(jié)偏向Go/Python
百度偏向C++
華為偏向C/C++
中間件高手
中間件(Middleware)一種應用于分布式系統(tǒng)的基礎軟件,自上世紀80年代誕生以來,在分布式環(huán)境中低調地發(fā)揮著重要作用。基于中間件,系統(tǒng)軟件與應用軟件之間實現了高效連接與溝通,應用開發(fā)得以提速。
消息中間件
ActiveMQ 的社區(qū)算是比較成熟,但是較目前來說,ActiveMQ 的性能比較差,而且版本迭代很慢,不推薦使用。
RabbitMQ 在吞吐量方面雖然稍遜于 Kafka 和 RocketMQ ,但是由于它基于 erlang 開發(fā),所以并發(fā)能力很強,性能極其好,延時很低,達到微秒級。但是也因為 RabbitMQ 基于 erlang 開發(fā),所以國內很少有公司有實力做erlang源碼級別的研究和定制。如果業(yè)務場景對并發(fā)量要求不是太高(十萬級、百萬級),那這四種消息隊列中,RabbitMQ 一定是你的首選。如果是大數據領域的實時計算、日志采集等場景,用 Kafka 是業(yè)內標準的,絕對沒問題,社區(qū)活躍度很高,絕對不會黃,何況幾乎是全世界這個領域的事實性規(guī)范。
RocketMQ 阿里出品,Java 系開源項目,源代碼我們可以直接閱讀,然后可以定制自己公司的MQ,并且 RocketMQ 有阿里巴巴的實際業(yè)務場景的實戰(zhàn)考驗。RocketMQ 社區(qū)活躍度相對較為一般,不過也還可以,文檔相對來說簡單一些。還有就是阿里出臺的技術,你得應對這個技術萬一被拋棄,社區(qū)黃掉的風險,如果你們公司有技術實力我覺得用RocketMQ 挺好的。
Kafka 的特點其實很明顯,就是僅僅提供較少的核心功能,但是提供超高的吞吐量,ms 級的延遲,極高的可用性以及可靠性,而且分布式可以任意擴展。同時 Kafka 最好是支撐較少的 topic 數量即可,保證其超高吞吐量。Kafka 唯一的一點劣勢是有可能消息重復消費,那么對數據準確性會造成極其輕微的影響,在大數據領域中以及日志采集中,這點輕微影響可以忽略。Kafka天然適合大數據實時計算以及日志收集。
下一代消息中間件Apache Pulsar:
?對比kafka
Apache Pulsar 和 Apache Kafka 之間的根本區(qū)別在于 Apache Kafka 是以分區(qū)為存儲中心,而 Apache Pulsar 是以 Segment 為存儲中心, Apache Pulsar 這種獨特的基于分布式日志存儲的以 Segment 為中心的發(fā)布/訂閱消息系統(tǒng)可以提供許多優(yōu)勢,例如可靠的流式系統(tǒng),包括無限制的日志存儲,無需分區(qū)重新平衡的即時擴展,快速復制修復以及通過最大化數據放置實現高寫入和讀取可用性選項.
緩存中間件
我們都知道CPU的緩存的作用是為了減少對內存訪問,同樣擴展到分布式系統(tǒng)里面,緩存中間件可以提高對組件數據的訪問性能。
redis就是比較流行緩存中間件,根據局部性原理,冷熱數據分離,一般用來加快數據庫的高頻數據訪問:
未來優(yōu)化方向:
高可用
持久化優(yōu)化
安全加密
IO、連接優(yōu)化
多線程優(yōu)化
數據結構優(yōu)化,支持更多數據結構
?RPC框架
RPC是指遠程過程調用,也就是說兩臺服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,由于不在一個內存空間,不能直接調用,需要通過網絡來表達調用的語義和傳達調用的數據。
微服務時代的遠程服務調用框架。如grpc, Thrift, 阿里的 HSF, Dubbo, SOFA-RPC;
未來發(fā)展方向:
支持微服務技術演進
框架侵入性改進,語言無關,通信協(xié)議無關。
Service Mesh,Service Mesh是一個基礎設施層,其獨立運行在應用服務之外,提供應用服務之間安全、可靠、高效的通信,并為服務通信實現了微服務運行所需的基本組件功能,包括服務注冊發(fā)現、負載均衡、故障恢復、監(jiān)控、權限控制等等
性能優(yōu)化,序列化協(xié)議優(yōu)化,消息編碼優(yōu)化,網絡IO優(yōu)化等。
負載均衡
負載均衡(Load Balancing)是高可用網絡基礎架構的關鍵組件,通常用于將工作負載分布到多個服務器來提高網站、應用、數據庫或其他服務的性能和可靠性
硬件:F5、Redware...
軟件:lvs(四層)、haproxy(四,七層)、nginx(七層)...
未來發(fā)展方向:
支持更智能調度算法:
循環(huán)?- 請求按順序分布在服務器組中。
最少的連接?——一個新的請求被發(fā)送到與客戶端的當前連接最少的服務器。每個服務器的相對計算能力被考慮到確定哪個服務器的連接最少。
最短時間- 將請求發(fā)送到由結合了
最快響應時間和最少活動連接的公式選擇的服務器。NGINX Plus 獨有。Hash?– 根據您定義的密鑰分發(fā)請求,例如客戶端 IP 地址或
請求 URL。
如果上游服務器集發(fā)生變化,NGINX Plus 可以選擇應用一致的哈希來最小化負載的重新分配。IP Hash??– 客戶端的 IP 地址用于確定哪個服務器接收請求。
業(yè)務上云,云上負載均衡(LaaS,PaaS服務)。
高性能優(yōu)化,降低成本,大流量(IO優(yōu)化,DPDK,FPGA,P4演進),硬件。
高可用,可觀測,監(jiān)控統(tǒng)計,告警系統(tǒng),平滑擴容,服務剔除,無狀態(tài)化。
內核大師
內核路線,探究底層奧秘
云計算
云計算進程提速,一切皆服務,導致原來不掙錢底層技術,可以賣錢了,技術可以通過云計算向外輸出,這是底層技術人春天的到來:
Software as a Service,軟件即服務,簡稱SaaS,這層的作用是將應用作為服務提供給客戶。
Platform as a Service,平臺即服務,簡稱PaaS,這層的作用是將一個開發(fā)平臺作為服務提供給用戶。
Infrastructure as a Service, 基礎設施即服務,簡稱IaaS,這層的作用是提供虛擬機或者其他資源作為服務提供給用戶。
IaaS核心技術:計算,網絡,存儲,這些可以算是軟件技術的最底層了(再底層,就是硬件了),基本上要和內核OS打交道,要求具有內核的二次開發(fā)的能力,熟悉操作系統(tǒng)實現(主要是熟悉Linux內核源碼)。
計算:計算虛擬化,內核調度系統(tǒng),cgroups,KVM, QEMU,virtio;
網絡:網絡虛擬化,內核協(xié)議棧,netfilter,netns,DPDK,智能網卡,RDMA,P4等;
存儲:內存虛擬化,磁盤虛擬化,SPDK等;
PaaS核心技術:應用運行環(huán)境(容器,多租戶彈性,K8S),應用全生命周期支持(devops,自動化運維),集成、復合應用構建能力(CI/CD)等。
這些技術職位本身門檻是很高的,待遇也比一般職位要高,對底層技術非常感興趣可以關注。
瀏覽器內核
webkit
WebKit是Safari、Mail、App Store 和 macOS、iOS 和 Linux 上的許多其他應用程序使用的網絡瀏覽器引擎。
Chromium
Chromium是一個用于網絡瀏覽器的免費開源?代碼庫,主要由Google開發(fā)和維護。Google 使用該代碼制作其Chrome網絡瀏覽器,該瀏覽器具有附加功能。
Chromium代碼庫被廣泛使用。Microsoft Edge、Opera,QQ瀏覽器,UC瀏覽器等國內瀏覽器,和許多其他瀏覽器都基于該代碼。此外,代碼的重要部分被多個應用程序框架使用。
chromium架構
C++是主要語言,約占代碼庫的一半。這包括Blink和V8 引擎、HTTP和其他協(xié)議的實現、內部緩存系統(tǒng)和其他基本瀏覽器組件。一些用戶界面是用HTML、CSS和JavaScript 實現的。大量的網絡平臺測試也是用這些語言編寫的。大約 10% 的代碼庫是用C編寫的。這主要來自提供基本功能的第三方庫,例如SQLite和眾多編解碼器。支持移動?操作系統(tǒng)需要特殊的語言:Java的用于Android的,和iOS的兩個斯威夫特和????????Objective-C的。(Apple的WebKit引擎的副本也在代碼庫中,因為 iOS 瀏覽器需要它)
如果對web內核技術感興趣,可以選擇瀏覽器方向!
數據庫內核
技術初衷
在操作系統(tǒng)出現之后,隨著計算機應用范圍的擴大、需要處理的數據迅速膨脹。最初,數據與程序一樣,以簡單的文件作為主要存儲形式。以這種方式組織的數據在邏輯上更簡單,但可擴展性差,訪問這種數據的程序需要了解數據的具體組織格式。當系統(tǒng)數據量大或者用戶訪問量大時,應用程序還需要解決數據的完整性、一致性以及安全性等一系列的問題。因此,必須開發(fā)出一種系統(tǒng)軟件,它應該能夠像操作系統(tǒng)屏蔽了硬件訪問復雜性那樣,屏蔽數據訪問的復雜性。由此產生了數據管理系統(tǒng),即數據庫。
目前現狀
世界范圍內,做數據庫開發(fā)的,基本上都是基于開源項目,即便是自研也肯定會參考現有的開源項目,所以要選擇數據庫,必須要把開源玩的非常溜才行,比如MySQL, PostgreSQL, MongoDB, LevelDB等。目前云計算廠商都在大力發(fā)展數據庫,在國內公有云部署模式中,阿里、騰訊、AWS、Oracle、華為、Microsoft位列前六,于國內數據庫行業(yè)而言,數據庫廠商取得四十年最好的發(fā)展機會,市場大環(huán)境(國家去IOE化戰(zhàn)略)有利于國內廠商,技術方面總體接近,一些技術持平甚至領先
當前熱門方向:
分布式數據庫,分片,事務,一致性等
數據庫性能優(yōu)化,SQL指令優(yōu)化,軟件優(yōu)化,硬件加速
高可用架構
存量數據庫上云
數據庫智能化,自動化管控
云原生架構
如果對數據庫技術感興趣,可以選擇這條路。
操作系統(tǒng)?
目前國家大力發(fā)在新基建,鼓勵和政策支持企業(yè)開發(fā)基礎技術,操作系統(tǒng)當前就是一個重要方向,目前各大公司要么自研OS,要么基于開源OS進行二次開發(fā)。
目前熱門技術方向:
鴻蒙開源OS,自研OS
嵌入式OS,自研和基于嵌入式Linux
手機OS,基于Android二次開發(fā)
云計算OS,基于Linux 內核, Redhat發(fā)行版等二次開發(fā)
開發(fā)OS,主要是適配新硬件,性能優(yōu)化(調度性能,內存分配性能,協(xié)議棧處理性能,文件系統(tǒng)優(yōu)化),穩(wěn)定性優(yōu)化,虛擬化技術等。
如果對OS有情懷,喜歡和底層硬件打交道,可以選擇操作系統(tǒng)方向,目前前景還不錯!
嵌入式
由于5G,AI發(fā)展,手機,智能硬件,自動駕駛,IoT領域又煥發(fā)新春,各種智能硬件起飛。
熱門技術方向:
嵌入式OS(Vxworks,Alios, TencentOS tiny,?Huawei LiteOS、RT-Thread等)
智能家居系統(tǒng)
手機OS(鴻蒙,Android等)
手機性能優(yōu)化(性能和節(jié)能更強)
自動駕駛技術
喜歡硬件的發(fā)燒友,喜歡車庫文化的極客,可以選擇!
JDK
自1995年Sun公司推出Java至今,Java這門編程語言已經風光了25年。最近關于Java要沒落的言論甚囂塵上,但Java仍然是國內中國互聯(lián)網公司首選的編程語言,諸如阿里巴巴、京東、百度、騰訊、美團等。隨著互聯(lián)網、大數據、AI的迅猛發(fā)展,國內JAVA生態(tài)已逐漸劃分成了幾大陣營,J2EE企業(yè)級應用傳統(tǒng)領域是大廠商(甲骨文、微軟)主導,互聯(lián)網領域是pivotal,互聯(lián)網中間件是阿里云和pivotal在推spring cloud,大數據、移動安卓又分別是另一個獨立生態(tài)。
OpenJDK(開放 Java 開發(fā)工具包)是Java 平臺標準版(Java SE)的免費開源實現。目前各個大公司都在發(fā)展自己JDK版本,如果想在Java領域深耕且想轉為底層開發(fā),可以選擇JDK這條路!
分布式專家
微服務
Service Mesh 在過去的一年依舊保持著熱度。在已經過去的 2020,微服務可以說有堅守也有破局,有對服務微化共識的形成也有對特殊場景的理性思考。我們可以看到服務框架依然在持續(xù)演進,奔向云原生,擁抱云化。越來越多的企業(yè)開始跟上服務化云化步伐。
微服務、DDD、中臺技術并非企業(yè)技術架構設計的銀彈,微服務的主要缺點是微服務的分布式特點帶來的復雜性。開發(fā)人員需要基于RPC或者消息實現微服務之間的調用和通信,而這就使得服務之間的發(fā)現、服務調用鏈的跟蹤和質量問題變得的相當棘手。
騰訊開源的微服務框架TARS:
但微服務仍然分布式的熱門方向,符合高內聚,低耦合架構設計思想,這個過程中出現的問題等著我們去解決,比如Service Mesh出現。
Service Mesh作為Sidebar運行,對應用程序來說是透明,所有應用程序間的流量都會通過它,所以對應用程序流量的控制都可以在Service Mesh中實現。
目前流行的Service Mesh開源軟件有Linkerd、Envoy和Istio,而最近Buoyant(開源Linkerd的公司)又發(fā)布了基于Kubernetes的Service Mesh開源項目Conduit。
中臺架構
當前企業(yè)做大做強后,業(yè)務必然會增多,開始出現重復造輪子,由于業(yè)務擴張,本身人力就不足,所以長期方案還是會采用類似中臺的技術,這樣節(jié)約人力,具體怎么落地,這個是考驗團隊和公司從上到下的推動能力了。
云原生
云原生(CloudNative)是一個組合詞,Cloud+Native。Cloud表示應用程序位于云中,而不是傳統(tǒng)的數據中心;Native表示應用程序從設計之初即考慮到云的環(huán)境,原生為云而設計,在云上以最佳姿勢運行,充分利用和發(fā)揮云平臺的彈性+分布式優(yōu)勢。
2021年伊始,云原生的布局開始加速。華為云聯(lián)合CNCF(云原生計算基金會)、中國信通院成立創(chuàng)原會,加速云原生產業(yè)落地;金山云發(fā)布云原生全景圖、云原生產品矩陣和最新的Serverless產品;諾基亞宣布與谷歌云合作開發(fā)云原生5G技術……幾乎所有云廠商新發(fā)布的云計算產品都已打上了云原生的標簽。
云原生核心技術:
容器化:作為應用包裝的載體
持續(xù)交付:利用容器的輕便的特性,構建持續(xù)集成和持續(xù)發(fā)布的流水線
DevOps:開發(fā)與運維之間的協(xié)同,上升到一種文化的層次,能夠讓應用快速的部署和發(fā)布
微服務:這是應用開發(fā)的一種理念,將單體應用拆分為微服務才能更好的實現云原生,才能獨立的部署、擴展和更新
K8S已經成為下一代云原生操作系統(tǒng)
Kuberentes 架構
Kubernetes 最初源于谷歌內部的 Borg,提供了面向應用的容器集群部署和管理系統(tǒng)。Kubernetes 的目標旨在消除編排物理 / 虛擬計算,網絡和存儲基礎設施的負擔,并使應用程序運營商和開發(fā)人員完全將重點放在以容器為中心的原語上進行自助運營。Kubernetes 也提供穩(wěn)定、兼容的基礎(平臺),用于構建定制化的 workflows 和更高級的自動化任務。Kubernetes 具備完善的集群管理能力,包括多層次的安全防護和準入機制、多租戶應用支撐能力、透明的服務注冊和服務發(fā)現機制、內建負載均衡器、故障發(fā)現和自我修復能力、服務滾動升級和在線擴容、可擴展的資源自動調度機制、多粒度的資源配額管理能力。Kubernetes 還提供完善的管理工具,涵蓋開發(fā)、部署測試、運維監(jiān)控等各個環(huán)節(jié)。
如果你想成為互聯(lián)網架構師,K8S架構是你應該去了解的。
什么時候要考慮開始跳槽了
一般在一家公司,認真努力工作三年后(摸魚不算),職位沒有普升或者薪水沒有翻倍,就可以考慮跳槽了,請記住我們的口號是:
如何應對技術趨勢變化
軟件設計有兩個關鍵目標:高內聚、低耦合,圍繞這2個核心目標,又提出了單一職責、開閉原則、里氏替換、依賴導致、接口隔離、最少知識等設計原則。
軟件工程師一直都在為這兩個目標而努力奮斗,以求把軟件編寫得更加清晰、更加健壯、更加易于擴展和維護。
但后來,人們發(fā)現有更多的訴求,希望開發(fā)軟件變得更簡單、更快捷,程序員希望更少編寫代碼,非專業(yè)人員也希望能開發(fā)程序,于是,更多的更傻瓜的編程語言被發(fā)明出來,更多的編程技術和編程思想被發(fā)明出來,比如庫、組件、云基礎設施。
于是很多技術變成了屠龍之技,比如匯編,時代變了,建國后動物不能成精了,沒有龍可以宰了,然后很多軟件工程師搖身一變成了調參工程師、Call API磚家、用庫包能手、拼組件達人,這是效率分工的結果,也是技術發(fā)展的使然。
縱觀近二十年的科技互聯(lián)網發(fā)展歷程,大的趨勢是技術下沉,特別是近些年,隨著云計算的發(fā)展和普及,基礎設施越來越厚實,業(yè)務開發(fā)變得越來越容易,也越來越沒有技術含量,而之前困擾小團隊的性能、負載、安全性、擴展性問題都不復存在,這不禁讓互聯(lián)網行業(yè)的油膩大叔們噤若寒蟬,仿佛分分鐘就要被卷入歷史洪流而萬劫不復。
雖然不可否認技術的重要性在降低,但也還不至于那么悲觀。遙想PC時代,當VB、Delphi、MFC出現的時候,也有類似論調,所見即所得,點點鼠標,就可以開發(fā)PC桌面程序,是不是很高端?那時候碼農的擔心相比現在恐怕是只多不少吧,但后來隨著互聯(lián)網興起,出現了后端開發(fā)這個工種,碼農很快找到了新的戰(zhàn)場,網絡、分布式、數據庫、海量服務、容災防錯,于是又玩出一堆新花樣。
技術永遠在不停向前發(fā)展,而我們需要加深對基礎知識的理解,以不變應萬變,深耕一個領域,同時也需要多去嘗試新技術,擴寬自己的眼界,增加解決問題的思路,當你有一技之長后,即便國內35危機,你還可以去外企(Google,Facebook,亞馬遜,微軟等)養(yǎng)老。
參考和擴展閱讀
https://jimmysong.io/kubernetes-handbook/concepts/
https://cloud.51cto.com/art/202103/652294.htm
https://cloud.tencent.com/developer/article/1404117
https://www.zhihu.com/question/22799206
https://www.chromium.org/developers/design-documents/multi-process-architecture
https://blog.csdn.net/zxc024000/article/details/80157332
https://juejin.cn/post/6844904197859590151
- END -
看完一鍵三連在看,轉發(fā),點贊
是對文章最大的贊賞,極客重生感謝你
推薦閱讀
大規(guī)模微服務利器:eBPF + Kubernetes
深入理解編程藝術之策略與機制相分離
如何成為技術大神
總結
以上是生活随笔為你收集整理的后端技术趋势指南|如何选择自己的技术方向的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文搞懂JAVA与GO垃圾回收
- 下一篇: BPF、eBPF、XDP 和 Bpfil