【云+社区年度征文】我膨胀了,20年基于Netty写个微信部署到腾讯云!

一、前言

😄Netty+JavaFx,开发PC端仿微信,部署到腾讯提供的云服务!

不知道这个项目会不会被马化腾、张小龙等大佬看见!如果看见了不要找我,这个项目仅仅是为了学习搭建,同时没有任何付费商用。但如果找我了,我会很开心😊

如果我能早点毕业的程序员👨‍💻‍,那么一定会想法参与到即时聊天、社交类的项目中。骨子里却是喜欢那种可以服务上亿人的通信项目,那样的话我的每一行代码,都是有灵魂的。


之所以在20年来写这样一个项目,除了是对 Netty 学习的实践,也是个人对社交通信项目的喜欢。在从学习编程开始陆续仿照做过通信类的项目有10几个,仿照过最早期的QQ、也创造过我自己想象的通信模式、现在又来模仿微信的结构,整个开发编程下来,算是彻底爽了。

那么,接下来我就把做基于Netty+JavaFx实现仿微信项目,部署到腾讯云服务上。实践总是最快的学习途径!

二、项目介绍

在这套IM中,服务端采用DDD领域驱动设计模式进行搭建。将 Netty 的功能交给 SpringBoot 进行启停控制,同时在服务端搭建控制台可以非常方便的操作通信系统,进行用户和通信管理。在客户端的建设上采用UI分离的方式进行搭建,以保证业务代码与UI展示分离,做到非常易于扩展的控制。

另外在功能实现上包括;完美仿照微信桌面版客户端、登录、搜索添加好友、用户通信、群组通信、表情发送等核心功能。如果有对于实际需要使用的功能,可以按照这套系统框架进行扩展。具体功能点如下;

Netty 仿微信项目功能

这套 IM 代码分为了三组模块;UI、客户端、服务端。之所以这样拆分,是为了将UI展示与业务逻辑隔离,使用事件和接口进行驱动,让代码层次更加干净整洁易于扩展和维护。

序号

工程

介绍

1

itstack-naive-chat-ui

使用JavaFx开发的UI端,在我们的UI端中提供了;登录框体、聊天框体,同时在聊天框体中有大量的行为交互界面以及接口和事件。最终我的UI端使用Maven打包的方式向外提供Jar包,以此来达到UI界面与业务行为流程分离。

2

itstack-naive-chat-client

客户端是我们的通信核心工程,主要使用Netty4.x作为我们的socket框架来完成通信交互。并且在此工程中负责引入UI的Jar包,完成UI定义的事件(登录验证、搜索添加好友、对话通知、发送信息等等),以及需要使用我们在服务端工程定义的通信协议来完成信息的交互操作。

3

itstack-navie-chat-server

服务端同样使用Netty4.x作为socket的通信框架,同时在服务端使用Layui作为管理后台的页面,并且我们的服务端采用偏向于DDD领域驱动设计的方式与Netty集合,以此来达到我们的框架结构整洁干净易于扩展。

4

itstack.sql

系统工程数据库表结构以及初始化数据信息,共计6张核心表;用户表、群组表、用户群组关联表、好友表、对话表以及聊天记录表。用户在实际业务开发中可以自行拓展完善,目前库表结构只以核心功能为基础。

三、腾讯云部署

我是一个比较喜欢折腾的人,也有自己的域名和博客。也经常折腾把自己的博客部署到云服务,还是很熟悉中间的一些列操作,包括:域名注册、网站备案、服务部署、SSL申请以及相应FTP工具使用等。

这次决定把仿微信项目部署到腾讯云服务,也是出于体验一下腾讯云,看看是否更加智能好用。还别说,挺香!

1. 云服务选择

腾讯云为不同客户的需求,提供了云服务器轻量应用服务器,以及单独的类似MySql、Redis、ES这样的单独服务。

在选择的时候按照自己的业务体量选择即可,即使当前不好考虑选择多大体量的,也可以稍微把配置选的稍微小一点,后面服务体量增长后,再扩容就可以了。还是挺方便的

这里我有几张优惠券,体验了稍微大一点配置的云服务器,但大家如果做实践验证可以选择这里的免费服务:https://cloud.tencent.com/act/free?from=11649

2. 腾讯云定制宝塔

可能不经常玩云服务或者没有部署过自己博客的小伙伴,不太了解宝塔是个啥。其实它就是一个简单好用的服务器运维面板,在这里你可以点点点的方式按照java、tomcat、mysql、Nginx等,都是一键式的。

并且得益于腾讯把这些宝塔定制到自己的系统里,所以在安装的时候也是非常方便,不需要在开端口等操作。基本步骤就是,在点击试用系统后进入,选择重置应用,在运维里安装宝塔即可。

重置应用

重置应用

安装宝塔

安装宝塔

安装以后,你就可以正常使用宝塔了,它的默认端口是8888

3. 部署项目

在项目介绍中我们讲到,这套仿微信项目需要把服务端部署到线上,也就是启动一个Netty服务,另外部署时需要初始化数据库信息。

3.1 宝塔环境安装

在宝塔的套件中,我们需要安装:tomcat、Nginx、mysql,以及Jdk。另外如果需要可视化管理数据库,那么还需要安装phpMyAdmin,以及php版本套件。最终我的安装如下:内核1G时而会满,按需选择!

宝塔环境安装
3.2 配置数据库

在宝塔里操作配置数据库也比较简单,选择添加数据库,导入库表信息即可。如下:

配置数据库
3.3 上传项目

大家都是Java程序员,对于Tomcat的使用还是非常熟练的。在宝塔中只需要添加网站后上传war包到目录下解压即可。

上传项目
3.4 启动tomcat

配置好数据库等基本信息,上传好项目war包后,需要再重新启动下tomcat,在启动的过程中可以查看启动日志。也建议大家使用xshell工具连接,查看实施日志等操作

启动tomcat

四、微信项目截图

1. 登录界面

2. 聊天界面

3. 添加好友

4. 消息提醒

五、源码下载

源码地址

  • https://github.com/fuzhengwei/NaiveChat
  • https://gitee.com/itstack/NaiveChat

如果在学习过程中遇到什么问题,欢迎添加作者小傅哥(fustack),感谢支持!

甩一段代码

此项目是基于DDD领域驱动设计的四层架构搭建,整体结构非常清晰。很适合新手学习里面的经验,让自己写出更加优秀的代码!

代码语言:txt
复制
public class AddFriendHandler extends MyBizHandler<AddFriendRequest> {
public AddFriendHandler(UserService userService) {
    super(userService);
}

@Override
public void channelRead(Channel channel, AddFriendRequest msg) {
    // 1. 添加好友到数据库中[A-&gt;B B-&gt;A]
    List&lt;UserFriend&gt; userFriendList = new ArrayList&lt;&gt;();
    userFriendList.add(new UserFriend(msg.getUserId(), msg.getFriendId()));
    userFriendList.add(new UserFriend(msg.getFriendId(), msg.getUserId()));
    userService.addUserFriend(userFriendList);
    // 2. 推送好友添加完成 A
    UserInfo userInfo = userService.queryUserInfo(msg.getFriendId());
    channel.writeAndFlush(new AddFriendResponse(userInfo.getUserId(), userInfo.getUserNickName(), userInfo.getUserHead()));
    // 3. 推送好友添加完成 B
    Channel friendChannel = SocketChannelUtil.getChannel(msg.getFriendId());
    if (null == friendChannel) return;
    UserInfo friendInfo = userService.queryUserInfo(msg.getUserId());
    friendChannel.writeAndFlush(new AddFriendResponse(friendInfo.getUserId(), friendInfo.getUserNickName(), friendInfo.getUserHead()));
}

}

六、总结

  • 在体验的过程中发现,腾讯云产品功能确实很丰富。如果你是需要部署一个个人的博客,那么轻量应用服务器就可以满足你。同时这里已经支持好了一些博客系统,比如:WordPress、Discuz等。当然你也可以搭建其他静态博客,那么会更加节省资源!
  • 实践是学习知识的最佳途径,尤其是程序员编程行业,基本很多时候都需要大量的实践来验证你的想法,并从中吸取到有价值的技术经验。
  • 嗯,最后希望腾讯云和云+社区越来越好!感谢!欢迎访问和使用:https://console.cloud.tencent.com/