java实战案例聊天系统_Netty聊天器(实战一):从0开始实战100w级流量应用

本文是Java分布式聊天室系列的第一部分,介绍了如何从零开始构建一个仿QQ聊天程序,包括协议选择(Protobuf)、解决粘包/半包问题,以及系统架构设计。系统分为客户端、IM服务器和数据库三部分,使用IDEA和Maven进行项目管理和模块划分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 聊天程序(百万级流量实战一):系统介绍疯狂创客圈 Java 分布式聊天室【 亿级流量】实战系列之14 【博客园 总入口】

写在前面

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

​ 前面,已经完成一个高性能的 Java 聊天程序的三件大事:完成了协议选型,选择了性能更佳的 Protobuf协议。具体的文章为:Netty+Protobuf 整合一:实战案例,带源码

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

​ 万事俱备,东风也来。

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

仿QQ 聊天程序 系统概述

83056ad35dc66b49cd7e0ecfc7614759.png

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

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

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

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

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

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

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

​ 结构图如下:

41309dca392663b7c82cbaca55b7eff8.png

​​ 公共的代码,放在 chatcommon 子模块中。 chatClient、chatserver 两个子模块,通添加对chatcommon 的依赖,完成公共代码的复用。

​ chatcommon、chatserver、chatclient 三个模块,都有一个 maven 子 pom文件, 通过 parent 元素 设置父亲 pom 文件。

​ chatserver、chatclient, 通过 dependencies 元素,设置对 chatcommon 公共模块的依赖。

​ chatclient 的pom 文件的源码如下:<?xml version="1.0" encoding="UTF-8"?>

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">

Java ChatRoom

com.crazymakercircle

1.0-SNAPSHOT

4.0.0

chat-client

com.crazymakercircle

chat-common

1.0-SNAPSHOT

​ chatserver 的pom文件,和 chatclient 是类似的,不再贴出。

​ chatcommon、chatserver、chatclient 三个模块,都有一个 统一的父亲 pom文件,这就是IDEA 工程的根部pom文件。

​ 根部 pom文件,设置了整个工程的统一的参数、统一的项目依赖等待。根部 pom文件里边的设置,都会被各个模块的子pom 文件继承到。

​ 根部pom文件的部分代码如下:com.crazymakercircle

Java ChatRoom

1.0-SNAPSHOT

chatcommon

chatserver

chatclient

pom

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

​ 根部pom文件,也需要声明了其拥有的所有的三个子模块。

chatcommon 模块

​ 首先,chatcommon 模块集中定义了 所有模块要用到的 java bean(表示数据的对象),包含了 User 和 ChatMsg。

​ User 用于表示一个用户,ChatMsg用于表示一个消息。

45a2a12a81cc42779874f84c64a8b3c9.png

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

85fd6c05974cd94a553815088d7bd541.png

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

6a0885b70b4b0e8f5a21a270fd7d178f.png

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

​ chatcommon 模块的IDEA 工程截图如下:

d87fb649d2ad1e1d60700358aeca4976.png

chatserver 模块

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

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

ChatServerHandler

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

ChatServerApp

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

chatserver 模块的IDEA 工程截图如下:

f8f75e0aa8005518e6c1dc71dcda81dc.png

chatClient 模块

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

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

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

ChatClientHandler

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

ChatClientApp

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

chatClient 模块的IDEA 工程截图如下:

6d80de90d4b5cf7d9db50296522d8416.png

写在最后

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

​ 下一步,可以开始客户端和服务器的通讯了。疯狂创客圈 实战计划Java (Netty) 聊天程序【 亿级流量】实战 开源项目实战Netty 源码、原理、JAVA NIO 原理

Java 面试题 一网打尽

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值