<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>多租户 on 冯威的博客</title><link>https://fwhyy.com/tags/%E5%A4%9A%E7%A7%9F%E6%88%B7/</link><description>Recent content in 多租户 on 冯威的博客</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Mon, 17 May 2021 08:05:00 +0800</lastBuildDate><atom:link href="https://fwhyy.com/tags/%E5%A4%9A%E7%A7%9F%E6%88%B7/atom.xml" rel="self" type="application/rss+xml"/><item><title>实现多租户系统的一点思考</title><link>https://fwhyy.com/2021/05/thoughts-on-realizing-multi-tenant-system/</link><pubDate>Mon, 17 May 2021 08:05:00 +0800</pubDate><guid>https://fwhyy.com/2021/05/thoughts-on-realizing-multi-tenant-system/</guid><description>&lt;p&gt;2020年突发的新冠疫情，让在线协同办公在疫情期间成为了刚需。我们也从 2020 年的 2月3 日开始在家远程办公，直到四月份。协同办公软件一下子火爆了起来，钉钉、企业微信、特别是腾讯会议等都在疫情期间表现突出，呈现出井喷式的发展。&lt;/p&gt;
&lt;p&gt;目前大部分的企业信息化都是私有化部署，局限于企业的内部网络，无法实现远程协同办公，所以越来越多的 To B 企业逐步转向 SaaS（Software-as-a-Service，软件即服务），SaaS 最早是美国Salesforce公司（1999年创立）创造的新软件服务模式。这家公司的市值在 2019 年已经超过1000亿美元，国内现在还处在发展中阶段，前景还是十分广阔的。&lt;/p&gt;
&lt;p&gt;要将传统的私有化部署的软件重构成支持 SaaS 模式，多租户是一个迈不过去的坎，首先需要将系统改造成多租户模式，然后再逐步实现计费、系统监控、用户行为分析等功能。&lt;/p&gt;
&lt;p&gt;我觉得多租户的设计应该分为三个层面来进行讨论，应用、数据库和中间件。&lt;/p&gt;
&lt;h2 id="应用"&gt;应用&lt;/h2&gt;
&lt;p&gt;现在的项目或产品开发几乎都是前后端分离的开发模式，应用层主要指的是 WebAPI ，WebAPI 的改造有两种方式：&lt;/p&gt;
&lt;p&gt;1、每个租户部署一套 WebAPI、上层通过域名或 Url 地址的解析进行路由，当有新租户注册的时候就动态进行对应的 WebAPI 的部署，这种方式改造成本低，但运维成本高，不建议使用，如果时间紧，可以当过度阶段的临时方案。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202202020736143.webp" alt="iShot2022-02-02 07.35.55" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;2、所有的租户共用一套 WebAPI ，在 WebAPI 中需要获取到租户信息（域名、Url参数、请求头信息、Cookie 等），然后进行租户信息配置的切换。有新租户创建的时候无需进行新的 WebAPI 的创建，只需要初始化租户基本信息即可。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2022/202202020736943.webp" alt="iShot2022-02-02 07.36.31" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;在这种方式下，如果 Cluster1 的负载超过限度了，也要能够进行动态切换，将其中的某些租户切换到其他的 Cluester 中，如上图。&lt;/p&gt;
&lt;p&gt;在 WebAPI 的代码实现上，可以参考 Abp 框架中多租户的实现，这里给出一个简化版本：&lt;/p&gt;
&lt;p&gt;TenantConfiguration：租户配置信息&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[Serializable]
public class TenantConfiguration
{
 public Guid Id { get; set; }

 public string Code { get; set; }

 public string Name { get; set; }

 public TenantStatus TenantStatus { get; set; }

 public string DBConfig { get; set; }

 public string CacheConfig { get; set; }

 public string MQConfig { get; set; }

 public string MongoConfig { get; set; }

 public TenantConfiguration()
 {
 TenantStatus = TenantStatus.Enable;
 }

 public TenantConfiguration(Guid id, string name)
 : this()
 {
 
 Id = id;
 Name = name;
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;TenantStore：从缓存或数据库中获取租户配置信息&lt;/p&gt;</description></item></channel></rss>