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

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

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

写在前面

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

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

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

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

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

    万事俱备,东风也来

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

仿QQ 聊天程序 系统概述

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

​ 客户端提供主要的界面及服务请求,比如:登录界面、注册界面、聊天界面、找回密码、信息查看、信息修改界面等。

​ 第二部分就是IM 服务器。提供核心的业务逻辑处理,比方说用户的登录验证、用户消息的转发、在线用户的管理、离线消息的存储等待。

​ 第三部分是数据库部分,分为用户库和消息库。用户库存储用户信息和群组信息。离线消息库存储离线消息。

仿QQ 聊天程序的 IDEA 实战 工程

​ 使用IDEA工具,进行整个项目的开发,并通过maven 进行开发工程的管理。

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

​ 结构图如下:

​​ 公共的代码,放在 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用于表示一个消息。

​ 作为实例,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 模块集中定义了 所有模块的消息构造器。

消息构造器的职责,是完成 ChatMsg 数据bean对象,到 protobuf 消息数据包的一个构造。

​ 第三,chatcommon 模块集中定义了 所有session相关的类。完成服务器端和客户端的session 的管理。

chatcommon 模块的IDEA 工程截图如下


chatserver 模块

​ chatserver 模块主要由三个部分组成:

  • ChatServer

    完成 Netty 服务器端 ServerBootstrap 的启动。 ServerBootstrap 负责启动服务器端的Reactor 反应器线程组。 还有,ServerBootstrap 负责绑定服务器端的监听端口,开启连接请求的监听。

  • ChatServerHandler

    服务端的入站处理监听器。监听所有的入站请求,完成相应的入站处理。

  • ChatServerApp

    服务器端的应用入口, 调用 ChatServer的run 方法,启动服务器。

chatserver 模块的IDEA 工程截图如下


chatClient 模块

​ 和chatServer模块类似,chatClient 模块主要由三个部分组成:

  • ChatClient

    完成 Netty 客户端 Bootstrap的启动。Bootstrap负责启动客户端的 Reactor 反应器线程组。并且开始发起对服务器端的连接。

    注意,客户端的是Bootstrap,服务端的则是 ServerBootstrap。

  • ChatClientHandler

    客户端的入站处理监听器。监听所有的入站请求,完成相应的入站处理。

  • ChatClientApp

    客户端的应用入口, 调用ChatClient 的run 方法,启动客户端。

chatClient 模块的IDEA 工程截图如下


写在最后

​ 至此为止,终于完成 Java 聊天程序(百万级流量实战一)系统介绍。

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


疯狂创客圈 实战计划
  • Java (Netty) 聊天程序【 亿级流量】实战 开源项目实战


Netty聊天器(实战一):从0开始实战100w级流量应用的更多相关文章

  1. Netty聊天室(2):从0开始实战100w级流量应用

    目录 客户端 Client 登录和响应处理 写在前面 客户端的会话管理 客户端的逻辑构成 连接服务器与Session 的创建 Session和 channel 相互绑定 AttributeMap接口的 ...

  2. Netty聊天室-源码

    目录 Netty聊天室 源码工程 写在前面 [百万级流量 聊天室实战]: [分布式 聊天室] [Spring +Netty]: [Netty 原理] 死磕 系列 [提升篇]: [内力大增篇]: 疯狂创 ...

  3. Netty 粘包/半包原理与拆包实战

    Java NIO 粘包 拆包 (实战) - 史上最全解读 - 疯狂创客圈 - 博客园 https://www.cnblogs.com/crazymakercircle/p/9941658.html 本 ...

  4. Netty Redis 亿级流量 高并发 实战 (长文 修正版)

    目录 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -30[ 博客园 总入口 ] 写在前面 1.1. 快速的能力提升,巨大的应用价值 1.1.1. 飞速提升能力,并且满足实际开发要求 1 ...

  5. java架构之路-(netty专题)netty的基本使用和netty聊天室

    上次回顾: 上次博客,我们主要说了我们的IO模型,BIO同步阻塞,NIO同步非阻塞,AIO基于NIO二次封装的异步非阻塞,最重要的就是我们的NIO,脑海中应该有NIO的模型图. Netty概念: Ne ...

  6. python网络聊天器多线程版

    在之前的一篇文章(python网络编程-udp)中实现了一个简单的udp聊天器,只能在单线程下进行收发数据,在学习完多线程之后,实现一个能同时收发数据的udp聊天器. 说明: 编写一个有2个线程的程序 ...

  7. python使用udp实现聊天器

    聊天器简易版 使用udp实现一个简单的聊天器程序,要求如下: 在一个电脑中编写1个程序,有2个功能 1.获取键盘数据,并将其发送给对方 2.接收数据并显示 并且功能数据进行选择以上的2个功能调用 例子 ...

  8. 【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener

    =================6.SpringBoot拦截器实战和 Servlet3.0自定义Filter.Listener ============ 1.深入SpringBoot2.x过滤器Fi ...

  9. Netty 100万级到亿级流量 高并发 仿微信 IM后台 开源项目实战

    目录 写在前面 亿级流量IM的应用场景 十万级 单体IM 系统 高并发分布式IM系统架构 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -10[ 博客园 总入口 ] 写在前面 ​ 大家好 ...

随机推荐

  1. 2017 UESTC Training for Data Structures-解题报告

    题目链接:http://acm.uestc.edu.cn/#/contest/show/155 这个数据结构训练主要针对线段树,树转数组和并查集.比较适合刚入门数据结构的同学. 注意,因为后面题的代码 ...

  2. Python入门--17--pickle

    pickle模块,实际用途也很简单.单一,主要用于保存列表(list),元祖(Tuple),字典(dictionary) 当然,一定是大的列表.字典什么的,成千上万行的字典.列表,才能凸显出它的用武之 ...

  3. GridControl CardView ShowCardExpandButton or GridCardExpandButton

    关于DevExpress.XtraGrid.v13.1.dll和DevExpress.XtraGrid.v12.2.dll中ShowCardExpandButton  或者 GridCardExpan ...

  4. LeetCode OJ--Construct Binary Tree from Preorder and Inorder Traversal *

    http://oj.leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 根据二叉树的前序遍 ...

  5. AC日记——线段树练习5 codevs 4927

    4927 线段树练习5  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 有n个数和5种操作 add a b ...

  6. IOS 使用DSYM文件定位Bug 的具体位置

    在项目的开发中,我们通常需要排查和修改测试中和发布后线上的一些bug,现在有一些第三方的bug分享和查找工具SDK,如腾讯的Bugly和听云等,包括苹果的开发工具xcode也自带 bug查找工具.那么 ...

  7. 深入了解Entity Framework框架及访问数据的几种方式

    一.前言 1.Entity Framework概要 Entity Framework是微软以ADO.NET为基础所发展出来的对象关系映射(O/R Mapping)解决方案.该框架曾经为.NET Fra ...

  8. ASP.NET Core 依赖注入基本用法

    ASP.NET Core 依赖注入 ASP.NET Core从框架层对依赖注入提供支持.也就是说,如果你不了解依赖注入,将很难适应 ASP.NET Core的开发模式.本文将介绍依赖注入的基本概念,并 ...

  9. Linux 性能优化解析

    前情概述 进程调度 老板 cpu 任劳任怨的打工仔 线程 工作在做什么 可运行队列 拥有的工作清单 上下文切换 和老板沟通以便得到老板的想法并及时调整自己的工作 中断 部分工作做完以后还需要及时向老板 ...

  10. Wireshark如何单独导出包的列信息

    Wireshark如何单独导出包的列信息   Wireshark提供了丰富的数据包导出功能.用户可以将数据包按照需要导出为各种格式.这些格式文件包含了包的各种信息.但是很多时候,用户只需要获取包的特定 ...