作者 | 李志信
來源 |
阿裡巴巴雲原生公衆号3 月 19 日,初春的杭州,依舊陰雨朦胧。透過 EFC 健身房的落地窗往外看,遠處的樓宇、青山、整齊的街道和稀疏的車輛在水霧中若隐若現。
午後的小憩時光,我拿了瓶咖啡回到工位,看着剛剛送出的 PR 通過了 CI check,這是我人生中作為實習生的最後一天了。
成長的過程就是不斷經曆和體驗的過程,一段又一段不同心境的開始和結束。我希望三個月後,那個過了 22 歲生日的年輕人會如願順利拿到畢業證,再次出現在這裡,我想那時的他一定更熟悉 Java 了吧。
大學時光
循規蹈矩的大學生涯,大概是是四年大學和三年碩士,而我屬于校園的時光,隻有兩年半。在外實習到現在已經整整一年了,從北京到深圳再到杭州,我也非常慶幸能擁有這樣的經曆。
三段不同方向的實習,從最一開始在學校裡的 GoOnline 線上 IDE 項目,讓我對真正落地的開發項目充滿了向往;到 “互享“ 平台運維開發,讓我對企業落地的日常開發運維流程有所了解;再到看點業務開發與需求上線,讓我對擁有百萬使用者的項目和技術充滿了激情;再到中間件研發,專注于雲原生領域的探索和落地。
第一段實習是在北京時代複興投資公司,期間充滿了懵懂和糾結的,糾結于是選擇研發還是科研,懵懂與對從沒見過的花裡胡哨的各種工具的膽怯,但很幸運最終習慣了自己的選擇。
第二段實習是在深圳騰訊,整個過程充滿了刺激和危機感,危機來源于在社會上和技術上如何站住腳跟,驚險刺激于一連串從沒料到的事情。很感謝我能冷靜對待遇到的各種突發情況,來自就業的壓力,來自轉正的壓力,都不足以壓垮一個有夢想的年輕人。至今依舊懷念當時
帶領我成長的導師 Steven。
去年秋天開始在阿裡集團中間件團隊開始了我的第三段實習經曆,相比前兩次,這次實習舒服了很多。當看清前路的時候,活的還是比較滋潤的,所要做的就是積累、沉澱和享受來自研發的快樂。很幸運,實習經曆中遇到的導師、同僚和上司們都非常 nice,都可以遇到一起聊天交心、一起吃飯喝酒的前輩們,或許對于初入社會的年輕人,是一盞盞指向未來散發光芒的燈塔。
dubbogo 社群
拿到阿裡實習 offer 後還未入職西廠前,便被大 Boss 引入了 dubbogo 社群,被告知實習的任務就是推動
dubbo-go在内部的落地和 dubbo-go 3.0 的開發。這是一個有技術的組織,更是一個有人情味的地方。
時光到回到去年剛拿到 offer 的 10 月份,第一次将 dubbo-go clone 到本地,成功實作了 RPC 調用,心情是無比激動的。因為這個場景陌生中帶着熟悉。第一次 bug fix,第一次貢獻 feature,寫源碼解讀,再到後面成為 dubbo committer,投入 Dubbo-go 3.0 的貢獻中。專屬于年輕 IT 工程師的快樂,莫非于讓自己和項目一起成長。
在阿裡的實習過程,2021 年的重大版本 dubbo-go 3.0 貫穿了整條時間線。從我尚未入職還在石家莊的時候,便開始一邊在按摩店洗腳一邊開周會接任務,到後面熟識了社群中的上司們、技術大佬們,很多次被前輩的技術和精神所感動,說社群充滿了人情味毫不為過。
馬上就要到了三月底,我也希望 dubbo-go 3.0 可以成為實習過程中屬于我的一份期末答卷,而 3.0 版本一定不是終點,而是國内開源 RPC 架構發展的過程所在,因為有了每一個階段的創新,才成就了在未來長河中的豐富的雲原生發展史。
比起項目本身,我更愛這種技術氛圍:
- 很多技術人員可以凝聚在一起,各盡所長為了一個目标而努力;
- 一種“有我在項目就在”的責任心;
- 一種在貫徹于編碼中的開源項目的嚴謹;
- 一種聚會時可以快樂吹水和交流的默契。
就在上周六晚上,dubbogo 社群負責 dubbo-go-pixiu 項目的負責人鐵城大哥,為了慶祝自己成功從阿裡外圍公司轉到盒馬,召集了社群杭州的網友們成功小聚。觥籌交錯間從技術八卦到社群秘聞,無所不談,并紛紛“讨伐”圖中某位馬上從杭州某 IoT 公司離職要投奔螞蟻的大佬 ^_^。很感激在前行路上遇到的許多優秀又充滿情懷的前輩!
Triple-go
實習當然不可能隻有周末的風月,更多的是期間的工作經曆和成長。整個實習期間個人主要負責 dubbo-go 3.0 的 Triple 協定和新路由規則實作。
開源 Triple 協定作為 dubbo-go 3.0 的重要 feature,簡單來說,就是擴充 gRPC 協定,在 gRPC 的基礎上引入 dubbo 的服務治理能力和擴充空間。
剛開始想的很簡單,在 HTTP2 之上實作 Triple,并相容 gRPC。但難點在于既要和 gRPC 在普通/流式/狀态碼上完全相容,又要具有 dubbo 服務治理能力 --- 在 dubbo-go 已有基礎上擴充,還要擴充的優雅。
- 手撕 HTTP2
隻借助資料幀層的 SDK 手撕 HTTP2 協定,首先需要解決發包邏輯的正确性。搞了一兩個星期。實作了調用打通。
但自己實作的總會有問題...
除了資料幀發送正确,還要考慮滑動視窗流控、上下線、資料幀的拆包合包等等一系列流式場景下的問題。我的解決方法很直接,抓包看 grpc 怎麼做的(沒時間看源碼了),然後按照它的邏輯去實作。
當問題一個在掉頭發的過程中解決,看似美好,實則陷入死胡同 --- 手撕真的比不上官方庫,無論是穩定性還是速度。
- 改官方庫
一開始沒有選擇官方庫,因為 gRPC 并不是這麼做的。調研的過程中感覺困難重重,Go 語言官方庫隻給了少的可憐的接口,怎麼自定義 Header 和 Trailer?怎麼實作 stream 調用?給官方庫送出 issue 後被回複:“想法不錯,你自己實作個貢獻出來吧”...
在這一點上,隔壁 java 的實作就舒服了很多,功能強大的 java-http2 庫直接信手拈來。後來對于大型項目的貢獻已經有點恐懼了,條條框框太多,跟師兄學聰明點,幹脆 fork 個分支自己改,改的自己都覺得騷,但是能實作需求。
很感謝經驗豐富的上司提醒我,官方庫可以試試用。
- 絲滑體驗
花了兩天時間換了底層網絡庫,體驗絲滑了很多,尤其是幾兆的大個兒資料包,跟社群前輩一起測了一下,最後 2-3MiB 的雙向資料包單機壓測可達到 1.5k qps。
當然沒考慮到的問題還有很多,但沉浸在開發的快樂和成就感中真的很爽。
未來的雲原生
實習期雖然隻有三個多月,但到後來我越來越發現,中間件研發已經承包了我的太多快樂,我越來越發覺了對程式設計的熱愛,對專業的敬畏,對雲原生技術的信仰。
我認為任何一位 IT 工程師,無論技術深度如何,無論經驗是否豐富,都應該擁有自己的技術信仰。我希望技術信仰于我而言,始于對于程式設計的喜愛和強烈的項目成就感,成長于與前輩的交流和源碼的學習中,希望在未來将落實于在 “落地” 和 “創新” 兩個詞中。
我認為,任何的技術,如果不落地生産,将不具有太多意義。而将“形而上學”的架構觀念,突破層層阻礙和壁壘,例如和已有服務/語言/設計理念相悖,不斷推進落地,這過程是偉大的,這個過程中付出過努力的人都是站在浪潮之巅的弄潮兒。
中間件的未來是什麼?sidecar 架構真正優雅落地是什麼樣子?Java 和 Go 以後的關系又是如何?RPC 又能被什麼替代,或者是以一種新形态出現?
很多東西就像年初的股市一樣撲朔迷離,但未來一定會有一個唯一的答案。未來在杭州,我在技術上又會經曆什麼變化,業内技術棧又會産生什麼樣的突破和進展。
難以想象未來三年後,我的技術棧将會變成什麼樣?畢竟從測試、運維、業務開發、再到基礎架構,唯一不變的是變化。
最後的話
配上實習最後一天離開西廠前的紀念照 --- 紀念一段人生路程的結束。祝福開源的 dubbo/dubbogo,在未來将會變得越來越強大,越來越多的開發者可以使用它們,創造雲原生更大的價值。
dubbo/dubbo-go 3.0 将于近期正式釋出,敬請期待!如有興趣,可到 dubbogo 社群釘釘群 31363295 找我聊聊。
謹以此文緻敬我的三段實習經曆中幫助我成長的各位導師和技術前輩們,并以此紀念我即将逝去的大學生涯!