千亿级IM独立开发指南丨全球即时通讯全套代码4小时速成(四):服务端搭建与总结

本文详细介绍了使用C++和FPNN框架搭建即时通讯(IM)服务端的步骤,包括服务端选型、FPNN框架配置、RTM Server C++ SDK接入、功能开发等,特别强调了C++的选择和FPNN框架的优势。通过本文,开发者可以掌握如何快速构建支持千亿级消息的IM服务端。
摘要由CSDN通过智能技术生成

本文篇幅较长,预计阅读时长1-2h,欢迎收藏+点赞+关注。

这是《千亿级IM独立开发指南!全球即时通讯全套代码4小时速成》的第四篇:《服务端搭建与总结》
系列文章可参考:

千亿级IM独立开发指南丨全球即时通讯全套代码4小时速成(一):功能设计与介绍

千亿级IM独立开发指南丨全球即时通讯全套代码4小时速成(二):UI设计与搭建

千亿级IM独立开发指南丨全球即时通讯全套代码4小时速成(三):App内部流程与逻辑(上)

千亿级IM独立开发指南丨全球即时通讯全套代码4小时速成(三):App内部流程与逻辑(下)

四、服务端搭建与总结

这篇终于进入了最后的部分:服务端。
随着这部分的完成,一个完整的,可制支撑千亿级消息的IM便白嫖完成!所以,我们加一把劲,来看一下这最后的服务端部分。

1. 服务端选型

服务端的开发,首当其冲,且也是最重要的,便是服务端的选型。根据前两篇的需求分析和功能设计,我们有三个突出的核心需求:

  1. 能与 RTM 服务端交互:这意味着云上曲率官方必须提供对应语言的Server 端 SDK
  2. 支持 HTTP/HTTPS 以 GET 和 POST 的方式访问
  3. 能以简单且快速的方式,开发我们所需求的业务

云上曲率 RTM 其实提供了很多不同的SDK用于客户与RTM,官网上面直接列出的有 GoPHPC++PythonJavaC# 六种。其实还存在其他的隐藏款,比如 Node.js

在这些SDK中,从简单和方便程度上而言,快速开发有以下四个选项:
● C++
● Go
● Python
● Node.js

首先,因为Node.js SDK计划会有重大更新,当前 GitHub 上是较老版本,所以我们暂不选择。这也是Node.js SDK 成为隐藏款的核心原因。

PythonGo 对于 HTTP/HTTPS 来说,则算是经典候选。直接启动 HTTP 服务器,接入 RTM 对应语言的SDK,实现相关的业务代码即可。而我们这里选择C++
我们选择C++的原因有两点:一是在FPNN框架的加持下,C++开发者将不再需要去处理任何 HTTP/HTTPS 相关的支持,HTTP/HTTPS 的支持可以被完全透明化。第二点就是,整个RTM服务系统就是基于C++ FPNN的框架进行开发的,所以我们可以更好地与RTM服务器进行交互。

虽然RTM服务端的C++ SDK是用 FPNN C++ SDK进行开发,但 FPNN C++ SDKFPNN 框架的特化子集,大部分情况下几乎无需改动便可从FPNN C++ SDK改为由FPNN框架提供基础支持。这样我们便可轻松实现开发需求。
但接下来,我们会采用更加简单的操作!

2. FPNN 框架的配置

首先从GitHub上面下载FPNN框架的最新发行版,目前是 1.1.3 版本。
注意:FPNN 框架目前仅支持 CentOS、Ubuntu 和 MacOS 三个操作系统,WIndows 仅有 C++ Widnows SDKC++ SDK 不含服务器和HTTP/HTTPS等功能支持。

按照“FPNN安装与集成”进行环境配置和框架编译。
注意:如果编译和运行环境不是亚马逊AWS,而是阿里云、腾讯云等,或者自己的内网虚拟机,切记根据“FPNN注意事项”进行修改和配置。否则服务可能无响应。因为在默认情况下,适配的是亚马逊AWS的运行环境。

3. 服务器框架搭建

3.1. 服务器框架搭建

采用FPNN框架开发的服务,其实必须的就3个文件:一个C++代码文件,一个运行配置文件,一个Makefile
在这里,我们把业务代码和框架代码分离:将负责具体业务请求处理的 QuestProcessor 类的实现和服务框架分开,一共产生5个文件:Makefile、IMDemoServer.cpp、QuestProcessor.h、QuestProcessor.cpp、im.conf。这也是采用FPNN框架进行开发的推荐做法。

首先是服务框架 IMDemoServer.cpp,如果我们不修改业务请求处理类的名称的话,以下代码无需修改,这也算是FPNN框架开发的标准代码:

IMDemoServer.cpp:

#include <iostream>
#include "TCPEpollServer.h"
#include "QuestProcessor.h"
#include "Setting.h"

using namespace fpnn;

int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        std::cout<<"Usage: "<<argv[0]<<" config"<<std::endl;
        return 0;
    }
    if(!Setting::load(argv[1])){
        std::cout<<"Config file error:"<< argv[1]<<std::endl;
        return 1;
    }

    ServerPtr server = TCPEpollServer::create();
    server->setQuestProcessor(std::make_shared<QuestProcessor>());
    if (server->startup())
        server->run();

    return 0;
}

对,整个服务器框架就算是完成了。当然,如果不采用HTTP或者TCP,而改为UDP,则将代码中的 TCPEpollServer 直接换成 UDPEpollServer,整个服务就从TCP或者HTTP/HTTPS服务,变成了UDP服务。

然后是业务框架:

QuestProcessor.h:

#ifndef QuestProcessor_H
#define QuestProcessor_H

#include "IQuestProcessor.h"

using namespace fpnn;

class QuestProcessor: public IQuestProcessor
{
    QuestProcessorClassPrivateFields(QuestProcessor)
    
public:
    virtual ~QuestProcessor() {}

    QuestProcessorClassBasicPublicFuncs
};

#endif

QuestProcessor.cpp:

`#include "QuestProcessor.h"`

嗯,FPNN空的业务框架这样就完成了!
鉴于我们需要处理 userLogin、userRegister、createGroup、joinGroup、createRoom、lookup 六个请求,所以我们修改业务框架代码如下:

QuestProcessor.h:

#ifndef QuestProcessor_H
#define QuestProcessor_H

#include "IQuestProcessor.h"

using namespace fpnn;

class QuestProcessor: public IQuestProcessor
{
    QuestProcessorClassPrivateFields(QuestProcessor)
    
public:
    FPAnswerPtr userLogin(const FPReaderPtr args, const FPQuestPtr quest, const ConnectionInfo& ci);
    FPAnswerPtr userRegister(const FPReaderPtr args, const FPQuestPtr quest, const ConnectionInfo& ci);
    FPAnswe
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值