Netty聊天器(实战一):从0开始实战100w级流量应用

文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 :

免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备
免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷3)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:尼恩Java面试宝典 最新版 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取


Java 聊天程序(百万级流量实战一):系统介绍

疯狂创客圈 Java 分布式聊天室【 亿级流量】实战系列之14 【博客园 总入口

源码IDEA工程获取链接Java 聊天室 实战 源码

写在前面

大家好,我是作者尼恩。

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

  1. 完成了协议选型,选择了性能更佳的 Protobuf协议。具体的文章为: Netty+Protobuf 整合一:实战案例,带源码

  2. 介绍了 通讯消息数据包的几条设计准则。具体的文章为: Netty +Protobuf 整合二:protobuf 消息通讯协议设计的几个准则

  3. 解决了一个非常基础的问题,这就是通讯的 粘包和半包问题。具体的文章为:Netty 粘包/半包 全解 | 史上最全解读

    万事俱备,东风也来

    下面,开启打造一个Java 仿QQ 聊天程序 百万级流量后台的 惊险和刺激实战之旅

说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面的链接获取:语雀 或者 码云

仿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文件,也需要声明了其拥有的所有的三个子模块。

说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面的链接获取:语雀 或者 码云

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

说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面的链接获取:语雀 或者 码云

chatsesrver 模块

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 聊天程序(百万级流量实战一)系统介绍。

下一步,可以开始客户端和服务器的通讯了。

说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面的链接获取:语雀 或者 码云

posted @ 2018-11-11 19:46  疯狂创客圈  阅读(2508)  评论(0编辑  收藏  举报