使用 Hapi 和 Sequelize 进行多租户数据库架构

阅读时长 8 分钟读完

前言

当我们开发多租户应用程序时,需要在数据库层面考虑如何才能管理多个租户的数据。在传统的单租户应用程序中,我们可以通过在应用程序中设置不同的权限来区分不同的用户。但如果是多租户应用程序,我们需要将这个概念扩展到数据库中。

在这篇文章中,我将介绍如何使用 Hapi 和 Sequelize 这两个强大的工具来构建一个多租户数据库架构。

什么是多租户?

首先,让我们来了解一下什么是多租户。多租户是一种云计算架构模式,它允许多个客户(或租户)共享相同的基础设施和应用程序。这个模式最常见的例子就是企业软件,它们可以支持不同的客户,这些客户之间的数据是彼此隔离的。

一种常见的多租户应用程序是 Software-as-a-Service(SaaS),它被广泛应用于许多业务领域,如CRM、ERP、HRM等。在这些应用程序中,每个客户都有自己的数据库,但是它们运行在相同的应用程序架构之上。因此,多租户应用程序需要一个可靠的数据库架构,以保证不同客户之间的数据隔离和安全。

多租户数据库架构

在多租户应用程序中,每个客户都有自己的数据库。数据隔离是必须要考虑的一个因素。一种常见的做法是为每个客户创建一个专用的数据库实例,但这种方法会让数据库管理变得非常复杂和困难。因此,我们可以使用单个数据库,但为每个客户创建不同的模式(schema),以达到相同的目的。在这种模式下,不同客户的数据是相互隔离的,但它们共享相同的数据库实例。

Hapi 框架

Hapi 是一个构建 API 应用程序的现代化 Node.js 框架。它的定位是可靠、可扩展、易于维护。在本文中,我们将使用 Hapi 构建多租户应用程序,并使用其插件系统来提高我们的效率。

Sequelize ORM

对于数据库访问,我们将使用 Sequelize 这个 Node.js 中常用的 ORM。它提供了一种从 Node.js 应用程序中操作各种 SQL 和 NoSQL 数据库系统的方式。Sequelize 对表查询、事务和关系建立等方面做了大量抽象和封装,使得我们可以更加专注于业务逻辑的实现。

安装依赖

安装 Hapi 和 Sequelize 及其驱动程序(mysql2 或者 pg),以及 Hapi 的 Joi 验证插件。

安装完成后,在我们的应用程序中使用它们:

租户模型

我们的第一个任务是创建一个租户模型,它将用于管理每个客户的数据库层面的数据。在 Sequelize 中,我们可以使用 define 函数来定义模型。每个客户都有自己的数据库模式,因此我们的模型将告诉 Sequelize 使用哪个模式来查询客户的数据。

我们的 Tenant 模型只有一个字段 name,它将存储每个客户的名称。我们还需要在数据库中创建相应的表,以便该模型可以进行 CRUD 操作。我们可以使用 Sequelize 提供的 sync 函数来创建表:

数据库簇

为我们的多租户应用程序创建数据库簇,将为每个租户创建一个单独的模式。数据库簇的名称需要与我们的租户名称相对应。在我们的代码中,我们将使用 Hapi 插件 Systemic 的服务定位功能。这将允许我们轻松地在代码中访问数据库集群。

-- -------------------- ---- -------
----- - ------------------ - - --------------------

---------------- - ----- -------- -------- -------- -

  -- ----
  ------------------------ - --------------------
    ----- -----------------
    -------- --------
    ----- - ------------------ --
    ------ ----- -------- ---- -
      ------ -
        --------------- ------------ -- -
          ----- --------- - -------------
          ----- --------- - -------------
          ----- -------- - -
            -------- -----------------------
            ----- ----------------------
            ----- ----------------------
            --------- --------------------------
            --------- --------------------------
            --------- ----------
          --
          ------ --- --------------------
        -
      --
    -
  ---
--

在这段代码中,我们定义了一个名为 tenant-service 的系统组件。它将使用 database-service 组件来获取对主数据库的访问。我们的服务将提供一个 getDbForTenant 函数,它将返回一个有效的 Sequelize 实例,用于访问给定租户的数据库。

访问租户数据

我们现在有了一个用于管理租户的模型和一个用于访问租户数据的服务。接下来,我们将创建一个新的 Sequelize 模型,它将使用我们的租户服务来访问特定客户的数据库。让我们来看一下这个模型:

-- -------------------- ---- -------
----- -------- - ---------------------------- -
  ----- -----------------
  ---- -----------------
  ------ ----------------
-- -
  ---------- -----------
---

------------- - ----- ------------ -- -
  --- ------------- - -------------------------
  --- -- - -----------------------------------------
  ----- ------------------
  ----- --------------- ------ ---- ---
  ------ ---------
--

在这个模型中,我们使用 Sequelize 的 define 函数定义了一个新的客户模型,它将使用我们的租户服务中的数据库配置来访问数据。我们在模型的 init 函数中初始化数据库连接,并使用 sync 方法来确保 customers 表在数据库中存在。此外,我们还传入了 force: true 选项,以避免模型和数据库之间的模式不匹配问题。

路由和控制器

好了,现在我们已经创建了一个能够访问租户数据的模型,我们需要创建一些路由和相应的控制器来处理它们。让我们来创建一个简单的 /customers 路由,它将返回每个租户的客户列表:

-- -------------------- ---- -------
--------------
  ------- ------
  ----- -------------
  -------- ----- -------- --------- -- -

    --- ------------- - ---------------------------------
    --- ------- - ----- -----------------

    --- --------- - ---
    --- ---- ------ -- -------- -
      --- -------- - ----- ---------------------------
      --- ------- - ----- -------------------
      ---------------------------
    -

    ------ ----------
  -
---

在这里,我们使用了 Hapi 框架提供的路由机制。我们的路由处理程序将使用 Tenant 模型来获取每个租户的名称,并使用我们的 Customer 模型从每个租户的数据库中获取客户列表。

结论

在本文中,我介绍了如何使用 Hapi 和 Sequelize 来构建一个多租户数据库架构。我们创建了一个租户模型,一个服务用于创建数据库簇,以及一个客户数据模型,它使用服务来访问特定客户的数据。

我们还创建了一个简单的路由和控制器,以演示如何访问租户的数据库中的数据。这些技术可以用于开发任何类型的多租户应用程序,无论是 SaaS 应用程序还是其他类型的企业软件。

希望这篇文章对你有所帮助。如果你有任何问题或反馈,请随时告诉我。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66f36edfe1e8e99bfaf6fb9f

纠错
反馈