1 什么是服务
我们知道,C++代码可以通过编译,生成一个可执行的程序文件,可在windows上运行的,表现为一个exe文件;可以在linux上运行,则不需要后缀名。
1.1 服务是一个可执行程序
一个最简单的C++程序,是经典的“Hello world!”。
#include <iostream>
int main(){
std::cout << "Hello world!";
return 0;
}
这段代码,可以编译为一个可执行文件,其执行结果是在控制台上打印一行文字“Hello world!”。
服务首先是一个可执行程序,它可以在操作系统上运行,执行相应的任务。
那是不是所有的可执行程序都可以称为服务呢?如果不是的话,服务和普通的可执行程序有什么区别?
1.2 服务是一个可长时间运行的程序
上面的“Hello World!”程序,执行速度很快,如果是windows版本的exe程序,双击执行的话,可能只看到黑框一闪,连输出的内容都来不及看清楚。
服务一般可以长时间运行,我们对上面的程序进行简单修改。
#include <iostream>
#include <time.h>
#include <thread>
#include <chrono>
const int sec10 = 10000;
int main(){
while(true){
time_t now = time(nullptr);
char* ct = ctime(&now);
std::cout << "Hello world! time is " << ct << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(sec10));
};
return 0;
}
这个程序执行后,可以每隔10秒输出一次Hello world,并打印时间信息。
这已经有一个服务的雏形了,它可以定时向外输出时间信息,我们可以把定时输出时间信息,认为是一种对外的服务。
1.3 服务对外部提供特定的价值输出
上面的程序通过定时调用time函数,从系统中获取时间信息,并将其输出到控制台。这已经可以称为一个本地服务了。
我们可以很容易的将输出位置,改为一个文件。
#include <iostream>
#include <time.h>
#include <thread>
#include <chrono>
const int sec10 = 10000;
bool LogData(char* data){
FILE *pf;
std::string filePath = "test.log";
pf = fopen( filePath.c_str(), "a");
if (pf == nullptr)
{
return false;
}
fputs(data, pf);
fclose(pf);
return true;
}
void SayHello(){
time_t now = time(nullptr);
char* ct = ctime(&now);
std::cout << "Hello world! time is " << ct << std::endl;
LogData(ct);
}
int main(){
while(true){
SayHello();
std::this_thread::sleep_for(std::chrono::milliseconds(sec10));
};
return 0;
}
如果增加了网络访问能力,可以将其改写为一个网络服务。
增加网络通信功能,可以改写为定时发送邮件的服务。
增加一个监听端口,响应客户端的请求,回复客户端当前服务器时间,就是一个简单的网络时间查询服务了。
综上所述,我们可以给服务一个定义:
服务是一个可以长时间运行的可执行程序,它通过处理输入信息,对外提供特定的价值输出。
当然,服务一般还具有以下特征:
可以在后台静默执行,不需要显示控制台或其他UI界面
可以注册到操作系统,由操作系统管理其启动、停止等行为
可以通过日志输出服务运行状态
可以接受用户请求,并给出符合预期的响应
后面的章节,我们将会逐步实现一个简单的服务框架
Last updated