如何做网站授权,分析网络营销方式,现代化专业群建设专题网站护理专业,wordpress移动端代码2020年突发的新冠疫情#xff0c;让在线协同办公在疫情期间成为了刚需。我们也从 2020 年的 2月3 日开始在家远程办公#xff0c;直到四月份。协同办公软件一下子火爆了起来#xff0c;钉钉、企业微信、特别是腾讯会议等都在疫情期间表现突出#xff0c;呈现出井喷式的发展… 2020年突发的新冠疫情让在线协同办公在疫情期间成为了刚需。我们也从 2020 年的 2月3 日开始在家远程办公直到四月份。协同办公软件一下子火爆了起来钉钉、企业微信、特别是腾讯会议等都在疫情期间表现突出呈现出井喷式的发展。目前大部分的企业信息化都是私有化部署局限于企业的内部网络无法实现远程协同办公所以越来越多的 To B 企业逐步转向 SaaSSoftware-as-a-Service软件即服务SaaS 最早是美国Salesforce公司1999年创立创造的新软件服务模式。这家公司的市值在 2019 年已经超过1000亿美元国内现在还处在发展中阶段前景还是十分广阔的。要将传统的私有化部署的软件重构成支持 SaaS 模式多租户是一个迈不过去的坎首先需要将系统改造成多租户模式然后再逐步实现计费、系统监控、用户行为分析等功能。我觉得多租户的设计应该分为三个层面来进行讨论应用、数据库和中间件。应用现在的项目或产品开发几乎都是前后端分离的开发模式应用层主要指的是 WebAPI WebAPI 的改造有两种方式1、每个租户部署一套 WebAPI、上层通过域名或 Url 地址的解析进行路由当有新租户注册的时候就动态进行对应的 WebAPI 的部署这种方式改造成本低但运维成本高不建议使用如果时间紧可以当过度阶段的临时方案。2、所有的租户共用一套 WebAPI 在 WebAPI 中需要获取到租户信息域名、Url参数、请求头信息、Cookie 等然后进行租户信息配置的切换。有新租户创建的时候无需进行新的 WebAPI 的创建只需要初始化租户基本信息即可。在这种方式下如果 Cluster1 的负载超过限度了也要能够进行动态切换将其中的某些租户切换到其他的 Cluester 中如上图。在 WebAPI 的代码实现上可以参考 Abp 框架中多租户的实现这里给出一个简化版本TenantConfiguration租户配置信息[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;}
}
TenantStore从缓存或数据库中获取租户配置信息public interface ITenantStore
{TenantConfiguration Find(string code);
}
public class TenantStore : ITenantStore
{public TenantConfiguration Find(string code){//从缓存或数据库进行租户配置信息获取throw new NotImplementedException();}
}
CurrentTenant当前租户类用来存储当前租户信息以及切换租户public interface ICurrentTenant
{TenantConfiguration Config { get;}IDisposable Change(string code);
}
/// summary
/// 当前租户
/// /summary
public class CurrentTenant:ICurrentTenant
{public ITenantStore _tenantStore;public CurrentTenant(ITenantStore tenantStore){_tenantStore tenantStore;}public TenantConfiguration _config;public TenantConfiguration Config _config;/// summary/// 切换租户/// /summary/// param namecode/param/// returns/returnspublic IDisposable Change(string code){TenantConfiguration tenantConfig _tenantStore.Find(code);if (tenantConfig null){throw new Exception(Tenant not found);}if (tenantConfig.TenantStatus ! TenantStatus.Enable){throw new Exception(Tenant is disabled or deleted);}return new DisposeAction(() {_config tenantConfig;});}
}
UrlTenantResolve根据 Url 参数进行租户解析public interface ITenantResolve
{string Resolve(HttpContext httpContext);
}
/// summary
///
/// /summary
public class UrlTenantResolve:ITenantResolve
{public string Resolve(HttpContext httpContext){return httpContext.Request.QueryString.HasValue? httpContext.Request.Query[__tenant].ToString(): null;}
}
MultiTenancyMiddleware租户中间件关于在 dotNET Core 中自定义中间件可以参考《dotNET Core 3.X 请求处理管道和中间件的理解》public class MultiTenancyMiddleware: IMiddleware
{protected readonly ITenantResolve _tenantResolve;private readonly ICurrentTenant _currentTenant;public MultiTenancyMiddleware(ITenantResolve tenantResolve,ICurrentTenant currentTenant){_tenantResolve tenantResolve;_currentTenant currentTenant;}public async Task InvokeAsync(HttpContext context, RequestDelegate next){var tenantCode _tenantResolve.Resolve(context);if (tenantCode ! _currentTenant.Config.Code){using (_currentTenant.Change(tenantCode)){await next(context);}}else{await next(context);}await next(context);}
}
数据库数据库在这里指的是关系型数据库用来存储业务数据实现多租户就要对数据进行隔离通常的数据隔离方式有三种模式1、完全隔离每个租户使用独立数据库2、部分共享租户共享一个数据库以 schema 或者 table 区分3、完全共享租户共享相同的数据库表以 tenant_id 进行区分推荐使用第一种或第二种隔离程度比较高也比较容易做横向扩展如果是第三种需要处理数据的隔离问题需要处理单表大数据的问题等对技术要求比较高。中间件除了数据库一个系统还需要依赖其他的一些中间件比如缓存、消息队列、文件存储缓存Redi消息队列RabbitMQ文件存储MongoDB 的 GridFSRedis1、Redis 中使用数据库的方式进行租户隔离2、Redis 可以通过修改配置文件的方式进行数据库的扩展默认为 16 个3、通过 Redis 分片集群的方式进行部署可以进行横向扩展3、在 Redis 集群中官方推荐节点数量不超过 1000 个这个对于多租户系统的前期来说应该是够用了如果到了租户数量的爆发期再进行架构的扩展比如不同的租户路由到不同的 Redis 集群中。RabbitMQ在 Rabbitmq 有 vhost 机制可以一个租户创建一个vhost通过 vhost 来进行租户的隔离目前还没查询到 vhost 是否有上限需要做进一步验证。MongoDBMongoDB 中主要使用 GridFS 来进行非结构化数据的存储通过创建数据库的方式来进行租户的隔离而且 MongoDB 支持分片的集群部署方式可以进行扩展横扩展在前期一个 MongoDB 集群应该就够用了。最后技术方案和架构没有最好的只有最适合的符合当下的业务场景、团队的技术能力就可以然后要做的就是做 MVP 最小可行性产品进而进行系统的改造。希望本文对您有所帮助