暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

TIAP 2022-07-12
478

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上,使用包管理器,如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使用本机数据库连接,因此您可以指定给定数据库允许的任何配置项。


              构建应用程序

              接下来,就可以创建应用程序了。在本例中,我们创建一个名为 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方法之一:GETPOST

                                    一个请求总会有一个参数 req, 在本例中是 stock。这表示从文件 stock.v 编译而来的源代码被自动调用来处理这个请求。

                                    像这样的源文件可以做许多不同的事情,所有这些都在一个请求下进行逻辑分组。在这里,有另一个参数action,可以是add(添加或更新股票)或show(显示股票列表)。添加或更新时,可以指定stock_namestock_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并有大量可供下载的例子。


                                    文章转载自TIAP,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                    评论