在Linux上使用Vely编写C应用程序的方法

225 阅读7分钟

Vely是一个用C语言编写网络和命令行应用程序的工具。Vely将高性能和与C语言编程相关的低足迹与易用性和改进的安全性结合起来,让人想起PHP等语言。它是免费的开源软件,并在GPLv3和LGPL3库中获得许可,因此你甚至可以用它来构建商业软件。

Vely适用于主要的Linux发行版和处理器架构。你可以使用网络服务器,如Apache、Nginx或其他,以及数据库,如MariaDB、PostgreSQL和SQLite。

你可以将Vely用于网络应用、命令行程序,作为中间件、数据库应用、服务软件、数据集成、IoT(物联网),以及其他任何地方。它很适合云计算,在容器中很容易工作,而且由于资源要求低,当内存和处理能力很高时,它也是一个很好的选择。

安装Vely

要尝试Vely,请安装Apache网络服务器和MariaDB数据库。你可以使用不同的网络服务器和数据库,设置也会类似,但在这个例子中,我使用Apache和MariaDB。

接下来,安装Vely。在Linux上使用软件包管理器,如dnfapt

股票代码项目

这个例子保存了股票行情的名称和它们的价格,这样你就可以在一个列表中查看它们。

首先创建stock.v 文件,并将此代码粘贴到其中。

#include "vely.h"

void stock() {
   out-header default
   @<html>
       @<body>
       input-param action
       input-param stock_name
       input-param stock_price
       if (!strcmp (action, "add")) {
          // Add to stock table, update if stock exists
          run-query#add_data@db = "insert into stock (stock_name,\
              stock_price) values ('%s', '%s') on duplicate key \
              update stock_price='%s'" : stock_name, stock_price, \
              stock_price
           end-query
           error#add_data to define err
           if (strcmp (err, "0")) {
               report-error "Cannot update stock price, error [%s]", err
           }
           @<div>
              @Stock price updated!
           @</div>
       } else if (!strcmp (action, "show")) {
         // Show stock names and values
           @<table>
               @<tr>
                   @<td>Stock name</td>
                   @<td>Stock price</td>
               @</tr>
               run-query#show_data@db = "select stock_name, \
                    stock_price from stock" output stock_name, \
                    stock_price
                   @<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>
       }
       @</body>
   @</html>
}

建立数据库

对于这个例子,创建一个名为dbstock 的数据库,由用户vely 拥有,密码为your_password 。这些是任意的名字,在现实生活中,你可以使用任何你想要的值,只要它们在你的代码中保持一致。

首先,以root身份登录到MariaDB数据库,并执行这个程序。

CREATE DATABASE IF NOT EXISTS dbstock;
FLUSH privileges;
CREATE USER IF NOT EXISTS vely@localhost IDENTIFIED BY 'your_password';
FLUSH privileges;
GRANT ALL privileges ON dbstock.* TO vely@localhost;
FLUSH privileges;
exit;

现在再次登录MariaDB并设置当前数据库。

$ mysql -u vely -pyour_password

现在你可以创建应用程序所需的数据库对象了。在这个例子中,你需要在dbstock 数据库中建立一个stock 表。

USE dbstock;
CREATE TABLE IF NOT EXISTS stock (stock_name VARCHAR(100) PRIMARY KEY, stock_price BIGINT);

最后,创建一个名为db 的数据库配置文件,以便你的应用程序可以登录到数据库中。你必须把它叫做db ,因为stock.v 中的代码就是用这个名字。比如说。

[...]
run-query#add_data@db = "insert into stock ..."
[...]

数据库名称前面有@ 符号,在本例中是@db ,所以数据库配置文件的名称是db 。和其他数值一样,你可以随心所欲地命名你的数据库配置文件,只要你的代码是一致的。

下面是db 文件的配置。

[client]
user=vely
password=your_password
database=dbstock

以上是一个标准的MariaDB客户端选项文件。Vely使用本地数据库连接,所以你可以指定一个给定数据库所允许的任何选项。

构建应用程序

接下来,你可以创建你的Vely应用程序。在这个例子中,你将创建一个名为stockapp 的Web应用。

$ sudo vf -i -u $(whoami) stockapp

这将在Vely目录下创建一个应用程序主页(/var/lib/vv),并为你执行必要的应用程序设置步骤。

要建立你的应用程序,请使用vv 命令。

$ vv -q --db=mariadb:db stockapp

下面是每个选项的含义。

  • -q 构建一个应用程序
  • --db 指定要使用的数据库 ( , 在你的配置文件中指定)mariadb:db
  • stockapp 是应用程序的名称

实际上,你可以在你的应用程序中使用任何数量的数据库和不同的供应商。不过这个例子很简单,所以你只需要一个数据库。Vely还有许多其他有用的选项,你可以使用,但现在这已经足够了。

配置网络访问

为了通过网络浏览器或各种网络客户端访问你的应用程序,你需要设置一个网络服务器。它可以是Apache、Nginx或任何其他支持FastCGI代理的服务器(如果不是全部,也是大部分的网络服务器和负载均衡器都会这样做)。在这里,我将设置Apache,但其他网站服务器的设置也类似。

proxyproxy_fcgi 模块在Fedora安装的Apache网络服务器上是默认安装和启用的,但你必须在基于Debian的系统(如Ubuntu)上启用它们。

$ sudo a2enmod proxy
$ sudo a2enmod proxy_fcgi
$ sudo systemctl restart apache2

如果您不是在基于Debian的系统上,您可以通过将其添加到Apache配置文件或/etc/httpd/conf.modules.d/ 目录中的文件来启用Apache模块,这取决于您的发行版本的配置。

接下来,在一个文本编辑器中打开你的Apache配置文件。例如,在一个基于Debian的系统上。

$ sudo vi /etc/apache2/apache2.conf

在Fedora系统上(包括Red Hat Enterprise Linux和CentOS)。

$ sudo vi /etc/httpd/conf/httpd.conf

将这一行添加到文件的末尾。

ProxyPass "/stockapp" unix:///var/lib/vv/stockapp/sock/sock|fcgi://localhost/stockapp

根据你的网络服务器配置,可能有一个更好的地方来添加ProxyPass 指令。不过对于这个例子来说,上面的内容已经足够了。

保存该文件并重新启动Webserver。在基于Fedora的系统上。

$ sudo systemctl restart httpd

在基于Debian的系统上。

$ sudo systemctl restart apache2

在这种情况下,你通过一个套接字连接到你的应用程序,但你可以使用一个TCP端口来代替(当你的应用程序驻留在一个容器或类似的东西中时,这就很方便了)。

运行应用程序

为你的应用程序启动应用服务器。

$ vf stockapp

默认情况下,这将为你的应用程序运行0到20个服务器进程,这取决于负载情况。当用户负载低时,你的应用程序几乎不使用任何内存。

这就是了!在你的网络浏览器中导航到http://127.0.0.1/stockapp?req=stock&action=add&stock_name=XYZ&stock_pri...,就可以看到这个应用程序。

你刚刚把股票 "XYZ "的价格更新为440。尝试不同的股票和价格来建立一个股票列表,你可以通过URLhttp://127.0.0.1/stockapp?req=stock&action=show 来查看。

恭喜你,你已经创建了你的第一个Vely应用程序,在Web服务器后面进行反向代理。

你也可以通过使用curl,在没有图形浏览器的情况下查看输出。

$ curl -s \
"http://127.0.0.1/stockapp?req=stock&action=add&stock_name=XYZ&stock_price=440"
$ curl -s "http://127.0.0.1/stockapp?req=stock&action=show"

从终端运行应用程序

你也可以从终端运行你的应用程序。终端命令总是和FastCGI应用服务器一起做的,它的名字和你的应用一样(在这个例子中,stockapp )。它的工作方式与网络应用完全相同。你可以把一些请求写到你的应用程序中,作为网络请求来完成,而另一些请求则从命令行运行。要做到这一点,你要把请求作为环境变量提供。例如,要以HTML形式输出股票列表,请输入。

$ export REQUEST_METHOD=GET
$ export QUERY_STRING="req=stock&action=show"
$ /var/lib/vv/bld/stockapp/stockapp

要抑制HTTP头信息,使用。

$ export VV_SILENT_HEADER=yes
$ /var/lib/vv/bld/stockapp/stockapp

Vely如何工作

你的应用程序通过处理请求和发送回复来工作。一个请求是两种HTTP方法之一。GET或POST。

一个请求总是有一个参数req 。在这里的例子中,它的值是stock 。这意味着从文件stock.v 中编译的源代码被自动调用来处理这样的请求。

一个像这样的源文件可以做许多不同的事情,所有这些都在逻辑上归为一个单一的请求。在这里,你有另一个参数action ,它的值可以是add (添加或更新一个股票)或show (显示一个股票列表)。你在添加或更新时指定stock_namestock_price 参数。很简单的东西。除了req ,你可以随心所欲地选择参数名称。

看一下stock.v 中的代码,它很容易理解。你使用input-param结构来获取输入参数的值。是的,C语言代码中那些不是C语言的奇怪东西是Vely语言结构体,它们为你做了很多有用的事情,比如run-query,它(正如你从名字中可以想到的)运行你的查询。一个简单的例子是@ ,它是一个输出结构。字符串的处理变得简单而可靠,不用担心缓冲区超限的问题。请查看Vely结构体的完整参考资料,了解Vely的功能。

Vely将你的代码中的所有结构体转换为纯C语言,并制成一个非常小而快速的本地可执行文件。你的应用程序以几个FastCGI服务器进程的形式运行,这些进程在接受和处理请求时,一直停留在内存中。所有这些进程都是并行工作的。

更多信息,请看Vely如何工作,并阅读更多关于Vely架构的内容。

管理字符串和内存

Vely的所有结构都有自动垃圾收集功能。事实上,大多数时候,你根本不需要释放内存,所以应用开发更加简单了。把这些交给Vely,享受没有内存泄漏的计算,内存问题远比你想象的要少。字符串结构,如write-string ,可以安全、快速、轻松地创建复杂的字符串,就像他们创建简单的字符串一样。

FastCGI程序管理器

即使你不想用Vely开发你自己的应用程序,你也可以使用vfVely的FastCGI程序管理器,用于任何通用的FastCGI程序,而不仅仅是那些用Vely创建的。

想了解更多关于Vely的信息?

我有时会被问到项目名称的问题。VelyVel(ocit)y的缩写。它编程快,理解代码和维护也快,运行时也快(而且小!)。它甚至很容易容器化。

请查看vely.dev的文档,其中的下载和例子超出了本文的介绍。