赞
踩
开启一个 Serverless Function 链接到 DB
什么是 Serverless?
Serverless 意为 “无服务器架构”,但是这并不意味着真的就无需服务器了,这些服务器的管理由云计算平台提供,对于用户侧无须关注服务器配置、监控、资源状态等,可以将重点放在业务逻辑上。
下图,将 Microservices 进一步细分为 Function as a Service(FaaS)函数即服务,相比微服务颗粒度更小。
图片来源:stackify
关于 ServerLess 的基础入门,可参考我之前的另一片入门实践文章 使用 Node.js 快速开启 ServerLess Functions:入门实践指南
创建项目,安装 mongodb、serverless-offline 插件。
$ serverless create --template hello-world --path mongodb-serverless-conn-test
$ npm init
$ npm i mongodb -S
$ npm i serverless-offline --save-dev
数据库链接字符串就是上面 MongoDB Atlas cloud 链接集群中所讲的,注意替换你的用户名和密码,以下代码中 initialize 函数接收两个参数 dbName、dbCollectionName 用来初始化一个 connection。
// db.js
const MongoClient = require(“mongodb”).MongoClient;
const dbConnectionUrl = ‘mongodb+srv://:@cluster0-on1ek.mongodb.net/test?retryWrites=true&w=majority’;
async function initialize(
dbName,
dbCollectionName,
) {
try {
const dbInstance = await MongoClient.connect(dbConnectionUrl);
const dbObject = dbInstance.db(dbName);
const dbCollection = dbObject.collection(dbCollectionName);
console.log(“[MongoDB connection] SUCCESS”);
return dbCollection;
} catch (err) {
console.log([MongoDB connection] ERROR: ${err}
);
throw err;
}
}
module.exports = {
initialize,
}
我们想要测试下 MongoDB 的链接,以下是一个 ServerLess Function 我们在该函数中初始化了一个 Connection 然后调用了 find() 方法查找集合数据
// handler.js
‘use strict’;
const db = require(‘./db’);
module.exports.find= async (event, context) => {
const response = {
statusCode: 200,
};
try {
const dbCollection = await db.initialize(‘study’, ‘books2’);
const body = await dbCollection.find().toArray();
response.body = JSON.stringify({
code: 0,
message: ‘SUCCESS’,
data: body,
});
return response;
} catch (err) {
response.body = JSON.stringify({
code: err.code || 1000,
message: err.message || ‘未知错误’
});
return response;
}
};
$ serverless offline
$ curl http://localhost:3000/find
Serverless: GET /find (λ: find)
[MongoDB connection] SUCCESS
[]
似乎一切都是 Ok 的,证明我们的集群创建、链接都是成功的,但是有时候你可能会遇到以下错误
Error: querySrv ENODATA _mongodb._tcp.cluster0-on1ek.mongodb.net
以上正是我在链接 MongoDB Alats 过程中遇到的问题,这里再多提下,希望能对你有帮助,因为这花费了我很长时间,尝试使用 Google、Stackoverflow … 来搜索,但并没有找到好的解决方案,通过报错大致确认可能是网络和 DNS 的问题,修改 DNS 之后还是没有结果,后来我切换了网络,这个问题解决了。。。如果你有答案欢迎和我讨论,另外也建议检查链接字符串和 MongoDB Alats 白名单是否设置的正确。
两个问题
以上例子虽然已经简单的完成了一个方法,但是它其实是糟糕的,从而引发以下两个问题:
1. 业务逻辑与 FaaS、BaaS 严重的耦合不利于单元测试、平台迁移:上面这个例子是不好的,业务逻辑完全的写在了 handler.js 文件的 find 函数中,一方面 find 函数的 event、context 对象是由 FaaS 平台提供的,另一方面 db 属于后端服务,这就造成了业务逻辑与 FaaS、BaaS 严重的耦合。
2. 不利于上下文重用:传动程序启动之后常驻内存,不存在冷启动问题,而 ServerLess 是基于事件驱动的,第一次请求来了之后会下载代码、启动容器、启动运行环境、执行代码,这个过程称为冷启动,但是以 AWS Lambda 为例,函数调用之后执行上下文会被冻结一段时间,在我们上面的例子中每次函数执行都会初始化数据库链接,这是一个很耗时的操作,我们可以将这段逻辑放在函数之外,利用上下文重用,在开发层面可以做进一步优化。
Serverless REST API 开发最佳实践
带着上面提出的几点问题,本节将对这个业务逻辑进行重构,开发一个 REST API 最佳实践。
什么是 REST API?
API 的设计要保证职责单一、清晰合理、便于他人快速理解使用等原则,而 REST 也是 API 设计的一种准则,同时它也是一种架构思想,用于客户端与服务端资源传递与交互。
本节中我们将用到的是 GET、POST、PUT、DELETE 四个表示操作方式的动词,分别对应用于获取资源、新建资源、更新资源、删除资源。
关于 RESTful 架构的更多理解,可参考阮一峰老师的博客 “理解RESTful架构” www.ruanyifeng.com/blog/2011/09/restful.html
REST API 规划
以下是我们将要完成的 REST API 规划,包含四个 CRUD 操作
| CRUD | API Routes | Description |
| :-- | :-- | :-- |
| POST | /books | 增加一本书 |
| GET | /books | 获取所有书籍列表 |
| PUT | /books/:id | 根据 id 更新指定编号书籍 |
| DELETE | /books/:id | 根据 id 删除指定编号书籍 |
目录规划
一个好的项目离不开一个好的目录规划,当然你也可以按照自己思路来做
mongodb-serverless-node-rest-api
├── package.json
├── .env
├── serverless.yml
├── app
| ├── handler.js
│ ├── controller
│ | └── books.js
│ └── model
│ | ├── db.js
│ | ├── books.js (可选)
│ └── utils
│ ├── message.js
└── test
└── controller
└── books.test.js
项目创建、插件安装
这一次我没有直接使用 MongoDB 驱动,而用的 mongoose 来代替 MongoDB 操作。
$ serverless create --template hello-world --path mongodb-serverless-node-rest-api
$ npm init
$ npm i dotenv mongoose -S
$ npm i serverless-offline --save-dev
创建 .env 配置文件
将配置独立出来放入 .env 配置文件,统一管理。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
小编综合了阿里的面试题做了一份前端面试题PDF文档,里面有面试题的详细解析
CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
虽只说了一个公司的面试,但我们可以知道大厂关注的东西并举一反三,通过一个知识点延伸到另一个知识点,这是我们要掌握的学习方法,小伙伴们在这篇有学到的请评论点赞转发告诉小编哦,谢谢大家的支持!
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
ZG4ubmV0L0tlcGxlcl9JSQ==,size_16,color_FFFFFF,t_70)
虽只说了一个公司的面试,但我们可以知道大厂关注的东西并举一反三,通过一个知识点延伸到另一个知识点,这是我们要掌握的学习方法,小伙伴们在这篇有学到的请评论点赞转发告诉小编哦,谢谢大家的支持!
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。