精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我對實現多租戶系統的一點思考

開發 項目管理
目前大部分的企業信息化都是私有化部署,局限于企業的內部網絡,無法實現遠程協同辦公,所以越來越多的 To B 企業逐步轉向 SaaS(Software-as-a-Service,軟件即服務),SaaS 最早是美國Salesforce公司(1999年創立)創造的新軟件服務模式。

[[399862]]

本文轉載自微信公眾號「不止dotNET」,作者不止dotNET。轉載本文請聯系不止dotNET公眾號。

2020年突發的新冠疫情,讓在線協同辦公在疫情期間成為了剛需。我們也從 2020 年的 2月3 日開始在家遠程辦公,直到四月份。協同辦公軟件一下子火爆了起來,釘釘、企業微信、特別是騰訊會議等都在疫情期間表現突出,呈現出井噴式的發展。

目前大部分的企業信息化都是私有化部署,局限于企業的內部網絡,無法實現遠程協同辦公,所以越來越多的 To B 企業逐步轉向 SaaS(Software-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:租戶配置信息

  1. [Serializable
  2. public class TenantConfiguration 
  3.     public Guid Id { get; set; } 
  4.  
  5.     public string Code { get; set; } 
  6.  
  7.     public string Name { get; set; } 
  8.  
  9.     public TenantStatus TenantStatus { get; set; } 
  10.  
  11.     public string DBConfig { get; set; } 
  12.  
  13.     public string CacheConfig { get; set; } 
  14.  
  15.     public string MQConfig { get; set; } 
  16.  
  17.     public string MongoConfig { get; set; } 
  18.  
  19.     public TenantConfiguration() 
  20.     { 
  21.         TenantStatus = TenantStatus.Enable; 
  22.     } 
  23.  
  24.     public TenantConfiguration(Guid id, string name
  25.         : this() 
  26.     { 
  27.         
  28.         Id = id; 
  29.         Name = name
  30.     } 

TenantStore:從緩存或數據庫中獲取租戶配置信息

  1. public interface ITenantStore 
  2.     TenantConfiguration Find(string code); 
  3. public class TenantStore : ITenantStore 
  4.     public TenantConfiguration Find(string code) 
  5.     { 
  6.         //從緩存或數據庫進行租戶配置信息獲取 
  7.         throw new NotImplementedException(); 
  8.     } 

CurrentTenant:當前租戶類,用來存儲當前租戶信息,以及切換租戶

  1. public interface ICurrentTenant 
  2.  
  3.     TenantConfiguration Config { get;} 
  4.     IDisposable Change(string code); 
  5. /// <summary> 
  6. /// 當前租戶 
  7. /// </summary> 
  8. public class CurrentTenant:ICurrentTenant 
  9.     public ITenantStore _tenantStore; 
  10.     public CurrentTenant(ITenantStore tenantStore) 
  11.     { 
  12.         _tenantStore = tenantStore; 
  13.     } 
  14.  
  15.     public TenantConfiguration _config; 
  16.     public TenantConfiguration Config => _config; 
  17.  
  18.     /// <summary> 
  19.     /// 切換租戶 
  20.     /// </summary> 
  21.     /// <param name="code"></param> 
  22.     /// <returns></returns
  23.     public IDisposable Change(string code) 
  24.     { 
  25.         TenantConfiguration tenantConfig= _tenantStore.Find(code); 
  26.         if (tenantConfig == null
  27.         { 
  28.             throw new Exception("Tenant not found"); 
  29.         } 
  30.  
  31.         if (tenantConfig.TenantStatus != TenantStatus.Enable) 
  32.         { 
  33.             throw new Exception("Tenant is disabled or deleted"); 
  34.         } 
  35.  
  36.         return new DisposeAction(() => 
  37.         { 
  38.             _config = tenantConfig; 
  39.         }); 
  40.     } 

UrlTenantResolve:根據 Url 參數進行租戶解析

  1. public interface ITenantResolve 
  2.     string Resolve(HttpContext httpContext); 
  3. /// <summary> 
  4. ///  
  5. /// </summary> 
  6. public class UrlTenantResolve:ITenantResolve 
  7.  
  8.     public string Resolve(HttpContext httpContext) 
  9.     { 
  10.         return httpContext.Request.QueryString.HasValue 
  11.            ? httpContext.Request.Query["__tenant"].ToString() 
  12.            : null
  13.     } 

MultiTenancyMiddleware:租戶中間件,關于在 dotNET Core 中自定義中間件可以參考《dotNET Core 3.X 請求處理管道和中間件的理解》

  1. public class MultiTenancyMiddleware: IMiddleware 
  2.     protected readonly ITenantResolve _tenantResolve; 
  3.     private readonly ICurrentTenant _currentTenant; 
  4.  
  5.     public MultiTenancyMiddleware( 
  6.        ITenantResolve tenantResolve, 
  7.        ICurrentTenant currentTenant) 
  8.     { 
  9.         _tenantResolve = tenantResolve; 
  10.         _currentTenant = currentTenant; 
  11.     } 
  12.  
  13.     public async Task InvokeAsync(HttpContext context, RequestDelegate next
  14.     { 
  15.         var tenantCode = _tenantResolve.Resolve(context); 
  16.  
  17.         if (tenantCode != _currentTenant.Config.Code) 
  18.         { 
  19.             using (_currentTenant.Change(tenantCode)) 
  20.             { 
  21.                 await next(context); 
  22.             } 
  23.         } 
  24.         else 
  25.         { 
  26.             await next(context); 
  27.         } 
  28.  
  29.         await next(context); 
  30.     } 

數據庫

數據庫在這里指的是關系型數據庫,用來存儲業務數據,實現多租戶,就要對數據進行隔離,通常的數據隔離方式有三種模式:

1、完全隔離,每個租戶使用獨立數據庫;

2、部分共享,租戶共享一個數據庫,以 schema 或者 table 區分;

3、完全共享,租戶共享相同的數據庫表,以 tenant_id 進行區分

推薦使用第一種或第二種,隔離程度比較高,也比較容易做橫向擴展,如果是第三種,需要處理數據的隔離問題,需要處理單表大數據的問題等,對技術要求比較高。

中間件

除了數據庫,一個系統還需要依賴其他的一些中間件,比如緩存、消息隊列、文件存儲:

  • 緩存:Redi
  • 消息隊列:RabbitMQ
  • 文件存儲:MongoDB 的 GridFS

Redis

1、Redis 中使用數據庫的方式進行租戶隔離;

2、Redis 可以通過修改配置文件的方式進行數據庫的擴展,默認為 16 個;3、通過 Redis 分片集群的方式進行部署,可以進行橫向擴展;3、在 Redis 集群中,官方推薦節點數量不超過 1000 個,這個對于多租戶系統的前期來說應該是夠用了,如果到了租戶數量的爆發期,再進行架構的擴展,比如,不同的租戶路由到不同的 Redis 集群中。

RabbitMQ

在 Rabbitmq 有 vhost 機制,可以一個租戶創建一個vhost,通過 vhost 來進行租戶的隔離,目前還沒查詢到 vhost 是否有上限,需要做進一步驗證。

MongoDB

MongoDB 中主要使用 GridFS 來進行非結構化數據的存儲,通過創建數據庫的方式來進行租戶的隔離,而且 MongoDB 支持分片的集群部署方式,可以進行擴展橫擴展,在前期,一個 MongoDB 集群應該就夠用了。

最后

技術方案和架構沒有最好的,只有最適合的,符合當下的業務場景、團隊的技術能力就可以,然后要做的就是做 MVP (最小可行性產品),進而進行系統的改造。

希望本文對您有所幫助!

 

責任編輯:武曉燕 來源: 不止dotNET
相關推薦

2014-09-17 10:30:25

代碼

2011-07-04 09:33:04

惠普轉型李艾科

2014-09-23 11:21:05

代碼命名程序員架構設計

2022-07-13 08:45:29

云原生容器網絡

2011-12-23 09:16:19

2013-05-14 12:06:26

.Net系統架構架構設計

2013-05-13 11:25:44

系統架構

2013-03-06 10:19:56

重構架構設計

2019-03-22 14:38:03

容器安全隔離

2011-07-18 16:33:20

sqlite

2013-06-26 10:13:32

C語言結構體結構體偏移

2022-04-06 07:14:29

區塊鏈網絡生態系統

2014-07-24 13:32:01

Google NowSiri

2025-05-14 03:00:00

2014-11-25 11:52:15

.NET

2015-03-26 09:23:17

天璣科技融合架構

2021-05-20 09:11:00

5G5G網絡5G終端

2023-04-11 14:42:14

2023-06-07 13:50:00

SaaS多租戶系統

2015-11-02 09:43:25

ASP.NET異步編程
點贊
收藏

51CTO技術棧公眾號

一区二区三区国产好| 国产成人午夜| 蜜臀av性久久久久蜜臀aⅴ | 亚洲成色www.777999| 日本欧美在线视频免费观看| 国产乱码精品一区二区三区五月婷| 欧美黑人xxxx| 久久av无码精品人妻系列试探| 国产精成人品2018| 一区二区在线观看不卡| 欧美日韩一区二区三区在线观看免| 天天天天天天天干| 欧美日韩影院| 一本色道久久综合亚洲精品小说| 色婷婷一区二区三区在线观看| 2021天堂中文幕一二区在线观| 亚洲国产精品av| 成人动漫在线视频| 中文字幕日韩经典| 国产日韩欧美一区在线| 波霸ol色综合久久| 日本一级片在线播放| 国产精品蜜月aⅴ在线| 亚洲不卡av一区二区三区| 亚洲美女网站18| 少妇激情av一区二区| 国产乱码字幕精品高清av | 免费一级片视频| 国内成人自拍| 亚洲成人黄色网| 亚洲欧美日本一区二区三区| 亚洲精品mv| 亚洲一区二区在线免费观看视频| 视频一区视频二区视频| 人妻一区二区三区四区| 韩国欧美国产1区| 国产精品极品美女粉嫩高清在线| av资源吧首页| 午夜天堂精品久久久久| 日韩一区二区在线视频| 自拍偷拍视频亚洲| 全球av集中精品导航福利| 日韩女优毛片在线| 伊人国产精品视频| 精品成人av| 欧美日韩亚洲精品内裤| 欧美精品久久久久久久久久久| 在线中文免费视频| 亚洲天堂中文字幕| 中文精品视频一区二区在线观看| yourporn在线观看中文站| 91原创在线视频| 国产一区精品视频| 亚洲国产精品suv| 国产黄色成人av| 91精品婷婷国产综合久久蝌蚪| 国产精品呻吟久久| 国产在线国偷精品免费看| 国产在线999| 亚洲一卡二卡在线| 精品一区二区三区在线播放 | 99久久免费精品| 国产尤物91| 视频一区二区三区国产| 久久综合成人精品亚洲另类欧美 | 成人羞羞视频播放网站| 一区二区av在线| 亚洲欧美精品久久| 国产精品毛片久久| 欧美成人一区在线| 久久久久成人网站| 亚洲精品精选| 日韩美女中文字幕| 中文字幕av片| 国产在线不卡一区| 国产精品视频免费一区二区三区| 懂色av一区二区三区四区 | 丝袜美腿中文字幕| 久久爱www成人| 中文字幕欧美视频在线| 久久精品亚洲a| 亚洲国产片色| 午夜伦理精品一区| 91青青草视频| 国产资源精品在线观看| 超碰97人人人人人蜜桃| 视频一区二区免费| 国产三级精品三级在线专区| 一区二区三区视频| 日日夜夜天天综合入口| 精品久久久久久久久久久久| 日本女优爱爱视频| 精品中文在线| 日韩精品高清在线| 亚洲国产精品一区二区久久hs| 欧美精品首页| 日本一区二区三区四区视频| 91精品中文字幕| 波波电影院一区二区三区| 日韩高清av| 午夜伦理大片视频在线观看| 丁香五六月婷婷久久激情| 奇米影视四色在线| 久久精品色综合| 日韩中文字幕在线看| 日韩欧美亚洲国产| 精品在线一区二区| 另类欧美小说| 日韩成人伦理| 欧美在线一二三| 9.1在线观看免费| 日韩欧美一区二区三区在线视频| 欧美激情国内偷拍| 亚洲天堂久久久久| 91在线观看免费视频| 老司机午夜网站| 一呦二呦三呦精品国产| 亚洲白虎美女被爆操| 中文字幕精品亚洲| 国产一区二区你懂的| 91在线色戒在线| 国产美女性感在线观看懂色av| 亚洲一区免费视频| av在线免费看片| av亚洲免费| 欧美洲成人男女午夜视频| 国内精品国产成人国产三级| 欧美国产日韩精品免费观看| 国产免费黄色一级片| 久久99成人| 日韩在线小视频| 天天干天天操天天操| 99精品视频在线观看| 91看片淫黄大片91| 国产91在线播放精品| 亚洲天堂av在线播放| 日本一区二区欧美| 国产精品一区三区| 国产免费色视频| 999国产精品亚洲77777| 国产亚洲精品va在线观看| 日本五十路女优| 国产99久久久国产精品潘金| 先锋影音男人资源| 亚洲成人高清| 日韩在线一区二区三区免费视频| 欧美特级黄色片| 国产日韩欧美电影| 欧美少妇性生活视频| 日日狠狠久久偷偷综合色| 97人人爽人人喊人人模波多| 国产91麻豆视频| 亚洲自拍偷拍九九九| 国产性猛交96| 国产精品v日韩精品v欧美精品网站| 亚洲一区二区久久久久久久| 高潮毛片在线观看| 欧美一区二区三区成人| 放荡的美妇在线播放| 国产精品系列在线观看| 久久福利一区二区| heyzo欧美激情| 国外成人免费在线播放| 熟妇人妻一区二区三区四区| 精品magnet| 亚洲第九十七页| 亚洲欧美日韩国产综合精品二区| 久久精品日产第一区二区三区精品版| 交100部在线观看| 日韩乱码在线视频| 精品久久久久久久久久久久久久久久久久| 久久久久久久网| 亚洲一级片网站| 一区二区日韩欧美| 国产私拍一区| 欧美黑人粗大| 日韩一区二区三区xxxx| 亚洲爱情岛论坛永久| 亚洲成人高清在线| xxxx日本免费| 激情综合网激情| 国产真实老熟女无套内射| 日韩系列在线| 成人黄色片在线| 久久99亚洲网美利坚合众国| 精品视频偷偷看在线观看 | 日韩一区二区中文字幕| 日韩av在线电影| 国产亚洲欧洲997久久综合 | 四虎视频在线精品免费网址| 欧美激情第99页| 电影av一区| 日韩女优毛片在线| 伊人久久久久久久久久久久| 亚洲欧美经典视频| 精品黑人一区二区三区观看时间| 日本 国产 欧美色综合| 亚洲激情免费视频| 九九综合久久| 国产传媒一区二区| 久久精品黄色| 91成人在线播放| 美女羞羞视频在线观看| 亚洲精品www久久久| 国产又粗又猛又爽又黄的视频一| 亚洲一二三专区| 日韩一区二区三区四区视频| 高清成人免费视频| 黄色小视频免费网站| 亚洲欧美成人综合| 中文字幕在线中文| 日韩精品欧美激情一区二区| 国内精品一区二区| 高清久久一区| 国产精品麻豆va在线播放| 国产v日韩v欧美v| 久久国产加勒比精品无码| 成人免费高清在线播放| 亚洲成人中文字幕| 国产91视频在线| 欧美日本精品一区二区三区| 五月婷婷亚洲综合| 亚洲动漫第一页| 91日韩中文字幕| 国产精品久久久久一区| 精品少妇一区二区三区免费观 | 精品视频站长推荐| 国产精品一区二区三区乱码| 69久久久久久| 手机精品视频在线观看| 91专区在线观看| 伊人久久久大香线蕉综合直播 | 亚洲美女黄色| 日韩在线视频在线| 欧美在线网址| 国产又大又长又粗又黄| 久久国产电影| 色综合电影网| 日韩情爱电影在线观看| 日本视频一区在线观看| 美女网站一区| 欧美一区视久久| 欧美激情在线精品一区二区三区| 国外成人免费视频| 激情小说亚洲图片| 久久国产精品 国产精品| 高清日韩中文字幕| 国产福利久久精品| 极品国产人妖chinesets亚洲人妖| 99免费在线视频观看| 亚洲日本视频在线| 国产精品乱子乱xxxx| 国产精品网址| 精品免费日产一区一区三区免费| 成人性生交大片免费看96| 国产一区免费观看| 日韩一级电影| 水蜜桃一区二区| 91综合视频| 日韩中文字幕在线不卡| 国产一区二区三区四区三区四| 欧美中日韩在线| av成人毛片| 日韩视频第二页| 日本欧美一区二区| 极品粉嫩美女露脸啪啪| 国产在线视频精品一区| 波多野结衣三级视频| 99久久精品国产一区| 亚洲一级中文字幕| 国产精品蜜臀在线观看| 全程偷拍露脸中年夫妇| 亚洲成人777| 日韩黄色一级视频| 欧美欧美欧美欧美首页| 亚洲av无码一区二区三区性色| 亚洲第一精品久久忘忧草社区| 日韩欧美亚洲系列| 久久精品视频网站| 丁香花电影在线观看完整版| 欧美在线视频网站| 午夜精品久久久久久毛片| 国产精品久久波多野结衣| 亚州av一区| 波多野结衣激情| 国产精品久久久久毛片大屁完整版 | 欧美91大片| 免费无码不卡视频在线观看| 日韩国产精品久久| 又色又爽又黄18网站| 久久精品一区二区三区不卡| 91麻豆精品成人一区二区| 亚洲成a人v欧美综合天堂下载| 精品久久久久久久久久久久久久久久 | 东方aⅴ免费观看久久av| 国产美女精品久久| 一区二区三区日本| 久久久久久久久久一级| 日韩一区二区免费在线观看| 男人的天堂在线| 欧美极品少妇xxxxⅹ喷水| 99久久伊人| 国产区欧美区日韩区| 久久久久久久久久久久久久久久久久 | 欧美永久精品| 国产精品wwwww| 国产成人在线看| 潮喷失禁大喷水aⅴ无码| 黄色成人av在线| 国产成人精品av在线观| 国产香蕉97碰碰久久人人| 成人一级福利| 91成人免费在线观看| 日本不卡电影| 亚洲中文字幕无码不卡电影| 国产成人在线观看| www深夜成人a√在线| 欧美综合一区二区| 日韩一二三四| 久久久噜久噜久久综合| 国产精品一区二区精品视频观看| 视频三区二区一区| 久久国产高清| 老熟妇精品一区二区三区| 一级日本不卡的影视| 一区二区国产欧美| 在线午夜精品自拍| 午夜无码国产理论在线| 精品国产乱码一区二区三区四区| 欧美激情视频一区二区三区在线播放 | 欧美日韩精品免费| 黄色国产在线| 欧美亚洲激情在线| 噜噜噜狠狠夜夜躁精品仙踪林| 法国空姐在线观看免费| 久久爱www久久做| 国产精品www爽爽爽| 在线观看三级视频欧美| 男人天堂网在线观看| 欧美在线视频免费| 免费成人网www| av动漫在线观看| 91丝袜美腿高跟国产极品老师| 不卡的免费av| 亚洲精品久久久久久久久久久久| sm在线观看| 久久99蜜桃综合影院免费观看| 国产一区二区三区四区老人| 国产精品一区二区在线免费观看| 一区二区三区四区在线| 韩国av免费在线| 欧美亚洲视频一区二区| 日韩电影不卡一区| 韩国一区二区av| 国产欧美日韩麻豆91| 伊人网站在线观看| 久久久999精品| 国产精品久久久久久av公交车| 日韩国产精品毛片| 国产福利一区在线| 日韩黄色a级片| 亚洲精品中文字幕有码专区| 制服诱惑亚洲| 91视频成人免费| 成人黄色a**站在线观看| www成人在线| 中文字幕不卡在线视频极品| 欧美高清影院| 日韩成人手机在线| 91年精品国产| 亚洲天堂中文网| 欧美另类精品xxxx孕妇| 日韩美女国产精品| 亚洲一区在线不卡| 亚洲一二三四区不卡| 日韩精品福利| 国产综合久久久久| 一区二区自拍| 亚洲女优在线观看| 日韩欧美一区中文| 中文字幕在线免费观看视频| 天堂社区 天堂综合网 天堂资源最新版| 久久国产精品免费| 国产在线一区视频| 永久免费毛片在线播放不卡| 精品精品视频| 久久综合久久色| 一区二区三区资源| 国产一二在线观看| 91麻豆精品秘密入口| 老司机午夜精品视频| 国产高潮国产高潮久久久91| 亚洲精品国产精品久久清纯直播 | 爱久久·www| 国产一区二区三区奇米久涩| 日本不卡视频一二三区| 久久精品波多野结衣| 国产一区二区av| 国产精品毛片视频| 日本黄大片一区二区三区|