面試官問:如何快速開發一個類似微信的聊天系統?

  • 2020 年 3 月 11 日
  • 筆記

去年我們公司要我去面試一位候選人,當時剛好我接手了公司的 IM 系統,借這個機會,就問了候選人這個問題:如何快速開發一個類似微信的聊天系統?

這個問題的確讓候選人回答起來很吃力:

  1. 從分析 PC 端微信介面的實現到怎麼處理框體與業務程式碼分離;
  2. 從通訊模型定義到怎麼處理消息協議、半包粘包到流量整型;
  3. 從架構模式設計到怎麼合理的搭建出完善且易於擴展的模組。

等等問題點的拋出和解答,候選人也確實用心在思考。但我知道因為這裡有些技術棧和通訊架構設計的缺失,使得解答這些問題變得很艱難。

恰好那段時間我剛寫完 36 篇 Netty 系列教程,看似系統,但是回顧起來還是零散。看完後,一些讀者回饋無法上手真實業務,問我能否寫一寫 Netty 在實際業務中的應用。為了讓大家更好的理解,我決定採用一個大多數人熟知又有趣的場景:模仿 PC 端的微信聊天。對於學習者來說,這樣不僅學習到了 Netty,還幫 Java 程式設計師使用自己的語言技術棧,開發出一款桌面聊天程式!

最原始的 36 篇 Netty 文章

Netty 是互聯網各種框架中以及物聯網裡都不可缺少的一部分技術棧技能,同時它也是非常重要的一個 Socket 框架。Netty 的應用非常廣泛,無論在互聯網、大數據以及通訊和遊戲行業中,都有 Netty 的身影。比如一線大廠阿里的 RPC 框架,Dubbo 協議默認使用 Netty 作為基礎通訊組件,用於各節點間的內部通訊。

淘寶的消息中間件 RocketMQ 的消息生產者與消費者,也是採用 Netty 作為高性能、非同步通訊組件。除了阿里系、淘寶系,其他很多一線大廠也都在使用 Netty 構建高性能、分散式的網路服務。

掌握一個技能最好的方式就是使用自己熟悉的工具進行實踐落地,通過功能的一點點實現和邏輯的大量閱讀,建設自己對程式碼的認知,並深化對整個框架的理解。

一個新知識點從學習到上手,往往分為三個階段;運行 HelloWord、熟練使用 API、和最終的落地應用。而這最後一步也是最重要的一步,要將各個知識點與實際要實現的業務功能相結合,才能不斷提升自己的技能。

為此我開始使用 Netty+JavaFx 以及 SpringBoot 等技術棧,搭建仿桌面版微信聊天程式,並在這個過程中梳理分析功能結構。這個過程可以使用 xmind 作為你的工具,整理自己的思路。接下來我對需要使用的技術棧做案例測試,驗證核心功能是否可以滿足我的需求。驗證完成後,開始做架構設計以及業務流程,直到最終通過編碼實現功能。

這個專欄是我使用了 JavaFxNetty4.xSpringBootMysql 等技術棧和偏向於 DDD 領域驅動設計方式,搭建的仿桌面版微信聊天工程實現通訊核心功能。

專欄內容

第一部分 – UI 開發:使用JavaFx 與 Maven 搭建 UI 桌面工程,逐步講解登錄框體、聊天框體、對話框、好友欄等各項 UI 展示及操作事件。從而在這一章節中讓 Java 程式設計師學會開發桌面版應用;

第二部分 – 架構設計:在這一部分中我們會使用 DDD 領域驅動設計的四層模型結構與 Netty 結合使用,架構出合理的分層框架。同時還有相應庫表功能的設計。相信這些內容學習後,你一定也可以假設出更好的框架;

第三部分 – 功能實現:這部分我們主要將通訊中的各項功能逐步實現,包括;登錄、添加好友、對話通知、消息發送、斷線重連等各項功能。最終完成整個項目的開發,同時也可以讓你從實踐中學會技能。

介面效果展示

登陸頁面

聊天頁面

添加好友

消息提醒

多圖解析

作者介紹

小傅哥,一線互聯網後端工程師,CSDN 部落格專家,精通 Java、Netty、Spring、SpringBoot 等技術棧,以及擅長中間件開發。

通過這個專欄,我們可以學到什麼?

  • 以 DDD 領域驅動設計的分層模型結合 Netty,編寫清晰簡潔可擴展的框架結構,完成仿微信聊天核心功能項目開發。
  • 使用 JavaFX 做 UI 窗體並且與業務程式碼分離的方式實現桌面版程式功能。在事件驅動與介面調用的方式中,使程式碼更加清晰、更加易於擴展。
  • 清晰的設計,明確到位的落地,讓理論與實踐結合起來。快速上手掌握 Netty、JavaFx、架構、庫表的設計與編碼。