Vely 是一种用C编写web和命令行应用程序的工具,其结合了高性能、低占用空间、易用且安全等特性。它是免费的开源软件,并在GPLv3和LGPL 3 下授权,因此可以使用它开发商业软件。
Vely 适用于主流的Linux发行版,你可以使用Web服务器,比如Apache,Nginx等,数据库可以是MariaDB, PostgreSQL或者SQLite等。
你可以将Vely用于web应用,命令行程序,中间件,数据库应用程序,服务软件,数据集成,loT(网络),以及任何其他地方。它非常适合于云计算,可以轻松的在容器中工作,并且由于其资源需求低,所以在内存或其他硬件资源较紧张的情况下,Vely也是一个不错的选择。
安装Vely
要安装Vely,需要安装 Apache web服务器和MariaDB数据库。当然也可以选择其他的web服务器和数据库,设置是类似的。在本例中,我们使用Apache和MariaDB。
接下来,安装Vely。在Linux上,使用包管理器,如dnf或apt。
股票行情项目
本例保存股票报价器的名称及其价格,以便展示列表。
创建文件 stock.v,编辑如下代码:
#include "vely.h"void stock() {out-header default@<html>@<body>input-param actioninput-param stock_nameinput-param stock_priceif (!strcmp (action, "add")) {// Add to stock table, update if stock existsrun-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_priceend-queryerror#add_data to define errif (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=velypassword=your_passworddatabase=dbstock
以上是标准的MariaDB客户端配置项文件。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 还有其他许多丰富的配置项。不过本例比较简单,只用一个数据库。
配置web访问
要通过浏览器访问应用程序,还需要设置web服务器。可以是Apache,Nginx或者其他支持FastCGI代理的服务器。在本例中,我们使用Apache,其他的web服务器的设置是类似的。
在Fedora上安装Apache服务器,proxy 和 proxy_fcgi 模块默认是被安装和启用的,但是在基于Debian的系统(比如Ubuntu)上,你需要启动它们:
$ sudo a2enmod proxy$ sudo a2enmod proxy_fcgi$ sudo systemctl restart apache2
如果你的系统不是基于Debian的,可以通过将Apache模块添加到Apache配置文件或 /etc/httpd/conf.modules.d/ 目录下的文件中来启动Apache模块,这取决于你所使用的Linux发行版的配置。
接下来,在文本编辑器中打开Apache配置文件。例如,在基于Debian的系统上:
$ sudo vi etc/apache2/apache2.conf
在Fedora系统(包括Red Hat和CentOS)中:
$ sudo vi etc/httpd/conf/httpd.conf
在文件的末尾添加如下配置:
ProxyPass "/stockapp" unix:///var/lib/vv/stockapp/sock/sock|fcgi://localhost/stockapp
根据你的web服务器配置,可能有其他更合适的地方添加ProxyPass指令。然而,对于我们这个例子,上述内容就够了。
保存并且重启web服务。在Fedora系统中执行如下命令:
$ sudo systemctl restart httpd
在基于Debian的系统中执行如下命令:
$ sudo systemctl restart apache2
在上述例子中,我们是通过socket连接到应用程序中的。除此以外还可以通过TCP端口(当应用程序在容器或类似容器中时,TCP端口更方便)。
启动系统
启动应用程序服务器:
$ vf stockapp
默认情况下,根据负载情况,它可以为应用程序运行0到20个服务器进程。当用户负载较低时,应用程序几乎不使用内存。
在浏览器中访问
http://127.0.0.1/stockapp?req=stock&action=add&stock_name=XYZ&stock_price=440
就会看到我们的应用程序了。
更改部分股票代码的价格,尝试不同的值,来建立一个列表,可以通过地址来查看:http://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)相同,它的工作原理与web应用程序完全相同。你可以将一些请求写入应用程序以作为web请求来实现,而其他请求则从命令行运行。为此,你需要将请求作为环境变量提供。例如,要将股票列表输出为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_name和stock_price作为参数。很简单的事情,除了 req,你可以根据需要选择参数名称。
看一下 stock.v 中的代码,这很容易理解。可以使用 input-param 来获取输入参数的值。是的,代码中的那些奇怪的东西不是C,而是Vely的语言结构(https://vely.dev/language_constructs.html)。它们为你做了很多有用的事情,例如 run-query,它会运行你的查询。一个简单的例子是 @,这是一个输出结构。字符串的处理简单可靠,不会担心有内存溢出的情况。你可以查阅Vely结构的参考资料(https://vely.dev/reference.html),来了解更多Vely的相关功能。
Vely 会将文件中的代码转换为C,并生成一个非常小且快速的本机可执行文件。应用程序作为多个FastCGI服务器进程运行,这些进程在接受和处理请求时驻留在内存中,所有这些过程都是并行工作的。
更多详情,可参考 Vely是怎样工作的(https://vely.dev/how_vely_works.html)。
管理字符串和内存
Vely 具有自动垃圾回收机制。大多数时候,你不需要手动释放内存,可以更专注于应用程序的开发。字符串函数(比如write-string)会很方便、快速且安全的创建复杂的字符串。
FastCGI项目管理
即便你不想使用Vely开发自己的应用程序,也可以使用 vf(Vely的FastCGI项目管理器),和其他通用的FastCGI程序一起使用。
Vely 是 Velocity 的缩写,可快速高效的编写、阅读以及运维程序,运行速度快(而且小)。更多关于Vely的详细信息,可以查看 vely 文档(http://vely.dev/),上面详细介绍了Vely并有大量可供下载的例子。




