zoukankan      html  css  js  c++  java
  • 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) 聊天程序【 亿级流量】实战 开源项目实战


  • 相关阅读:
    ## 序列化和反序列化
    C#小型资源管理器
    codeforces #310 div1 B
    codeforces #310 div1 A
    BZOJ 1030 文本生成器
    BZOJ 2806 cheat
    BZOJ 2553 禁忌
    BZOJ 4199 品酒大会
    codeforces #309 div1 D
    codeforces #309 div1 C
  • 原文地址:https://www.cnblogs.com/crazymakercircle/p/9943180.html
Copyright © 2011-2022 走看看