`

Build RESTful API and Microservices By LoopBack 4

阅读更多

 

框架为编程提供了不同的体验,例如基于 MVC 架构(数据模型、用户视图,以及其间通讯的控制器)的框架大大降低了程序的移植、维护、扩展和重用的成本;Express 为开发者提供了快速、独立、极简的 Web 应用开发框架,使用者可以基于此很快实现 Web 应用。Sails 框架可以基于 Express 提供比 Express 更多的开箱即用的全栈功能,比如身份验证、ORM、WebSockets 和 EJS 模板,它的 Blueprints API 生成器允许你使用最少的手动编码生成 API 端点。而 Meteor 框架比 Express 或 Sails 更有主见,它使用在线数据而不是服务器端渲染,且支持热重载。

 

Web、Android 或 iOS 设备与微服务的所有交互都需要通过 API 进行。因此 API 的设计在为这些接口提供数据方面发挥着重要作用。这意味着微服务只有一种通信媒介,即 API。

 

因此在为我们的微服务/后端服务编写实现之前,需要首先考虑我们的 API 的优先设计。API 是业务驱动程序,因此在系统开发之初就开发它。

 

API 优先方法的好处:

 

  • 可重用/可组合
  • 企业 允许并行开发
  • 在项目的整个生命周期内降低总成本。
  • 降低故障风险
  • 更快的增长
  • 不受约束

你可能会使用一个简单的 REST API 框架来处理对服务器的 CRUD 请求。使用 Express 几乎可以做到这一点。

 

  • GET 请求:用于获得对资源的只读访问权限。
  • POST 请求:用于创建或插入新资源。
  • PUT 请求:用于更新现有资源。
  • DELETE 请求:用于删除现有资源。

 

RESTful 架构风格描述了六个指导约束。

 

  • 统一的界面:它简化并解耦了架构,并使系统的每个部分独立。它使用 URI 来识别资源。每个资源在概念上都与返回给客户端的表示分离。服务器定义传输模型的类型。
  • 无状态:服务器不保留会话信息,这使其成为大容量应用程序的理想选择;同时无状态提高了性能。
  • 可缓存性:可以提供陈旧或不适当的数据以响应进一步的请求,以提高性能和可扩展性。
  • 客户端-服务器:根据分离规则,该设计强制执行的关注点将用户界面与数据存储区分开来。
  • 分层系统:客户端通常无法判断它是直接连接到终端服务器还是连接到中间服务器。如果在客户端和服务器之间放置代理服务器或负载平衡器,则不会中断它们的通信。中间服务器可以通过启用负载平衡和提供共享缓存来提高系统可伸缩性。
  • 按需代码(可选):服务器可以通过传输可执行代码临时扩展或定制客户端的功能。

 

 

Express

 

快速、无偏见、极简的 Node 框架。只提供你需要的东西。该框架本身提供的功能很少,而不是允许广泛的中间件链来处理请求。

 

由于其健壮性,许多流行的框架(如 Feathers、Kraken、Sails、Kites、NestJs 等)都基于 Express。

 

它是一个最小且灵活的基于 node.js 的 Web 应用程序框架,可为 Web 和移动应用程序提供一组强大的功能。

 

由于它在 node.js 之上提供了一个层,我们可以高效地访问 JavaScript 函数。它适用于编写具有服务器渲染的应用程序,因为它支持许多模板引擎(例如 pug 和 handlebars)。对于 API 开发,它包含中间处理程序和许多 HTTP 服务/实用程序方法。

 

在我们使用 REST API 框架来处理对服务器的 CRUD 请求时,Express 虽然也可以做到,但也有专门用于处理这种特殊情况的框架。

 

 

 

Loopback(推荐)

Loopback 是 github 上非常受欢迎的开源 Node.js REST API 框架,它基于 Express 高度扩展,可以让你快速创建动态 API 和微服务。LoopBack 4 是下一代 LoopBack。

 

基于 Express 的高度可扩展的开源 Node 和 TypeScript 框架,可让你快速创建后端系统(例如数据库和 SOAP 或 REST 服务)组成的 API 和微服务。

 

它是一种新的、改进的编程模型,具有依赖注入和组件、混合、存储库等新概念,使其具有最大的可扩展性。 LoopBack 允许我们使用 OpenAPI-to-GraphQL 为任何 REST API 创建一个 GraphQL 接口。

 

它带有一个命令行工具,用于轻松生成项目和创建控制器和模型,并提供附加支持以轻松进行身份验证和授权。它不为视图或模板或专用 ORM 提供任何支持,因为它仅用作 API。

 

Loopback 允许你在几分钟内以最少的编码创建动态 API。开发周期非常快,文件结构干净实用。设置包括开箱即用的配置 eslint、prettier、mocha 和 docker 的选项。许多公司正在广泛使用 LoopBack。

 

 

 使用 LoopBack 4 创建一个 REST API 应用。使用日志:

写道
# 查看安装的软件包是否有 loopback
$ npm list -g --depth=0
/usr/local/lib
├── @popperjs/core@2.11.5
├── async@3.2.0
├── bcrypt@5.0.0
├── body-parser@1.19.0
├── bootstrap@5.1.3
├── express-generator@4.16.1
├── express-session@1.17.0
├── gulp-cli@2.3.0
├── hexo-cli@4.2.0
├── http-server@0.12.3
├── jade@1.11.0
├── jquery@3.6.0
├── jsdom@16.2.2
├── n@6.5.1
├── nodemon@2.0.3
├── npm@6.14.5
├── openapi-types@11.0.1
├── province-city-china@6.0.3
├── pug@2.0.4
├── sails@1.5.2
├── sass@1.26.10
└── uuid@7.0.3

# 安装 loopback 4
$ npm install -g @loopback/cli
+ @loopback/cli@4.0.0
added 68 packages from 22 contributors, removed 47 packages, updated 139 packages and moved 2 packages in 155.869s


# 对 node 升级一下
$ npm install -g n
/usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n
+ n@8.2.0
updated 1 package in 2.268s
$ sudo n stable
Password:
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to nodejs.org:443

Error: failed to download version index (https://nodejs.org/dist/index.tab)

#断开 VPN 再试一次
$ sudo n stable
installing : node-v16.15.0
mkdir : /usr/local/n/versions/node/16.15.0
fetch : https://nodejs.org/dist/v16.15.0/node-v16.15.0-darwin-x64.tar.xz
copying : node/16.15.0
installed : v16.15.0 (with npm 8.5.5)


# 创建一个 chaos 的应用
$ lb4 app
? Project name: chaos
? Project description: A chaos API made with LoopBack 4.
? Project root directory: (chaos)
? Application class name: (chaos)
? Select features to enable in the project:
❯◉ Enable eslint: add a linter with pre-configured lint rules
◉ Enable prettier: install prettier to format code conforming to rules
◉ Enable mocha: install mocha to run tests
◉ Enable loopbackBuild: use @loopback/build helpers (e.g. lb-eslint)
◉ Enable vscode: add VSCode config files
◉ Enable docker: include Dockerfile and .dockerignore
◉ Enable repositories: include repository imports and RepositoryMixin
◉ Enable services: include service-proxy imports and ServiceMixin
Application chaoswas created in chaos.

# 文件结构
src/
__tests__/
acceptance/
home-page.acceptance.ts
ping.controller.acceptance.ts
test-helper.ts
README.md
controllers/
index.ts
ping.controller.ts
README.md
datasources/
README.md
models/
README.md
repositories/
README.md
application.ts
index.ts
migrate.ts
sequence.ts
public/
index.html
node_modules/
***
LICENSE
README.md
DEVELOPING.md
index.js
index.ts
package.json
tsconfig.json
tsconfig.tsbuildinfo

 

 搭建 LoopBack 4 应用程序的过程分为:

 

  • 创建应用模型
  • 定义存储数据的数据源
  • 添加存储库以绑定模型和数据源
  • 添加控制器以公开 REST API
  • chaos 应用概述

 

 接下来我们来搭建 LoopBack 4 应用程序。

 

 


1)创建 chaos 应用模型。

 模型描述业务领域对象并定义具有名称、类型和其他约束的属性列表。模型既用作数据传输对象 (DTO),用于表示请求中传入的实例,也用作与 loopback-datasource-juggler 一起使用的数据结构。

 

 按照 CLI 提示进行操作。

写道
$ lb4 model
? Model class name: chaos
? Please select the model base class: Entity (A persisted model with an ID)
? Allow additional (free-form) properties? No

Let's add a property to chaos
Enter an empty property name when done

? Enter the property name: id
? Property type: number
? Is id the ID property? Yes
? Is it required?: No
? Is id generated automatically? Yes
? Default value [leave blank for none]:

Let's add another property to chaos
Enter an empty property name when done

? Enter the property name: title
? Property type: string
? Is it required?: Yes
? Default value [leave blank for none]:

Let's add another property to chaos
Enter an empty property name when done

? Enter the property name: desc
? Property type: string
? Is it required?: No
? Default value [leave blank for none]:

Let's add another property to chaos
Enter an empty property name when done

? Enter the property name: isComplete
? Property type: boolean
? Is it required?: No
? Default value [leave blank for none]:

Let's add another property to chaos
Enter an empty property name when done

? Enter the property name:

create src/models/chaos.model.ts
update src/models/index.ts

Model chaos was created in src/models/

 

 

2)添加数据源。

 

 LoopBack 使用数据源连接到各种数据,例如数据库、API、消息队列等。

 

 LoopBack 4 中的数据源是连接器实例的命名配置,它表示外部系统中的数据。 legacy-juggler-bridge 使用该连接器来启动 LoopBack 4 存储库以进行数据操作。

 

 有关 LoopBack 中数据源的更多信息,请参阅数据源

 

 在项目文件夹中,运行 lb4 datasource 命令以创建数据源。为简单起见,我们使用内存数据库,将数据保存在本地文件系统中。

 

写道
$ lb4 datasource
? Datasource name: db
? Select the connector for db: In-memory db (supported by StrongLoop)
? window.localStorage key to use for persistence (browser only):
? Full path to file for persistence (server only): ./data/db.json

create src/datasources/db.datasource.json
create src/datasources/db.datasource.ts
update src/datasources/index.ts

Datasource db was created in src/datasources/

 

 数据源 db 在 src/datasources/ 中创建。

 

由于我们已指定文件 ./data/db.json 来保存内存中连接器的数据,让我们从项目的根目录创建目录和文件,并使用你喜欢的编辑器(例如 vim)添加如下所示的值.

 

写道
$ mkdir data
$ touch data/db.json

 

在 data/db.json 文件中,复制并粘贴下面的 JSON 为你的模型提供一些数据:

 

写道
{
"models": {
"Chaos": {
"1": "{\"title\":\"Take over the galaxy\",\"desc\":\"MWAHAHAHAHAHAHAHAHAHAHAHAHAMWAHAHAHAHAHAHAHAHAHAHAHAHA\",\"id\":1}",
"2": "{\"title\":\"destroy alderaan\",\"desc\":\"Make sure there are no survivors left!\",\"id\":2}",
"3": "{\"title\":\"play space invaders\",\"desc\":\"Become the very best!\",\"id\":3}",
"4": "{\"title\":\"crush rebel scum\",\"desc\":\"Every.Last.One.\",\"id\":4}"
}
}
}

 

 现在你已经添加了数据源,让我们继续为数据源添加存储库。

 

 

3)添加存储库。

 

存储库表示一个专门的服务接口,它针对底层数据库或服务提供域模型的强类型数据访问(例如,CRUD)操作。

 

在项目文件夹中,运行 lb4 repository 命令以使用上一步中的 db 数据源为你的模型创建一个存储库。 db 数据源通过其类名 DbDataSource 从可用数据源列表中显示。

 

写道
$ lb4 repository
? Please select the datasource DbDatasource
? Select the model(s) you want to generate a repository chaos
? Please select the repository base class DefaultCrudRepository (Legacy juggler bridge)
create src/repositories/chaos.repository.ts
update src/repositories/index.ts

 

 存储库 ChaosRepository 创建于 src/repositories/。

 

 src/repositories/index.ts 文件使导出工件成为中心,也更容易导入。

 

 新创建的 chaos.repository.ts 类具有为我们的模型执行 CRUD 操作所需的必要连接。

 

 它利用模型定义和 “db” 数据源配置,并使用依赖注入检索数据源。

 

 接下来,我们需要构建一个控制器来处理我们的传入请求。

 

 

4)添加控制器。

 

在 LoopBack 4 中,控制器处理 API 的请求-响应生命周期。

 

控制器上的每个功能都可以单独处理以处理传入请求(如对 /chaos 的 POST 请求),执行业务逻辑并返回响应。在这方面,控制器是你的大部分业务逻辑所在的区域!

 

你可以使用 CLI 创建 REST 控制器,如下所示:

 

写道
$ lb4 controller
? Controller class name: chaos
Controller Chaos will be created in src/controllers/chaos.controller.ts

? What kind of controller would you like to generate? REST Controller with CRUD functions
? What is the name of the model to use with this CRUD repository? Chaos
? What is the name of your CRUD repository? ChaosRepository
? What is the name of ID property? id
? What is the type of your ID? number
? Is the id omitted when creating a new instance? Yes
? What is the base HTTP path name of the CRUD operations? /chaos
create src/controllers/chaos.controller.ts
update src/controllers/index.ts

Controller Chaos was created in src/controllers/

 

 控制器 chaos 是在 src/controllers/ 中创建的。

 

 应用程序已准备好运行。

 

 在此之前,让我们回顾一下位于 src/controllers/chaos.controller.ts 中的 ChaosController 中的代码。此示例使用两个新装饰器为 LoopBack 提供有关传入请求正文的路由、动词和格式的元数据:

 

@post('/chaos') 为 @loopback/rest 创建元数据,以便在路径和动词匹配时将请求重定向到此函数。

@requestBody() 将 Chaos 的 OpenAPI 模式与请求正文相关联,以便 LoopBack 可以验证传入请求的格式。

 

我们还添加了自己的验证逻辑,以确保如果用户未能在其 POST 请求中提供标题属性,他们将收到错误消息。

 

现在我们已经连接了控制器,最后一步是将其全部绑定到应用程序中!

 

 

5)把它们放在一起。

 

让我们试试我们的应用程序吧! 首先,你需要启动应用程序。

 

写道
$ npm start
Server is running at http://127.0.0.1:3000
Try http://127.0.0.1:3000/ping

 

接下来,你可以使用 API Explorer 浏览你的 API 并发出请求!以下是你可以尝试的一些请求:

 

 

POST /chaos 正文为 { "title": "buy milk" }。使用从 POST 收到的 ID 获取 /chaos/{id},并查看是否找回了 Chaos 对象。

PATCH /chaos/{id} 使用相同的 ID,正文为 { "desc": "need milk for grain" }。

GET /chaos/{id} 使用前面步骤中的 ID 查看更改是否已保留。

 

就是这样! 你刚刚创建了一个 LoopBack 4 应用程序。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics