
RESTful Web API 设计中要避免的 6 个常见错误
如今,随着 Node.js 在微服务领域的广泛应用,其高效的生产力和强大的社区支持使其备受关注。尽管 Node.js 是一个非常强大的云计算开发平台,但其性能依赖于多层抽象,这可能带来一定的性能损失。而本文的重点是通过现代 C++ 实现微服务,利用 C++ 的高性能优势,同时达到与 Node.js 类似的生产力水平。如果你和我一样热爱 C++,并欣赏其零抽象层的特性,那么这篇文章将为你提供有价值的参考。
为了编写和调试代码,我们将使用 Visual Studio Code(VSC),但你也可以选择 macOS 上的 Xcode,Windows 上的 Visual Studio,或者 vim、Emacs 等其他工具。由于项目并不依赖于特定的 IDE,你可以根据自己的习惯选择开发环境。
在本文中,我们使用 macOS 作为开发环境,并通过 Homebrew 安装了大部分依赖项。以下是安装的基本步骤:
$ brew update
安装完成后,你应该能够在以下目录中找到 Boost 库(版本可能因时间而异):
/usr/local/Cellar/boost/1.60.0_1
我们将使用 C++ REST SDK 来创建一个多线程服务器,该服务器提供 REST API 接口。这种架构非常适合构建高性能、任务关键型的微服务后端。
该服务的基本架构如下所示:
在架构中,控制器为每种 HTTP 方法提供处理程序,包括以下方法:
-GET
–POST
-PUT
-DELETE
-HEAD
-TRACE
-CONNECT
–MERGE
-PATCH
控制器的核心是 web::http::experimental::listener::http_listener
类,它使服务能够监听 HTTP 请求。一旦收到请求,http_listener
会验证请求的有效性,并检查是否支持相应的 HTTP 方法。如果支持,则将请求传递给控制器进行进一步处理。控制器会在独立的线程中执行请求逻辑,从而确保 http_listener
能够快速响应新的请求。
为了注册处理程序,我们使用了一个名为 MicroserviceController
的类。该类继承自 BasicController
和 Controller
,其中:
BasicController
提供了对 http_listener
的封装,以及一些便捷方法(如解析端点字符串、获取主机 IP 地址等)。Controller
定义了接口,MicroserviceController
实现了这些接口的具体逻辑。以下是 MicroserviceController
的部分代码示例:
#pragma once
using namespace cfx;
#include ;
class MicroserviceController : public BasicController, public Controller {
// 实现代码
};
在实现中,MicroserviceController
覆盖了 BasicController::initRestOpHandlers()
方法,并为每种 HTTP 方法提供具体的处理逻辑。例如,以下代码展示了 GET 方法的处理程序:
void MicroserviceController::handleGet(http_request message) {
// 处理 GET 请求的逻辑
}
通过类方法 _requestPath
,可以解析请求路径并提取 REST API 的输入参数。如果请求成功,服务会返回 JSON 格式的响应;如果路径不匹配,则返回 HTTP 404 错误。
服务的初始化逻辑位于 main.cpp
文件中,以下是主要步骤:
挂接 SIGINT 中断信号,用于处理用户在终端输入的 Ctrl+C 操作:
InterruptHandler::hookSIGINT();
创建并初始化服务,同时监听指定端点的请求。端点可以是自动检测的主机 IP 地址(IPv4 或 IPv6),也可以是固定的域名或 IP 地址。例如:
server.accept().wait();
在调试模式下,服务进程会生成大约 40 个线程,这些线程由 PPLX 调度程序管理,用于高效处理并发请求。
设置阻塞调用,等待用户中断:
InterruptHandler::waitForUserInterrupt();
当用户终止进程时,关闭服务并等待所有线程完成:
server.shutdown().wait();
通过本文的介绍,我们可以看到,使用现代 C++ 实现微服务的过程并不复杂,其代码结构与 Node.js 实现 REST 接口的方式非常相似。在后续文章中,我将进一步探讨如何从 JSON 请求中提取数据,以及如何为服务添加 SSL 支持。
原文链接: https://medium.com/@ivan.mejia/modern-c-micro-service-implementation-rest-api-b499ffeaf898