Netty聊天器(實戰一):從0開始實戰100w級流量應用


Java 聊天程序(百萬級流量實戰一):系統介紹

瘋狂創客圈 Java 分布式聊天室【 億級流量】實戰系列之14 【博客園 總入口

源碼IDEA工程獲取鏈接Java 聊天室 實戰 源碼

寫在前面

​ 大家好,我是作者尼恩。

​ 前面,已經完成一個高性能的 Java 聊天程序的三件大事:

  1. 完成了協議選型,選擇了性能更佳的 Protobuf協議。具體的文章為: Netty+Protobuf 整合一:實戰案例,帶源碼

  2. 介紹了 通訊消息數據包的幾條設計准則。具體的文章為: Netty +Protobuf 整合二:protobuf 消息通訊協議設計的幾個准則

  3. 解決了一個非常基礎的問題,這就是通訊的 粘包和半包問題。具體的文章為:Netty 粘包/半包 全解 | 史上最全解讀

    萬事俱備,東風也來

    下面,開啟打造一個Java 仿QQ 聊天程序 百萬級流量后台的 驚險和刺激實戰之旅

仿QQ 聊天程序 系統概述

1541926804777

​ 第一部分是客戶端程序,是用戶使用的部分。

​ 客戶端提供主要的界面及服務請求,比如:登錄界面、注冊界面、聊天界面、找回密碼、信息查看、信息修改界面等。

​ 第二部分就是IM 服務器。提供核心的業務邏輯處理,比方說用戶的登錄驗證、用戶消息的轉發、在線用戶的管理、離線消息的存儲等待。

​ 第三部分是數據庫部分,分為用戶庫和消息庫。用戶庫存儲用戶信息和群組信息。離線消息庫存儲離線消息。

仿QQ 聊天程序的 IDEA 實戰 工程

​ 使用IDEA工具,進行整個項目的開發,並通過maven 進行開發工程的管理。

​ 整個工程,分成三個module 模塊:chatcommon、chatserver、chatclient。

​ 結構圖如下:

1541927679264

​​ 公共的代碼,放在 chatcommon 子模塊中。 chatClient、chatserver 兩個子模塊,通添加對chatcommon 的依賴,完成公共代碼的復用。

​ chatcommon、chatserver、chatclient 三個模塊,都有一個 maven 子 pom文件, 通過 parent 元素 設置父親 pom 文件。

​ chatserver、chatclient, 通過 dependencies 元素,設置對 chatcommon 公共模塊的依賴。

​ chatclient 的pom 文件的源碼如下:

 
 
 
         
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>Java ChatRoom</artifactId>
        <groupId>com.crazymakercircle</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
   <artifactId>chat-client</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.crazymakercircle</groupId>
            <artifactId>chat-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies></project>

​ chatserver 的pom文件,和 chatclient 是類似的,不再貼出。

​ chatcommon、chatserver、chatclient 三個模塊,都有一個 統一的父親 pom文件,這就是IDEA 工程的根部pom文件。

​ 根部 pom文件,設置了整個工程的統一的參數、統一的項目依賴等待。根部 pom文件里邊的設置,都會被各個模塊的子pom 文件繼承到。

​ 根部pom文件的部分代碼如下:

 
 
 
         
<groupId>com.crazymakercircle</groupId>
<artifactId>Java ChatRoom</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
    <module>chatcommon</module>
    <module>chatserver</module>
    <module>chatclient</module>
</modules>
<packaging>pom</packaging>

​ 根部pom文件,集中管理對其他所有Jar包的版本依賴,其所有的子模塊不需要做重復性的工作。

​ 根部pom文件,也需要聲明了其擁有的所有的三個子模塊。

chatcommon 模塊

​ 首先,chatcommon 模塊集中定義了 所有模塊要用到的 java bean(表示數據的對象),包含了 User 和 ChatMsg。

​ User 用於表示一個用戶,ChatMsg用於表示一個消息。

1541929454104

​ 作為實例,User的代碼如下:

 
 
 
         
package com.crazymakercircle.chat.common.bean;
​
import lombok.Data;
​
@Data
public class User
{
    private static final Logger LOGGER = LoggerFactory.getLogger(User.class);
​
    String uid;
    String devId;
    String token;
    String nickName;
    PLATTYPE platform;
    private String sessionId;
​
    // windows,mac,android, ios, web , other
    public enum PLATTYPE
    {
        WINDOWS, MAC, ANDROID, IOS, WEB, OTHER;
    }
​
}

​ 在Bean 類中,使用 lombok 框架的 @Data 標記,來生成 getter 和setter 方法, 避免寫一堆機械化的getter 和setter 方法。

其次,chatcommon 模塊集中定義了 所有模塊的消息構造器。

1541930015609

消息構造器的職責,是完成 ChatMsg 數據bean對象,到 protobuf 消息數據包的一個構造。

1541931189434

​ 第三,chatcommon 模塊集中定義了 所有session相關的類。完成服務器端和客戶端的session 的管理。

chatcommon 模塊的IDEA 工程截圖如下

1541931277443

chatserver 模塊

​ chatserver 模塊主要由三個部分組成:

  • ChatServer

    完成 Netty 服務器端 ServerBootstrap 的啟動。 ServerBootstrap 負責啟動服務器端的Reactor 反應器線程組。 還有,ServerBootstrap 負責綁定服務器端的監聽端口,開啟連接請求的監聽。

  • ChatServerHandler

    服務端的入站處理監聽器。監聽所有的入站請求,完成相應的入站處理。

  • ChatServerApp

    服務器端的應用入口, 調用 ChatServer的run 方法,啟動服務器。

chatserver 模塊的IDEA 工程截圖如下

1541931443111

chatClient 模塊

​ 和chatServer模塊類似,chatClient 模塊主要由三個部分組成:

  • ChatClient

    完成 Netty 客戶端 Bootstrap的啟動。Bootstrap負責啟動客戶端的 Reactor 反應器線程組。並且開始發起對服務器端的連接。

    注意,客戶端的是Bootstrap,服務端的則是 ServerBootstrap。

  • ChatClientHandler

    客戶端的入站處理監聽器。監聽所有的入站請求,完成相應的入站處理。

  • ChatClientApp

    客戶端的應用入口, 調用ChatClient 的run 方法,啟動客戶端。

chatClient 模塊的IDEA 工程截圖如下

1541934032204

寫在最后

​ 至此為止,終於完成 Java 聊天程序(百萬級流量實戰一)系統介紹。

​ 下一步,可以開始客戶端和服務器的通訊了。


瘋狂創客圈 實戰計划
  • Java (Netty) 聊天程序【 億級流量】實戰 開源項目實戰



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM