最新要闻
- 焦点关注:祸国电视剧免费观看(祸国电视剧)
- 国产“水果之王”来了!首批国产榴莲6月上市开卖_聚看点
- CPU都要烧掉了!女子景区坐竹筏被汽车撞了 网友:头次见|当前要闻
- 曾经最火SUV!比亚迪宋PLUS冠军版今日上市 买它还是银河L7?
- 小米MIX Fold 3关键规格曝光:首次用上潜望长焦、更耐摔-天天快看点
- 黑龙江首列高端旅游列车“林都号”首发:酒吧、茶室全都有
- 中成股份:6月16日融资买入247.82万元,融资融券余额1.3亿元
- 山村幼儿园计划-阳光专项基金20000_山村幼儿园计划_全球要闻
- 避坑指南 篇六:影帝的大肚腩也拯救不了没落的港片。
- 精彩看点:“楚才还乡”招才引智推介会在北京举办
- 环球快消息!曲阜万仞宫墙南广场区域实行分时段限行 市民游客注意
- 宝马被大货车横着推出几百米 女司机以为只能等死 网友:远离货车的重要性
- 青岛新特产“巧克力大爷”火了 网友感慨还玩手机吗:这身体素质秒年轻人_今亮点
- 长城汽车总裁:‘放血式’价格战不是长久之计 明年目标净利润72亿元 资讯
- 环球观速讯丨魅族Flyme Auto首次上车 亮点一览:跟手机一样好用
- 曾被长城举报 比亚迪秦/宋PLUS DM-i大批量OTA升级1.2系统
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Spring Boot 优雅实现多租户架构,so easy~!
一、概述
1.什么是多租户架构?
多租户架构是指在一个应用中支持多个租户(Tenant)同时访问,每个租户拥有独立的资源和数据,并且彼此之间完全隔离。通俗来说,多租户就是把一个应用按照客户的需求“分割”成多个独立的实例,每个实例互不干扰。
2. 多租户架构的优势
- 更好地满足不同租户的个性化需求。
- 可以降低运维成本,减少硬件、网络等基础设施的投入。
- 节约开发成本,通过复用代码,快速上线新的租户实例。
- 增强了系统的可扩展性和可伸缩性,支持水平扩展,每个租户的数据和资源均可管理和控制。
3. 实现多租户架构的技术选择
对于实现多租户架构技术不是最重要的最重要的是正确的架构思路。但是选择正确的技术可以更快地实现多租户架构。
(资料图片仅供参考)
二、设计思路
1. 架构选型
基于Java开发多租户应用推荐使用Spring Boot和Spring Cloud。Spring Boot能快速搭建应用并提供许多成熟的插件。Spring Cloud则提供了许多实现微服务架构的工具和组件。
1.1 Spring Boot
使用Spring Boot可以简化项目的搭建过程自动配置许多常见的第三方库和组件,减少了开发人员的工作量。
@RestControllerpublic class TenantController { @GetMapping("/hello") public String hello(@RequestHeader("tenant-id") String tenantId) { return "Hello, " + tenantId; }}
1.2 Spring Cloud
在架构多租户的系统时Spring Cloud会更加有用。Spring Cloud提供了一些成熟的解决方案,如Eureka、Zookeeper、Consul等,以实现服务发现、负载均衡等微服务功能。
2. 数据库设计
在多租户环境中数据库必须为每个租户分别存储数据并确保数据隔离。我们通常使用以下两种方式实现:
- 多个租户共享相同的数据库,每个表中都包含tenant_id这一列,用于区分不同租户的数据。
- 为每个租户创建单独的数据库,每个数据库内的表结构相同,但数据相互隔离。
3. 应用多租户部署
为了实现多租户在应用部署时我们需要考虑以下两个问题。
3.1 应用隔离
在多租户环境中不同租户需要访问不同的资源,因此需要进行应用隔离。可以通过构建独立的容器或虚拟机、使用命名空间等方式实现。Docker就是一种非常流行的隔离容器技术。
3.2 应用配置
由于每个租户都有自己的配置需求因此需要为每个租户分别设置应用配置信息,例如端口号、SSL证书等等。这些配置可以存储在数据库中,也可以存储在云配置中心中。
4. 租户管理
在多租户系统中需要能够管理不同租户的数据和资源,同时需要为每个租户分配相应的权限。解决方案通常包括以下两部分。
4.1 租户信息维护
租户信息的维护包括添加、修改、删除、查询等操作,要求能够根据租户名称或租户ID快速查找对应的租户信息。
CREATE TABLE tenant ( id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL UNIQUE, description VARCHAR(255), created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
4.2 租户权限控制
在多租户应用中必须为每个租户分别设置对系统资源的访问权限。例如,A租户和B租户不能访问彼此的数据。
@EnableGlobalMethodSecurity(prePostEnabled = true)@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/api/tenant/**").hasRole("ADMIN") .anyRequest().authenticated() .and() .formLogin(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService()) .passwordEncoder(new BCryptPasswordEncoder()) .and() .inMemoryAuthentication() .withUser("admin") .password(new BCryptPasswordEncoder().encode("123456")) .roles("ADMIN"); }}
三、技术实现
1. Spring Boot中的多租户实现
在Spring Boot中可以通过多数据源和动态路由来实现多租户机制。
Spring Boot 基础就不介绍了,推荐看这个实战项目:
https://github.com/javastacks/spring-boot-best-practice
1.1 多数据源实现
多数据源是指为不同的租户配置不同的数据源,使得每个租户都可以访问自己的独立数据。具体实现方法如下:
@Configurationpublic class DataSourceConfig { @Bean(name = "dataSourceA") @ConfigurationProperties(prefix = "spring.datasource.a") public DataSource dataSourceA() { return DataSourceBuilder.create().build(); } @Bean(name = "dataSourceB") @ConfigurationProperties(prefix = "spring.datasource.b") public DataSource dataSourceB() { return DataSourceBuilder.create().build(); } @Bean(name = "dataSourceC") @ConfigurationProperties(prefix = "spring.datasource.c") public DataSource dataSourceC() { return DataSourceBuilder.create().build(); }}
以上代码是配置了三个数据源分别对应三个租户。然后在使用时,可以使用注解标记需要连接的数据源。
@Servicepublic class ProductService { @Autowired @Qualifier("dataSourceA") private DataSource dataSource; // ...}
1.2 动态路由实现
动态路由是指根据请求的URL或参数动态地切换到对应租户的数据源。具体实现如下:
public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return TenantContextHolder.getTenantId(); }}@Configurationpublic class DataSourceConfig { @Bean(name = "dataSource") @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return DataSourceBuilder.create().type(DynamicDataSource.class).build(); }}
以上是动态路由的核心代码DynamicDataSource
继承自AbstractRoutingDataSource
,通过determineCurrentLookupKey()
方法动态获得租户ID,然后切换到对应的数据源。
2. Spring Cloud中的多租户实现
在Spring Cloud中可以通过服务注册与发现、配置中心、负载均衡等方式实现多租户机制。
2.1 服务注册与发现
使用Spring Cloud中的Eureka实现服务注册与发现。每个租户的服务都在注册中心以不同的应用名称进行注册,客户端可以通过服务名称来访问对应租户的服务。
2.2 配置中心
使用Spring Cloud Config作为配置中心。配置文件以租户ID进行区分,客户端通过读取对应租户的配置文件来获取配置信息。
2.3 负载均衡
使用Spring Cloud Ribbon作为负载均衡器。根据请求的URL或参数选择对应租户的服务实例进行请求转发。
2.4 API
在API网关层面实现多租户机制根据请求的URL或参数判断所属租户,并转发到对应租户的服务实例。
四、 应用场景
1. 私有云环境
私有云环境指的是由企业自行搭建的云环境,不对外提供服务,主要应用于企业内部的数据存储、管理、共享和安全控制。相较于公有云,私有云的优点在于可以更好地保护企业核心数据,同时也能够满足企业对于数据安全性和可控性的要求。
2. 公有云环境
公有云环境指的是由云服务商搭建并对外提供服务的云环境,用户可以根据需要购买相应的云服务,如云存储、云计算、云数据库等。相较于私有云,公有云的优点在于具有成本低廉、弹性伸缩、全球化部署等特点,能够更好地满足企业快速发展的需求。
3. 企业级应用
企业级应用是指面向企业客户的应用程序,主要包括ERP、CRM、OA等一系列应用系统。这类应用的特点在于功能强大、流程复杂、数据量大,需要满足企业的高效率、高可靠性、高安全性和易维护性等要求。在云计算环境下,企业可以将这些应用部署在私有云或公有云上,减少了硬件设备的投入和维护成本,提高了管理效率。
五、实现步骤
1. 搭建Spring Boot和Spring Cloud环境
首先需要在Maven项目中引入以下依赖:
org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-dependencies 2020.0.3 pom import
然后需要在application.yml中配置相应的参数,如下所示:
spring: datasource: url: jdbc:mysql://localhost:3306/appdb?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: 123456mybatis: type-aliases-package: com.example.demo.model mapper-locations: classpath:mapper/*.xmlserver: port: 8080eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/management: endpoints: web: exposure: include: "*"
其中datasource.url
为数据库连接的URL,username和password为数据库连接的账号和密码;server.port
为Spring Boot应用启动的端口;eureka.client.serviceUrl.defaultZone
为Eureka服务注册中心的URL。
Java指南:java-family.cn
2. 修改数据库设计
接下来需要对数据库进行相应的修改,以支持多租户部署。具体来说,我们需要在数据库中添加一个与租户相关的字段,以便在应用中区分不同的租户。
3. 实现应用多租户部署
接着需要在代码中实现应用的多租户部署功能。具体来说,我们需要为每个租户实例化对应的Spring Bean,并根据租户ID将请求路由到相应的Bean中去处理。
以下是一个简单的实现示例:
@Configurationpublic class MultiTenantConfig { // 提供对应租户的数据源 @Bean public DataSource dataSource(TenantRegistry tenantRegistry) { return new TenantAwareDataSource(tenantRegistry); } // 多租户Session工厂 @Bean(name = "sqlSessionFactory") public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); return sessionFactory.getObject(); } // 动态切换租户 @Bean public MultiTenantInterceptor multiTenantInterceptor(TenantResolver tenantResolver) { MultiTenantInterceptor interceptor = new MultiTenantInterceptor(); interceptor.setTenantResolver(tenantResolver); return interceptor; } // 注册拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(multiTenantInterceptor()); } // 注册租户信息 @Bean public TenantRegistry tenantRegistry() { return new TenantRegistryImpl(); } // 解析租户ID @Bean public TenantResolver tenantResolver() { return new HeaderTenantResolver(); } }
其中MultiTenantConfig
是多租户部署的核心配置类,它提供了对应租户数据源、多租户Session工厂、动态切换租户等功能。
4. 实现租户管理
最后需要实现一个租户管理的功能,以便在系统中管理不同的租户。具体来说,我们可以使用Spring Cloud的服务注册与发现组件Eureka来注册每个租户的实例,并在管理界面中进行相应的操作。另外,我们还需要为每个租户提供一个独立的数据库,以保证数据隔离性。
六、小结回顾
本文详细介绍了如何使用Spring Boot和Spring Cloud实现一个支持多租户部署的应用。主要包括搭建Spring Boot和Spring Cloud环境、修改数据库设计、实现应用多租户部署、实现租户管理等方面。
应用场景主要包括SaaS应用、多租户云服务等。优劣势主要体现在提升了应用的可扩展性和可维护性,但也增加了部署和管理的复杂度。未来的改进方向可以考虑进一步提升多租户管理的自动化程度,减少人工干预和错误率。
版权声明:本文为CSDN博主「格林希尔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/u010349629/article/details/130737253
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!
关键词:
Spring Boot 优雅实现多租户架构,so easy~!
焦点关注:祸国电视剧免费观看(祸国电视剧)
国产“水果之王”来了!首批国产榴莲6月上市开卖_聚看点
CPU都要烧掉了!女子景区坐竹筏被汽车撞了 网友:头次见|当前要闻
曾经最火SUV!比亚迪宋PLUS冠军版今日上市 买它还是银河L7?
小米MIX Fold 3关键规格曝光:首次用上潜望长焦、更耐摔-天天快看点
黑龙江首列高端旅游列车“林都号”首发:酒吧、茶室全都有
中成股份:6月16日融资买入247.82万元,融资融券余额1.3亿元
山村幼儿园计划-阳光专项基金20000_山村幼儿园计划_全球要闻
避坑指南 篇六:影帝的大肚腩也拯救不了没落的港片。
精彩看点:“楚才还乡”招才引智推介会在北京举办
氧化铝期货上市在即 从定价和套利中或可觅得交易机会_全球滚动
环球快消息!曲阜万仞宫墙南广场区域实行分时段限行 市民游客注意
宝马被大货车横着推出几百米 女司机以为只能等死 网友:远离货车的重要性
青岛新特产“巧克力大爷”火了 网友感慨还玩手机吗:这身体素质秒年轻人_今亮点
长城汽车总裁:‘放血式’价格战不是长久之计 明年目标净利润72亿元 资讯
环球观速讯丨魅族Flyme Auto首次上车 亮点一览:跟手机一样好用
多只债基提前结束募集 超470亿元资金涌向债市 今日关注
讯息:“财务顾问”被判全额连带赔偿 首例ABS欺诈发行案判决结果出炉
曾被长城举报 比亚迪秦/宋PLUS DM-i大批量OTA升级1.2系统
南京大学才女瞒着家里当主播 竟发现榜一大哥是自己爸爸_快讯
售价超50万元理想MEGA却用18英寸小轮胎 李想揭秘:比20英寸好太多
读发布!设计与部署稳定的分布式系统(第2版)笔记05_层叠
电动摩托开始崛起:传统燃油摩托车要被淘汰?
世界热讯:父亲带12岁女儿休学1年骑行游中国:不让孩子拼文化课 没意义
spring cloud 微服务治理
泰迪踢掉主人长了2年的肾结石 网友:晚饭加鸡腿 每日快播
一个电铃在牛津大学响了180多年:电池成分却至今未知 天天微头条
首尔房价暴跌40%!楼市要崩盘?韩国人纷纷表示很淡定 今日聚焦
全球微头条丨京东618最终战报:就是不说多少钱
环球时讯:魅族618销售额增速第一:同比增长500%
天天短讯!C++基础知识总结
7499元 华硕ROG新款38英寸游戏显示器上架:4K 144Hz高刷屏
北京现代沐飒正式上市:12.18万元起、百公里油耗低至6.86L-全球热闻
【全球独家】银行股迎来回调,不急,我们最不缺的就是时间
董明珠称:全世界只有格力空调不吹人! 环球观察
【Unity3D】法线贴图和凹凸映射 视点
每日讯息!中邮策略:央行降息提振信心 市场有望震荡上行
吃小龙虾戴了手套 为啥还是满手油? 每日快看
天天精选!AMD做了一个201MB缓存的怪物!可惜流产了
今年“6·18”河南消费力全国第八!胡辣汤、洛阳汉服、河南老字号美食全国热卖
k8s 深入篇———— 一些容器操作的原理[三]|报资讯
政治权利名词解释电大 政治权利名词解释 最新资讯
微软确认月初遭DDoS网络攻击:一度导致Microsoft 365服务中断
终末的女武神同人 毗沙门天VS宇智波斑-资讯
249元 雷柏推出VT9S无线鼠标:原相3395引擎、26000 DPI|全球微头条
大四男生实习薪资1万4妈妈仰天大笑 姐姐回应:要在船上写论文 全球聚焦
一箭41星创中国纪录!当天传回超清大图:英格兰一览无余 环球观察
全球热讯:拜耳医药保健有限公司属于哪个国家_拜耳公司是哪个国家
头条焦点:全国大数据与计算智能挑战赛:面向低资源的命名实体识别基线方案,排名13/64
STL vector容器存储键值对
世界滚动:美国加速跌落美债深渊
天天快消息!苹果M2 Ultra首次开盖:Intel 56核心相形见绌
“迈克·马龙,你为什么不买詹姆斯的账?”
环球报道:美团一面:OOM后,JVM一定会退出吗?为什么?
JS(入门)-焦点速读
东土科技:定增募资不超8.75亿元申请获证监会注册批复 环球热文
当前滚动:最便宜折叠手机!moto razr 40开售:3999元起
官方通报“特校校长刘某某强制猥亵残障学生案”
Python调用外部系统命令
【环球报资讯】Python第三方模块:pymongo模块的用法
马斯克:针对智能电视的推特视频应用即将问世 世界快消息
速递!国内首款市域C型动车组亮相:时速达160公里
最新民调:超半数非裔美国人预计美国种族主义会变得更糟 环球报道
500元到5000元 各价位最值得买的10款CPU集合
世界今日报丨独特16:18“方形”比例辨识度拉满:LG推出新款DualUp 28MQ750显示器
演员胡兵50万航司积分被清零引关注 东航客服回应:没办法核实-热门
k8s 深入篇———— docker 镜像是什么[二]
马斯克脑机接口新进展:首例人体植入试验今年开展 环球热资讯
攀升618秒杀:12代酷睿16英寸护眼屏轻薄本仅1999元_全球通讯
天天热资讯!《变形金刚》独占鳌头:2023暑期档票房达15亿元
看了“细菌量” 你还敢给孩子用卷纸来擦嘴吗?_天天快资讯
网飞爆火网剧续作来了!《鱿鱼游戏》第二季官宣:老角色回归|焦点要闻
浦发银行:共湘发展十九载 奋楫扬帆正当时
满血8核+32GB+1TB 机械革命S mini主机到手2929元:办公神器|世界即时看
资讯推荐:上线12年的“QQ安全达人”将下线 网友:你为它装过腾讯电脑管家没?
商职全称是什么 济南商职全称是什么
2023中国高校计算机大数据挑战赛:论文学科分类baseline|清华主办|今日看点
【技术积累】算法中的排序算法【一】
极限科技旗下软件产品 INFINI Easysearch 通过统信 UOS 认证|天天热议
【环球财经】日本为何出现巨额贸易逆差
便宜的瓜不甜?百果园回应女子团购西瓜被嘲讽:是误解 已道歉|全球热闻
京东618发布“35711”梦想:打造3家万亿收入公司 创造100万就业_通讯
演员胡兵向东航维权失败:价值一万多的白金卡50万积分一夜清零
天天快讯:在 Cenntos6.8 下安装 Oracle11g
当前播报:京东限时优惠:Redmi 27英寸4K显示器享大降价
世界头条:人气漫改!网飞真人版《海贼王》预告片出炉:路飞橡胶手无敌
全球车企第一高!马斯克曝特斯拉市值上涨主要动力 今日快看
关注:广州一龙舟队全是富婆?当地:事实 但身价不是参赛门槛
焦点热门:一公司端午节只发了三颗荔枝 员工吐槽:是不是公司要凉了?
女子户外活动后因热射病去世 专家提醒:轻度中暑及时干预_每日时讯
春天的诗有哪些古诗 春天的100首古诗有哪些|快资讯
【热闻】JWT的基本组成结构
当前速递!校长猥亵残障女学生判3年 法院回应全案审查!简直是禽兽不如!
保时捷Taycan对手来了!法拉利“老乡”发布纯电轿跑:124万起-世界报道
世界短讯!上新啦!这些夏日冷饮新品你尝过了吗?今年中国饮品冷饮产业还有这些新趋势!
【技术积累】Java中的集合框架【一】
清除外卖行业“影子店铺”隐患
今天是父亲节 微信上线限时状态感谢老爸:教你2步设置|环球快播
环球信息:重新定义移动办公:华为MatePad Air“野趣办公”成年轻人办公新潮流