Cloudgizer 是一款免费的开源工具,用于构建 Web 应用程序。它结合了脚本语言的易用性和 C 语言的性能,有助于管理云应用程序的开发工作和运行时资源。
Cloudgizer 在 Red Hat/CentOS Linux 上与 Apache Web 服务器 和 MariaDB 数据库 一起工作。它在 Apache License version 2 许可下获得许可。
Hello World
在本示例中,我们输出一个 HTTP 标头和 Hello World,后跟一条水平线
#include "cld.h"
void home()
{
/*<
output-http-header
Hello World!
<hr/>
>*/
}
Cloudgizer 代码以 C 语言注释的形式编写,分别以 /*<
和 >*/
开头和结尾。
向 Web 客户端写入输出就像直接在源代码中编写 HTML 代码一样简单。没有 API 调用或特殊的标记—简单性是好的,因为 HTML(或 JavaScript、CSS 等)可能会占据您代码的很大一部分。
工作原理
Cloudgizer 源文件(扩展名为 .v
)通过 cld
命令行工具转换为 C 代码。然后编译 C 代码并将其与 Web 服务器链接,您的应用程序就可以使用了。例如,名为 home.v
的源文件生成的代码将是 __home.c
,如果您想检查它。
您的许多代码将以“标记”的形式编写,这些标记是直观且描述性的小代码片段,可让您轻松完成以下操作:
- 数据库查询
- Web 编程
- 编码和加密
- 执行程序
- 安全字符串操作
- 文件操作
- 发送电子邮件
以及其他常见任务。对于不太常见的任务,有一个 API 可以涵盖更广泛的功能。最终,您可以编写任何 C 代码并使用您希望完成任务的任何库。
main()
函数由 Cloudgizer 生成,并且是框架的一部分,该框架提供 Apache 和数据库集成以及其他服务。其中一项服务是跟踪和调试(包括内存垃圾回收、下溢/溢出检测、运行时 HTML 代码检查等)。程序崩溃会生成完整的堆栈,包括源代码行,并且崩溃报告会在发生崩溃时立即通过电子邮件发送给您。
Cloudgizer 应用程序作为 Apache 模块在预派生配置中与 Apache 服务器链接。这意味着 Apache Web 服务器将预派生多个进程并将传入的请求定向到这些进程。Apache 模块机制为应用程序提供高性能的请求处理。
所有 Cloudgizer 应用程序都在同一个 Linux 用户下运行,每个应用程序都与其自己的应用程序目录分隔开来。此用户也是 Apache 用户;即,运行 Web 服务器的用户。
每个应用程序都有自己的数据库,其名称与应用程序的名称匹配。Cloudgizer 跨请求建立和维护数据库连接,从而提高性能。
开发过程
编译源代码和构建安装文件的过程是自动化的。通过使用 cldpackapp
脚本,您将把您的代码转换为纯 C 代码并创建一个安装文件(.tar.gz 文件)。最终用户将在名为 appinfo
的配置文件的帮助下安装此文件,从而生成一个可用的 Web 应用程序。此过程非常简单

如果需要,部署过程旨在自动化,并具有可配置的参数。
开始入门
开发从安装示例应用程序开始。这设置了开发环境;您从 Hello World 开始,并从那里构建您的应用程序。
示例应用程序也充当冒烟测试,因为它有许多代码片段,用于测试各种 Cloudgizer 功能。它还为您提供了大量的示例代码(因此得名)。
当您开始时,需要注意两个文件
cld_handle_request.v
是处理传入请求(例如GET
、POST
或命令行执行)的位置。sourcelist
列出了您的所有源代码,以便 Cloudgizer 可以构建您的应用程序。
除了 cld_handle_request.v
之外,oops.v
实现了错误处理程序,而 file_too_large.v
实现了对上传文件过大的响应。这些已经在示例应用程序中实现,您可以保持原样或进行调整。
使用 cldbuild
重新编译源文件 (.v
) 更改,并使用 cldpackapp
创建安装程序文件,以便通过 cldgoapp
进行测试或发布交付

通过 cldgoapp
进行部署可让您从头开始安装应用程序或从一个版本更新到另一个版本。
示例
这是一个股票行情自动收录器应用程序,用于更新和报告股票价格。它包含在示例应用程序中。
代码
请求处理程序检查 URL 查询参数 page,如果它是 stock
,它会调用 function stock()
#include "cld.h"
void cld_handle_request()
{
/*<
input-param page
if-string page="stock"
c stock ();
else
report-error "Unrecognized page %s", page
end-if
>*/
}
函数 stock()
的实现将在文件 stock.v
中。如果 URL 查询参数 action 是 add
,则代码会添加股票行情自动收录器;如果它是 show
,则代码会显示所有股票行情自动收录器。
#include "cld.h"
void stock()
{
/*<
output-http-header
<html>
<body>
input-param action
if-string action="https://open-source.net.cn/add"
input-param stock_name
input-param stock_price
run-query#add_data = "insert into stock \
(stock_name, stock_price) values \
(<?stock_name?>, <?stock_price?>) \
on duplicate key update \
stock_price=<?stock_price?>"
query-result#add_data, error as \
define err
if atoi(err) != 0
report-error "Cannot update \
stock price, error [%s]",err
end-if
end-query
<div>
Stock price updated!
</div>
else-if-string action="https://open-source.net.cn/show"
<table>
<tr>
<td>Stock name</td>
<td>Stock price</td>
</tr>
run-query#show_data = "select stock_name, \
stock_price from stock"
<tr>
<td>
query-result#show_data, stock_name
</td>
<td>
query-result#show_data, stock_price
</td>
</tr>
end-query
</table>
else
<div>Unrecognized request!</div>
end-if
</body>
</html>
>*/
}
数据库表
使用的 SQL 表将是
create table stock (stock_name varchar(100) primary key, stock_price bigint);
制作和打包
要将 stock.v
包含在您的 Cloudgizer 应用程序中,只需将其添加到 sourcelist 文件中即可
SOURCE_FILES=stock.v ....
...
stock.o : stock.v $(CLDINCLUDE)/cld.h $(HEADER_FILES)
...
要重新编译对代码的更改,请使用
cldbuild
要打包您的应用程序以进行部署,请使用
cldpackapp
在打包应用程序时,您创建的所有其他对象(源代码文件除外)都应包含在 create.sh
文件中。此文件设置 Cloudgizer 应用程序安装程序未执行的任何操作;在本例中,创建上述 SQL 表。例如,以下 create.sh
中的代码可能就足够了
echo -e "drop table if exists stock;\ncreate table stock (stock_name varchar(100) primary key, stock_price bigint);" | mysql -u root -p$CLD_DB_ROOT_PWD -D $CLD_APP_NAME
在 create.sh
中,您可以使用 appinfo
文件(安装配置文件)中的任何变量。这些变量始终包括 CLD_DB_ROOT_PWD
(根密码数据库,为了安全起见,在安装后始终自动清除)、CLD_APP_NAME
(应用程序和数据库名称)、CLD_SERVER
(安装服务器的 URL)、CLD_EMAIL
(管理和通知电子邮件地址)等。您还可以使用 CLD_APP_HOME_DIR
(应用程序的主目录)和 CLD_APP_INSTALL_DIR
(安装 .tar.gz 文件已解压缩的位置,因此您可以从中复制文件)。您可以在 appinfo
文件中包含您认为有用的任何其他变量。
使用应用程序
如果您的应用程序名称为“myapp”,运行在 myserver.com 上,则更新股票行情自动收录器的 URL 将是这样
https://myserver.com/go.myapp?page=stock&action=add&stock_name=RHT&stock_price=500
而显示所有股票行情自动收录器的 URL 将是这样
https://myserver.com/go.myapp?page=stock&action=show
(所有 Cloudgizer 应用程序的 URL 路径始终以 go.
开头;在本例中为 go.myapp
。)
下载和更多示例
有关更多示例或下载和安装详细信息,请访问 https://dasoftver.bitbucket.io/cloudgizer/。您还将在安装中找到上述示例(请参阅 示例应用程序源代码)。
对于一个更大的真实世界示例,请查看 Rentomy 的源代码,Rentomy 是一款免费的开源云应用程序,专为租赁物业经理设计,完全用 Cloudgizer 编写,包含超过 32,000 行代码。
为什么要使用 Cloudgizer?
以下是 Rentomy 使用 Cloudgizer 编写的原因
最初,目标是使用一种流行的脚本语言或进程虚拟机(如Java),并将 Rentomy 作为软件即服务 (Saas) 免费托管。
由于仅在美国就有近 5000 万套出租房,因此像这样的免费服务需要卓越的软件性能。
因此,从 CPU 中榨取更多性能并减少 RAM 使用变得非常重要。随着摩尔定律放缓,流行的 Web 语言的臃肿正花费更多的计算资源——我们谈论的是进程虚拟机、解释器、p 代码生成器等。
调试可能很痛苦,因为在您和真正发生的事情之间存在更多抽象层。并非每个库都可以轻松使用,因此仍然存在一些功能和互操作性限制。
另一方面,就卓越的性能和小 footprint 而言,没有比 C 更好的了。大多数库都是用 C 编写的,原因相同,因此几乎您需要的任何库都可用,并且调试非常简单。
但是,C 在内存和整体安全性(溢出、下溢、垃圾回收等)、可用性(它是低级的)、应用程序打包等方面存在问题。同样重要的是,大部分开发成本在于编写和调试代码的容易程度以及新手对其的可访问性。
从这个角度来看,Cloudgizer 应运而生。更高的性能和更小的 footprint 意味着更便宜的计算能力。简单、稳定的编码为开发过程带来了禅意,更好地管理它的能力也是如此。
事后看来,使用 Cloudgizer 构建 Rentomy 就像使用一种流行的脚本语言,但没有那些问题。
5 条评论