五、综合实战
5.1 Serverless 中使用 Node 操作 Mysql、Mongodb 数据库、以及配置 VPC 私有网络
云函数接入数据库
参考: https://cloud.tencent.com/document/product/583/51935
注意:配置私有网络的服务器需要在同一个地区
Nodejs Serverless 中操作 Mysql
- 准备工作:首先需要购买云数据库、或者自己在服务器上面搭建一个数据库
- 云函数操作 Mysql
购买云数据库 mysql
新建 mysql 云函数
- 选择和 mysql 同一个地域,程序之间通过 VPC 网络连接
- 选择私有网络,和 mysql 所在网络一致
如果没有需要新建私有网络,需要和 msyql 实例同一个地区,选择了新建的私有网络,mysql 实例那边网络需要修改一致
- 登录 mysql 数据库增加测试数据
新建 test 数据库
创建 user 表
- 修改云函数代码,保存部署即可
/************************************************** Node8.9-Mysql Reference: mysql api---https://www.npmjs.com/package/mysql Reference: How to access database---https://cloud.tencent.com/document/product/236/3130 Reference: How to connect api gateway with scf---https://cloud.tencent.com/document/product/628/11983 ***************************************************/ function wrapPromise(connection, sql) { return new Promise((res, rej) => { connection.query(sql, function(error, results, fields) { if (error) { rej(error) } res(results) }) }) } exports.main_handler = async (event, context, callback) => { const mysql = require('mysql'); const connection = mysql.createConnection({ host: '167.16.0.17', // The ip address of cloud database instance, 云数据库实例 ip 地址 user: 'root', // The name of cloud database, for example, root, 云数据库用户名,如 root password: 'xx', // Password of cloud database, 云数据库密码 database: 'test', // Name of the cloud database, 数据库名称 port: "3306" }); connection.connect(); const querySql = `SELECT * from user` let queryResult = await wrapPromise(connection, querySql) connection.end(); return queryResult }
重新部署
- 创建 API 网关触发器,在浏览器中访问
浏览器中访问查看效果
Nodejs Serverless 中操作 Mongodb
- 准备工作:首先需要购买云数据库、或者自己在服务器上面搭建一个数据库
- 云函数操作 Mongodb
购买 MongoDB 数据库
创建云函数
- 选择地区
- 选择私有网络,和 mongodb 所在网络一致
- 修改云函数代码
const {promisify} = require('util') const mongodb = require('mongodb') var mongoClient = mongodb.MongoClient, assert = require('assert'); const connect = promisify(mongodb.connect) // URL combination // var url = 'mongodb://mason_mongodb:mason12345@10.10.11.19:27017/admin'; var url="mongodb://mongouser:password@10.0.0.13:27017,10.0.0.8:27017,10.0.0.11:27017/admin?authSource=admin&replicaSet=cmgo-e23piswf_0" exports.main_handler = async (event, context, callback) => { console.log('start main handler') const MongoClient = require("mongodb").MongoClient; const mc = await MongoClient.connect(url,{useNewUrlParser: true}) const db = mc.db('testdb') const collection = db.collection('demoCol') await collection.insertOne({a:1,something:'你好 serverless'}) const as = await collection.find().toArray() console.log(as) mc.close() return as }
创建触发器
5.2 Serverless BaaS 对象云存储 Cos 介绍、Node 操作 Cos、实现图片上传到 Cos 中
对象云存储 Cos 介绍
狭义的 Serverless 是指现阶段主流的技术实现:狭义的 Serverless 是 FaaS
和 BaaS
组成
对象存储(Cloud Object Storage,COS)是一种存储海量文件的分布式存储服务,具有高扩 展性、低成本、可靠安全等优点。通过控制台、API、SDK 和工具等多样化方式,用户可简 单、快速地接入 COS,进行多格式文件的上传、下载和管理,实现海量数据存储和管理。
Nodejs 操作 Cos
参考官方文档: https://cloud.tencent.com/document/product/436/8629
cnpm i cos-nodejs-sdk-v5 --save
const COS = require('cos-nodejs-sdk-v5'); const fs=require("fs"); //配置 cos 的 sdk https://console.cloud.tencent.com/cam/capi var cos = new COS({ SecretId: 'xx', SecretKey: 'xx' }); //上传本地图片到对象云存储里面 cos.putObject({ Bucket: 'express-demo-1251179943', /* 必须存储桶名称 */ Region: 'ap-guangzhou', /* 必须 区域*/ Key: 'a.png', /* 必须 目录/文件的名称 */ StorageClass: 'STANDARD', Body: fs.createReadStream('./a.png'), // 上传文件对象 onProgress: function(progressData) { console.log(JSON.stringify(progressData)); } }, function(err, data) { console.log(err || data); });
Express 在 Serverless 中实现图片上传到 Cos 中
安装模块 multer https://github.com/expressjs/multer
npm install --save multer
配置 form 表单
<!-- views/index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Serverless Component - Express.js</title> <link rel="stylesheet" href="/css/basic.css"> </head> <body> <form action="/doUpload" method="post" enctype="multipart/form-data"> 用户名:<input type="text" name="username" /> <br> <br> 头 像 : <input type="file" name="face" /> <br> <br> <input type="submit" value="提交"> </form> </body> </html>
配置内存存储引擎 ( MemoryStorage
),内存存储引擎将文件存储在内存中的 Buffer
对象,它没有任何选项
var storage = multer.memoryStorage() var upload = multer({ storage: storage })
接收文件上传文件到云存储
// app.js const express = require('express'); const path = require('path'); const ejs = require("ejs"); var bodyParser = require('body-parser') var multer = require('multer'); var tools = require('./services/tools.js'); const app = express(); //配置上传 var storage = multer.memoryStorage(); var upload = multer({ storage: storage }); // 配置中间件 app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()) //配置模板引擎 app.engine("html", ejs.__express) app.set("view engine", "html") //会对指定类型进行 Base64 编码 app.binaryTypes = ['*/*']; //静态 web 服务 app.use(express.static("public")); // Routes app.get(`/`, (req, res) => { res.render("index", { title: "你好 serverless" }) }); //注意:https://github.com/serverless-components/tencent-koa/blob/master/docs/upload.md app.post(`/doUpload`, upload.single("face"), async (req, res) => { console.log(req.body); console.log(req.file); //上传本地图片到对象云存储里面 注意异步 let result = await tools.uploadCos(req.file.originalname, req.file.buffer) res.send({ body: req.body, result: result }); }); // Error handler app.use(function (err, req, res, next) { console.error(err); res.status(500).send('Internal Serverless Error'); }); module.exports = app;
// services/tools.js const COS = require('cos-nodejs-sdk-v5'); module.exports={ uploadCos(filename,source){ let cos = new COS({ SecretId: 'xx', SecretKey: 'xx' }); return new Promise((reslove, reject) => { cos.putObject({ Bucket: 'test-xx', /* 必须 */ Region: 'ap-beijing', /* 必须 */ Key: 'test/' + filename, /* 必须 test 为目录名称 */ StorageClass: 'STANDARD', Body: source, // 上传文件对象 onProgress: function (progressData) { console.log(JSON.stringify(progressData)); } }, function (err, data) { if(err){ reject(err); }else{ reslove(data); } }); }) } }
上传文件需要注意
https://github.com/serverless-components/tencent-koa/blob/master/docs/upload.md
修改 serverless.yml
app: appDemo stage: dev component: koa name: koaDemo inputs: # 省略... apigatewayConf: isBase64Encoded: true # 需要加上,否则上传图片到 cos 预览有问题 # 省略... # 省略...
完整 serverless.yml
app: expressdemo component: express name: expressDemo inputs: runtime: Nodejs10.15 region: ap-guangzhou src: src: ./ exclude: - .env - .git - node_modules apigatewayConf: enableCORS: false isBase64Encoded: true # 需要加上,否则上传图片到 cos 预览有问题 protocols: - http - https environment: release
部署,然后在 webIDE 开启自动安装依赖
sls deploy
5.3 Serverless、Cos 中配置域名访问以及 Serverless 中配置 https 访问
Serverless 中配置域名访问
找到云函数对应的 api 网关
编辑 api 网关 点击域名管理
新建域名
解析域名
Serverless 中配置 https 访问
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。
HTTPS 是在 HTTP 的基础上添加了安全层,从原来的明文传输变成密文传输,当然加密与解 密是需要一些时间代价与开销的,不完全统计有 10 倍的差异。
在当下的网络环境下可以忽 略不计,已经成为一种必然趋势。 目前微信小程序请求 Api 必须用 https、Ios 请求 api 接口必须用 https
https 证书类型
- 域名型 https 证书(DVSSL):信任等级一般,只需验证网站的真实性便可颁发证书保护网站
- 企业型 https 证书(OVSSL):信任等级强,须要验证企业的身份,审核严格,安全性更高
- 增强型 https 证书(EVSSL):信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高, 同时可以激活绿色网址栏
创建证书
选择证书
Cos 中配置域名
配置域名
域名解析
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论