Vely是一个用C语言编写网络和命令行应用程序的工具。Vely将高性能和与C语言编程相关的低足迹与易用性和改进的安全性结合起来,让人想起PHP等语言。它是免费的开源软件,并在GPLv3和LGPL3库中获得许可,因此你甚至可以用它来构建商业软件。
Vely适用于主要的Linux发行版和处理器架构。你可以使用网络服务器,如Apache、Nginx或其他,以及数据库,如MariaDB、PostgreSQL和SQLite。
你可以将Vely用于网络应用、命令行程序,作为中间件、数据库应用、服务软件、数据集成、IoT(物联网),以及其他任何地方。它很适合云计算,在容器中很容易工作,而且由于资源要求低,当内存和处理能力很高时,它也是一个很好的选择。
安装Vely
要尝试Vely,请安装Apache网络服务器和MariaDB数据库。你可以使用不同的网络服务器和数据库,设置也会类似,但在这个例子中,我使用Apache和MariaDB。
接下来,安装Vely。在Linux上使用软件包管理器,如dnf 或apt 。
股票代码项目
这个例子保存了股票行情的名称和它们的价格,这样你就可以在一个列表中查看它们。
首先创建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:dbstockapp是应用程序的名称
实际上,你可以在你的应用程序中使用任何数量的数据库和不同的供应商。不过这个例子很简单,所以你只需要一个数据库。Vely还有许多其他有用的选项,你可以使用,但现在这已经足够了。
配置网络访问
为了通过网络浏览器或各种网络客户端访问你的应用程序,你需要设置一个网络服务器。它可以是Apache、Nginx或任何其他支持FastCGI代理的服务器(如果不是全部,也是大部分的网络服务器和负载均衡器都会这样做)。在这里,我将设置Apache,但其他网站服务器的设置也类似。
proxy 和proxy_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_name 和stock_price 参数。很简单的东西。除了req ,你可以随心所欲地选择参数名称。
看一下stock.v 中的代码,它很容易理解。你使用input-param结构来获取输入参数的值。是的,C语言代码中那些不是C语言的奇怪东西是Vely语言结构体,它们为你做了很多有用的事情,比如run-query,它(正如你从名字中可以想到的)运行你的查询。一个简单的例子是@ ,它是一个输出结构。字符串的处理变得简单而可靠,不用担心缓冲区超限的问题。请查看Vely结构体的完整参考资料,了解Vely的功能。
Vely将你的代码中的所有结构体转换为纯C语言,并制成一个非常小而快速的本地可执行文件。你的应用程序以几个FastCGI服务器进程的形式运行,这些进程在接受和处理请求时,一直停留在内存中。所有这些进程都是并行工作的。
更多信息,请看Vely如何工作,并阅读更多关于Vely架构的内容。
管理字符串和内存
Vely的所有结构都有自动垃圾收集功能。事实上,大多数时候,你根本不需要释放内存,所以应用开发更加简单了。把这些交给Vely,享受没有内存泄漏的计算,内存问题远比你想象的要少。字符串结构,如write-string ,可以安全、快速、轻松地创建复杂的字符串,就像他们创建简单的字符串一样。
FastCGI程序管理器
即使你不想用Vely开发你自己的应用程序,你也可以使用vf ,Vely的FastCGI程序管理器,用于任何通用的FastCGI程序,而不仅仅是那些用Vely创建的。
想了解更多关于Vely的信息?
我有时会被问到项目名称的问题。Vely是Vel(ocit)y的缩写。它编程快,理解代码和维护也快,运行时也快(而且小!)。它甚至很容易容器化。
请查看vely.dev的文档,其中的下载和例子超出了本文的介绍。