Mendix多租户技术实践 - Part II
简介
实现多租户的方法是很多的,在本篇是在mendix中实现多租户应用的一种方式 使用Deep line module (由mendix提供的模块官方文档Link :https://docs.mendix.com/appstore/modules/deep-link)。博主认为这是一种简单直接的方式在mendix 中实现多租户场景。
Deep link module的设置
这里需要调用一个Microflow - DeepLink.CreateDeeplinkConfig通过传递需要的参数根据你的开发时期或运行时期的现实需求。ObjectAsParameter应该设置为true,这样为了传递Tenant租户的Name 示例:
- http://localhost:8008/link/rendertenant/tenant_one
- http://localhost:8008/link/rendertenant/tenant_two
重点提示:参数Parameter的Name应该是小写,并且它应该与接下来作为传递参数的微流名称保持相同。 微流创建的 deeplink示例: http://localhost:8008/link/rendertenant/
创建Tenant Entity
tenant_one和tenant_two是Tenant Entity中 Tenant Name的值。 当用户在 Web 浏览器中点击上述任何 URL 链接时,将触发自定义微流 MultiTenancy.RenderTenant。 这完全是在Deep link模块的帮助下完成的。
Mendix多租户示例
这里用一个用例来实现和展示构建的 Mendix 应用程序的多租户机制。 该应用程序将充当企业管理门户,管理员可以在其中根据需要创建租户tenants,并且管理员Admin可以创建 各自的记录将与各自的租户相关联,并且它们也会将一些数据存储到租户数据库中。 因此,创建的应用程序将与自带的数据库一起用作接口,用于轻型数据库事务,以便保存租户基本信息以进行客户端验证。 例如,我们可能需要限制 Admin 以避免冗余,防止将要创建的数据库已经存在。
下图是创建租户的微流
创建database schema后,Admin管理员可以生成DeepLink并在特定业务单元的用户之间共享。 下图为Deeplink 配置 Render Tenant 用户将使用管理员共享的 url 登录门户进行一些数据库操作。 Entity TargetDB用来控制主数据库连接( database connection )信息比如 Host, port, database, username 和password。 Entity NewSchema 就像传统开发中的POJO对象只用了捕获来自于接口Interface的租户tenant名称,在开始创建租户tenant前
Tenant租户是多租户实现中真正需要的main entity。 除了persistable Entities ,图中还有Non-persistable。这些Non-persistable Entities 将帮助获取保留来自外部数据库的租户的基础数据,最终将这些数据传递到Interface(接口)中。 Entity: Authority Institution和Address都设置为non -persistable。并且在开发中可以根据需求进行自定义。
重点:实体之间的关系是非常重要的可以参考图中的关联关系,可根据自己业务中需求做自定义修改。 在上图中展示的URL格式: http://localhost:8008/p/[GUID] 来自于 http://localhost:8008/link/rendertenant/[TenantName]. 通过创建Authority权限和创建Institution机构选项,用户可以将他们的数据发布到基于tenant租户的外部数据源,在这个用例中,使用PostgreSQL和PgAdmin作为Client-GUI。 最重要的是写SQL Queries(查询)。 但是要实现多租户的这种中层数据隔离,我们应该遵循这种方法。 所以 Mendix 的业务工程师应该对 SQL 有一定的了解,才能深入挖掘实现。 但是要编写 DDL 查询,必须具备强大的 SQL 知识。 例如,这就是我们如何形成 SQL 查询的方式,没有太多知识的人可以使用 pgadmin 来检查正确的 SQL 查询的正确语法。 在Mendix Studio Pro中创建SQL语句查询变量。 PgAdmin -客户端的GUI 我们可以交叉检查不同租户数据库中的数据。 同样,如果需要,我们可以在应用中对相应的数据库交叉检查数据。 到此,我们终于可以在界面中看到一些基于租户的数据了。 Tenant-1 details page with data Tenant-2 details page with data