Azure服务以及Azure Function试用

Author Avatar
琉璃 2月 22, 2019

我考虑了一下,决定写一个很简单的从Web读取和写入数据库。数据库我就用Azure的云数据库,读写数据库的逻辑用Azure function实现。这样数据库的用户名和密码不会在前端裸奔。

我记得如果数据库读写较少的话,隔壁Google的Firebase是直接提供免费服务的,那Azure呢?刷新出Azure首页,复杂繁多的功能,各种不认识的术语密密麻麻地陈列在主页上。

嗯,这些术语好像都照过面,但是不熟啊。我只是想用一个最简单的SQL数据库。

Azure的产品种类繁多,规模也从小到大。就拿SQL数据库为例子,从一个月几刀到几千刀不等。神奇的是,你想要使用SQL数据库,你先要开一个SQL server实例,紧接着再在实例下面创建数据库。看看隔壁LeanCloud,数据库上手直接用,哪有这么复杂。数据库的位置倒有很多的选择,这个不错。

管理数据库可以用Azure的Web端的查询编辑器,也可以使用它的PC客户端。PC客户端又是一个不轻的东西,但它的功能的确要比Web端强上不少。支持一些预置脚本,比如查询前100条数据。支持GUI的方式创建和修改数据库。PC端的确比Web端强上不少。但是为什么PC端的功能不能再Web端实现呢?毕竟是云端数据库,不是本地数据库,都是靠使用API实现的。

Azure的SQL数据库是T-SQL,一个不常见的SQL数据库。语法上与其他数据库有小小的出出入。但是问题在于,T-SQL的教程非常的稀少。在微软官方那,我也没有看到一份令我满意的教程。也就这么慢慢摸索,我搞定了数据库。

Azure Function的开发就较为简单了。 NPM直接安装官方的开发工具。对与Function的触发器,我选择了HTTP Trigger,也就是以HTTP请求作为触发器。除了HTTP,还有时间和数据库内容发生改变作为触发器。除了Trigger,还有一个比较重要的概念是Input Binding和Output Binding。简单来说就是什么作为Input,什么作为Output.常见的选项有Queue,和各种数据库,比如Blog Storage(用来储存二进制文件),Cosomos Database。

从Function的一些基础概念绕了出来,实现一下我想要的功能想必是不难,只要没坑。微软有一个Tutorial关于从建立数据库到查询数据库。我用的是Typescirpt,便选了JS那一套。官方推荐的是一个叫Tedious的第三方库,看着很简单,官网也很简陋。我也就照抄了官网上的一些代码片段,将它们拼了起来,运行竟然报错。我看了两遍,跟官网上的长的一样啊。果断问了一下,竟然是没有写Error的Callback函数。

在等答案的过程中,我还去看了一眼微软官方的教程Quickstart: Use Node.js to query an Azure SQL database我简单跑了一跑,很好,没有什么问题。比那个Tedious官方的Get Started强上很多。我又在官方的基础上加了很多我自己的实现。比如数据库查询成功后的操作。一个天坑出现了,无论我怎么改我的代码,查询成功后的操作永远不执行。而且Debug过程中,即使程序没有抛出异常,每查询一次数据库,Debug都会退出一次。我再三检查,甚至打量起了从微软教程里扒来的代码。终于找到个罪魁祸首,就那一行代码。

var Connection = require('tedious').Connection;
var Request = require('tedious').Request;

// Create connection to database
var config =
{
    userName: 'your_username', // update me
    password: 'your_password', // update me
    server: 'your_server.database.windows.net', // update me
    options:
    {
        database: 'your_database', //update me
        encrypt: true
    }
}
var connection = new Connection(config);

// Attempt to connect and execute queries if connection goes through
connection.on('connect', function(err)
    {
        if (err)
        {
            console.log(err)
        }
        else
        {
            queryDatabase()
        }
    }
);

function queryDatabase()
{
    console.log('Reading rows from the Table...');

    // Read all rows from table
    var request = new Request(
        "SELECT TOP 20 pc.Name as CategoryName, p.name as ProductName FROM [SalesLT].[ProductCategory] pc "
            + "JOIN [SalesLT].[Product] p ON pc.productcategoryid = p.productcategoryid",
        function(err, rowCount, rows)
        {
            console.log(rowCount + ' row(s) returned');
            process.exit();
        }
    );

    request.on('row', function(columns) {
        columns.forEach(function(column) {
            console.log("%s\t%s", column.metadata.colName, column.value);
        });
    });
    connection.execSql(request);
}

那个process.exit()是几个意思?

代码修葺中。。。。。

发布函数很简单,直接在VsCode里操作插件就好了。但是上传一个函数,我得想三个到四个名字。一个Azure Function的名字,一个Resource Group的名字,一个Storage Group(我也不知道这个干嘛的)名字,还有一个Function App名字。起这些名字才是最纠结的时候。毕竟我都不知道这些名字都用在什么地方。

最后一步是处理云端中函数的执行环境。打开Portal里的Kudu。在Debug Console里进入程序目录,执行npm install。网页的终端真的是卡的不要不要的。安装个NPM,连安装时候的Output都显示不出来。让我真的是摸不着脑袋,鬼知道有没有安装成功。

简单来说使用经历不是那么喜人,算然VsCode的兼容很好,但很多时候都显得操作冗余。对于个人开发者来说,Azure价格要高一些,又显得较为麻烦,并不会是我的第一选择。再之,网上教程还不多,还有那个令人讨厌的Portal。一眼望去,满屏的滚动条,甚至两行的滚动条。

下次我肯定选LeanCloud或者Firebase。

This blog is under a CC BY-NC-SA 3.0 Unported License
本文链接:https://www.inevitable.tech/posts/b67da85e/