Cloudgizer:一款新的开源 Web 开发工具简介

Cloudgizer 提供了高性能、小 footprint 以及更安全、更高效的 C 语言编程。
318 位读者喜欢这篇文章。
Databases as a service

Jason Baker。CC BY-SA 4.0。

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(或 JavaScriptCSS 等)可能会占据您代码的很大一部分。

工作原理

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 应用程序。此过程非常简单

 

Development process, Cloudgizer

如果需要,部署过程旨在自动化,并具有可配置的参数。

开始入门

开发从安装示例应用程序开始。这设置了开发环境;您从 Hello World 开始,并从那里构建您的应用程序。

示例应用程序也充当冒烟测试,因为它有许多代码片段,用于测试各种 Cloudgizer 功能。它还为您提供了大量的示例代码(因此得名)。

当您开始时,需要注意两个文件

  • cld_handle_request.v 是处理传入请求(例如 GETPOST 或命令行执行)的位置。
  • sourcelist 列出了您的所有源代码,以便 Cloudgizer 可以构建您的应用程序。

除了 cld_handle_request.v 之外,oops.v 实现了错误处理程序,而 file_too_large.v 实现了对上传文件过大的响应。这些已经在示例应用程序中实现,您可以保持原样或进行调整。

使用 cldbuild 重新编译源文件 (.v) 更改,并使用 cldpackapp 创建安装程序文件,以便通过 cldgoapp 进行测试或发布交付

cloudgizer development

通过 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 就像使用一种流行的脚本语言,但没有那些问题。

标签
Zigguro
Zigguro 开发免费的开源软件开发工具和业务应用程序。访问 zigguro.org 了解更多信息。

5 条评论

看起来很酷,但内联 HTML 似乎不是一个好主意。为什么不使用像 liquid 这样的模板系统,用 c 构建以提高速度。

其次,golang 在整个过程中都具有出色的功能,并且速度几乎一样快

编写 Web 应用程序的方法有很多种,您指出了其中的一些工具和语言。根据您的优先级,您的选择可能会有所不同。

如果性能是首要任务,并且需要简单性,那么 Cloudgizer 可能是更好的选择。

当不同的软件部分(例如您提到的那些)组合在一起时,通常复杂性会上升,性能会下降,互操作性几乎永远不会达到 100%,并且需要更多技能。这意味着成本上升,上市时间更长。

Cloudgizer 集成了构建企业 Web 应用程序所需的组件。当您这样看待它时,内联 HTML 比通过混合使用工具和框架来完成它更简洁、更快速,除非您出于某种原因想要这样做。

入门门槛在很多方面都很低。

首先,Cloudgizer 是一个 C 框架,因此即使它有附加构造,它也不是一种新语言,而是预处理的最终结果始终是纯 C 代码。

简单性来自诸如内联 HTML 和类似 HTML 的标记之类的东西。越简单越好。此外,基础设施细节也得到了处理。

目标是让初学者在几秒钟内直观地掌握代码。这对于 Cloudgizer 来说是可行的,因为 C 语言是大多数其他语言的基础,而 HTML 被非常广泛的人群使用。

虽然许多语言和工具都具有良好的性能,甚至“接近”的性能,但可以肯定地说,没有一种语言像 C 语言那样好。实现小 footprint 也是如此,这虽然是理想的,但通常被忽视。

Web 语言和工具通常是构建为虚拟机、p 代码生成器、解释器的框架,然后在这些框架之上构建框架。性能的损失和臃肿都在上升。特别是硬件跟不上臃肿,并且由于基本的物理限制,情况正在变得更糟。

对于云应用程序,在功耗、硬件价格和最终用户的满意度方面,高性能和小 footprint 将变得越来越重要。

在传统的 Web 应用程序中,公司会获得自己的专用服务器,并有充足的资源。

在云中,金钱更重要。而且,降低成本不仅仅是一个财务问题。更少的电力和更少的硬件意味着更少的污染和更少的垃圾。

使用 C 作为核心语言也服务于实用性的目的,这在对完成工作的能力充满信心方面很重要。作为真实可靠且拥有大量高质量库(尤其是开源库)的语言,C 在实用性方面表现出色。即使您想要的库不是用 C 编写的,C 链接也是无处不在的。

考虑一下使用其他 Web 框架进行调试的清晰度。在 C 以外的任何语言中,都存在抽象层,这些抽象层使直接调试比需要的更迂回。

来自解释器层、虚拟机和框架之上的框架的神秘消息不容易处理。这意味着您不需要来自编写框架的人员的帮助,因为在您和运行您的应用程序的最终代码之间没有任何东西。

最后,作为上述说明,您提到的 Web 模板系统 (liquid) 是用 Ruby 编写的,而 Ruby 又是用 C 编写的。Go 语言也是用 C 编写的。

为什么不首先使用 C,并在首先消除性能、footprint、稳定性、互操作性和可用性问题,如果您可以使 C 语言中的 Web 开发更丰富、更轻松、更安全、更高效?这就是 Cloudgizer 的全部意义所在。

我认识一些程序员,他们不确切知道他们的代码在机器级别(分配和内存使用、效率等)如何工作,而与选择的编程语言无关。
对于现代程序员来说,回到编程的起源,更多更好地了解计算架构,显然是有益的。

同意。这肯定会带来好处。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.