C++服务开发入门指南
  • 序言
  • 前言
  • 一、一个简单的服务
    • 1 什么是服务
    • 2 服务可以用来做什么
    • 3 简单服务框架
  • 二、网络通信服务框架
    • 1 网络服务的基本概念
    • 2 增加监听端口
    • 3 处理客户端会话
    • 小结
  • 三、添加基础模块
    • 1 日志模块
    • 2 定时器
    • 3 事件机制
    • 4 线程池
    • 5 线程安全
    • 小结
  • 四、一个聊天服务
    • 1 需求描述及分析
    • 2 概要设计
    • 3 创建服务项目
    • 4 ClientUser实现
    • 5 RoomMgr实现
    • 6 ChatRoom实现
    • 7 RoomIDMgr实现
    • 小结
  • 五、测试、迭代及重构
    • 1 测试
    • 2 迭代
    • 3 重构
    • 4 版本号
  • 六、架构设计
    • 1 单点服务
    • 2 分布式服务
  • 七、部署及发布
    • 1 部署环境
    • 2 编译环境
    • 3 部署服务
    • 4 发布服务
  • 八、线上问题处理
    • 1 线上问题
    • 2 问题处理
  • 九、程序员的职业规划
    • 职业规划
Powered by GitBook
On this page
  1. 一、一个简单的服务

3 简单服务框架

Previous2 服务可以用来做什么Next二、网络通信服务框架

Last updated 2 years ago

首先实现一个服务基类,定义好服务需要的基本接口。

Start()函数用来启动服务,启动前,在OnStart里做一些预处理;

Run()函数执行服务主循环,保证服务一直运行,并在合适的时机停止。

Stop()函数用来停止服务,停止前,可以在OnStop()函数中执行资源回收,数据保存和清理工作。

代码实现如下

#pragma once


class CServiceBase
{
public:

	CServiceBase();
	virtual ~CServiceBase();

public:

	virtual bool Run();

	virtual bool Start();

	virtual void Stop();

public:
	virtual void OnStart();

	virtual void OnTick();

	virtual void OnStop();
    
protected:
	bool m_bRunning;
};
#include "ServiceBase.h"
#include <iostream>
#include <thread>

const int ServiceTickInterval = 50;

int LogInfo(std::string info)
{
    std::cout << info.c_str() << std::endl;
    return 0;
}

CServiceBase::CServiceBase()
	: m_bRunning(false)
{
}

CServiceBase::~CServiceBase()
{
}

bool CServiceBase::Run()
{
	LogInfo("ServiceBase Run");
	while (m_bRunning)
	{
		std::this_thread::sleep_for(std::chrono::milliseconds(ServiceTickInterval));
		OnTick();
	}
	return true;
}

bool CServiceBase::Start()
{
	LogInfo("ServiceBase Start");
	m_bRunning = true;
	OnStart();
	Run();
	return false;
}

void CServiceBase::Stop()
{
	LogInfo("ServiceBase Stop");
	m_bRunning = false;
}

void CServiceBase::OnStart()
{
	LogInfo("ServiceBase OnStart");
}

void CServiceBase::OnTick()
{
	LogInfo("ServiceBase Tick");
}

void CServiceBase::OnStop()
{
	LogInfo("ServiceBase OnStop");
}

这里稍微注意下,LogInfo函数中,只有一行语句,调用std::cout,增加LogInfo函数的目的,是方便后期替换为真正的日志输出函数,前期为了简便,直接通过控制台显示。

这是一个编程的小技巧:有多处使用系统函数或API接口的调用,尽量封装一个函数,可以避免后期需求变更时,全局搜索替换。

最后主函数调用

#include <iostream>
#include "ServiceBase.h"

int main(){
    CServiceBase svr;
    svr.Start();
    
    return 0;
}

编译运行,可以看到控制台输出

ServiceBase Start
ServiceBase OnStart
ServiceBase Run
ServiceBase Tick
ServiceBase Tick
...

现在一个最基本的服务框架就完成了,服务运行后,可以每隔50毫秒执行一次OnTick函数,在这个函数中可以添加自己的逻辑。

下一章,我们增加网络消息收发功能,使服务具备网络交互能力。