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. 10个JavaScript难点--摘抄

    1. 立即执行函数 立即执行函数,即Immediately Invoked Function Expression (IIFE),正如它的名字,就是创建函数的同时立即执行.它没有绑定任何事件,也无需等 ...

  2. Install Qualcomm Development Environment

    安裝 Android Development Environment http://www.cnblogs.com/youchihwang/p/6645880.html 除了上述還得安裝, sudo ...

  3. window.getComputedStyle——ref

    componentDidMount() { const LeftHeight = window.getComputedStyle(this.leftDom).height; console.log(L ...

  4. Widows下利用OpenSSL生成证书

    1.下载OpenSSL的windows版本 32位:openssl-1.0.2a-i386-win32.zip 64位:openssl-1.0.2a-x64_86-win64.zip 下载之后解压即可 ...

  5. POJ 2253 Frogger Floyd

    原题链接:http://poj.org/problem?id=2253 Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissi ...

  6. Android中的动画总结

    文章主要内容来源<Android开发艺术探索>,部分内容来源网上的文章,文中会有链接. Android系统提供了两个动画框架:属性动画框架和View动画框架. 两个动画框架都是可行的选项, ...

  7. 简单了解HTML5中的Web Notification桌面通知

    原文:http://www.zhangxinxu.com/wordpress/2016/07/know-html5-web-notification/ 需要注意的是,消息通知只有通过Web服务访问该页 ...

  8. ARC下循环引用的问题

    最初 最近在开发应用时碰到使用ASIHttpRequest后在某些机器上发不出请求的问题,项目开启了ARC,代码是这样写的: @implement MainController - (void) fe ...

  9. ios使用http来上传图片实现方法

    if (parameters) {                int genderNumber = 1;        self.token = loginToken;        self.p ...

  10. 【mybatis】mybatis中insert操作,返回自增id

    需求是这样的: mybatis中insert操作,返回自增id,因为这个自增id需要给后续业务用到. 原本是这样的: 将insert语句传入,正常执行insert操作,返回int永远是 0[失败] 或 ...