datatable怎么根据两列分组_谈谈怎么做服务隔离
来源于公众号孤独烟 ,
作者孤独烟
引言
OK,如下图所示
那显而易见,做服务隔离的目的就是避免服务之间相互影响。毕竟谁也不能说自己的微服务百分百可用,如果不做隔离,一旦一个服务出现了问题,整个系统的稳定性都会受到影响!
因此,做服务隔离是很有必要的。那么怎么隔离呢?
- 按种类隔离
- 按用户隔离
OK,接下来开始细说这两种方式!
正文
种类隔离
其实按照服务种类隔离要从两个纬度来说:即服务提供方和服务调用方!
假设我们一个系统有三个服务:订单服务,库存服务,支付服务!有如下调用关系:
OK,我们先明确一点,上面有几个服务扮演服务提供方的角色?
一共是三个:支付服务(给用户提供服务)、库存服务(给支付服务提供服务)、订单服务(给支付服务提供服务)
有几个服务扮演服务调用方的角色?
一共是一个:支付服务(调用订单服务和库存服务)
针对服务提供方这个角度而言,怎么做隔离呢?
很简单,每一个服务乃至其对应的数据库,给一个服务器部署就行!这样某个服务出现了故障,就不会相互影响,达到一种物理层面上的隔离!
什么,你们公司服务器不够?了解一下《微服务为什么一定要用docker》
针对服务调用方这个角度而言,怎么做隔离呢?
OK,先明白一点,服务调用方不做隔离会出现什么情况?如图所示
一个请求过来,占用支付服务中的Tomcat的一个线程。然后,该线程去顺序调用订单服务和库存服务!
那么,一旦库存服务出问题了,这个Tomcat的线程就一直卡在那,无法返回!与此同时,页面上源源不断的有请求过来,会把Tomcat里头的线程池资源全部消耗完毕!对于后面的请求,Tomcat就无法响应!
因此,如果不针对被调服务做服务隔离,一个被调服务出问题,就将导致调用方服务不可用!
那怎么隔离呢?
这里介绍一种线程池隔离方式,给每个微服务都初始化出一个线程池,如下图所示,给订单服务和库存服务都初始化出一个线程池,不使用Tomcat线程池中的线程直接调用,而是用相应线程池中的线程去调用!
OK,如果此时库存服务不可用了呢?
库存服务线程池会被迅速塞满,此时后面进来的新请求发现库存服务线程池满啦,于是乎就不去调库存服务,直接返回!
如下图所示
ps:目前业内有信号量隔离和线程池隔离两种隔离方式,这里举的是线程池隔离!
怎么实现呢?
可以了解一下Hytrix、Sentinel、以及Resilience4j如何和你的项目结合起来使用!Resilience4j只提供信号量隔离!
用户隔离
OK,我们先明白一点这里的租户和用户不是一个概念!
- 用户: 一个环境/系统的一个使用者即该环境/系统的一个用户。
- 租户:用户从某种粒度上被分到若干组内,每组成为一个租户。
这里的组可以这么理解:用户根据一定的特征去做分组,比如是VIP的一组,不是VIP的一组。又或者北方的用户一组,南方的用户一组。按照自己的业务场景来分组。
那么所谓的用户隔离,就是按照不同的分组形成不同的服务实例。这样某个服务实例挂了,只影响对应分组的用户,而不是全部用户!
有如下三种方式!
- 方式一:每个租户有独立的服务和独立的数据库
- 方式二:每个租户有共享的服务和独立的数据库
- 方式三:每个租户有共享的服务和共享的数据库
下面开始逐个说明
方式一
每个租户有独立的服务和独立的数据库!
这个在生产上一般是这么做,如下所示
如图所示,用户在请求的时候会经过网关!网关根据tenant_id识别出对应的服务实例,进行转发。至于用什么当网关,我们用的是Zuul。
方式二
每个租户有共享的服务和独立的数据库!
这个在生产上一般是这么做,如下所示
如图所示,用户在请求的时候会经过网关,网关将数据转发给用户服务!用户服务根据tenant_id确定该操作哪一个数据库!
OK,这个时候大家应该有一个疑问,
在项目代码中,怎么确定该操作的数据库?
好,这个就是ORM框架,动态选择数据源的问题!我以国内流行的hibernate和mybatis来进行说明!
(1)hibernate方式
在4.0版本hibenate开始支持多租户架构,即对不同租户使用独立数据库!大家可以搜索一个配置,叫hibernate.multiTenancy。该值有一个value值为
DATABASE:一个租户一个database。
将这项的value值设为DATABASE后,还需要给hibernate.tenant_identifier_resolver配置项赋值,即告诉hibernate,如何解析出tenant_id。
以及给hibernate.multi_tenant_connection_provider配置项赋值,即告诉hibernate如何以租户特有的方式获取数据连接!
ps:看不懂的童鞋略过,懂hibernate的童鞋自然懂这个配置!
(2)mybatis方式
mybatis没提供这种多租户架构的支持!我们必须要扩展AbstractRoutingDataSource抽象类,实现多数据源切换!
嫌麻烦?
OK,介绍你一个插件叫mybatis plus可以实现这种动态数据源切换!
API地址都给你贴出来了:
mp.baomidou.com/guide/dynamic-datasource.html
ps:我只能给你点一下思路,自己去查。因为具体如何配置,都可以写一篇文章!我很不爱写这种贴配置的文章,觉得含金量不高,所以大家根据我的思路去实现即可!
方式三
每个租户有共享的服务和共享的数据库!
这个在生产上一般是这么做,如下所示
如图所示,用户在请求的时候会经过网关,网关将数据转发给用户服务!用户服务根据tenant_id确定操作数据库中的哪一行记录!
老规矩,和你们说一下在ORM中难点在哪!以mybatis为例,所有的sql上都要加一句
AND t.tenant_id = ?
是不是觉得很麻烦?怎么解决呢?
(1)hibernate方式
利用hibernate filter配置, OR-Mapping配置文件使用Filter,可以在进行数据查询时自动过滤数据!
如下所示
//省略
ps:看不懂的童鞋略过,懂hibernate的童鞋自然懂这个配置!
(2)mybatis方式
mybatis中有一个东西叫做自定义Interceptor,可以拦截出你要执行的sql,然后动态拼上你的租户条件即可!
嫌麻烦?
OK,介绍你一个插件叫mybatis plus可以实现这种多租户的更改,可以动态的解析出sql,增加上条件!
API地址都给你贴出来了:
mp.baomidou.com/guide/tenant.html
总结
本文介绍了服务隔离的分类,以及在生产上具体是怎么做的,希望大家有所收获!
datatable怎么根据两列分组_谈谈怎么做服务隔离相关推荐
- datatable怎么根据两列分组_公司要IT转型,我该怎么办?用Python进行数据处理
" 以后数据处理,都用pandas" 01 面临问题 作为运维人员,每周要统计很多数据,特别是周四写周报的时候,基本要花半天时间.既然已经学了Python,那就试试优化它.以统计不 ...
- excel模糊匹配两列文字_高效便捷的Word、Excel操作技巧
Word篇 1.快速定位到上次编辑位置 打开word文件后,按下Shift+F5键你就会发现光标已经快速定位到你上一次编辑的位置了.其实Shift+F5的作用是定位到Word最后三次编辑的位置. 2. ...
- excel合并两列内容_不要再粘粘粘,合并Excel表格数据,3秒完成
原创作者: 兰色幻想-赵志东 转自: Excel精英培训 一般情况下,两列数据需要合并,我会推荐用简单的公式: =A2&B2 二般情况下,再连接就不行了,比如C列连接后百分比变成了小数.这时就 ...
- 查询时拼接两列数据_如何用VBA代码查询两列数据差异?
爱就一个字,我只说一次-- 北京市第三交通委提醒您:代码千万条,注释第一条,命名不规范,修订两行泪-- 咳,给大家拜晚年了,再提前祝大家元宵快乐-- 我们今天和大家分享的内容是如何用VBA代码查询两列 ...
- excel合并两列内容_还在为合并WPS表格(Excel)中两列内容而犯愁?此方法简单高效...
我们在处理WPS表格(Excel)数据时,时常需要将两列甚至更多列的内容合并显示在同一列中,就像这样: 这个时候大家是怎么解决的呢? 路人:复制粘贴So easy!小杜:不止两三行啊--路人:复制粘贴 ...
- countif函数比较两列不同_这些Excel函数公式,职场办公天天用,赶紧掌握!
在职场办公中,我们经常都会使用各种函数公式来对数据进行运算,面对不同的要求,可以使用不同公式,这样才能提高工作效率.今天,小汪老师就来给大家分享几个职场办公中比较常用的一些函数公式. 01统计重复出现 ...
- java按两列输出_有没有一种简单的方法可以将两列输出到Java中的控制台? - java...
如标题所述,是否有一种简单的方法可以将两列输出到Java中的控制台? 我知道\t,但是在使用printf时,我还没有找到基于特定列进行空间分配的方法. 参考方案 使用宽度和精度说明符,将其设置为相同的 ...
- excel模糊匹配两列文字_如何使用Power Pivot进行模糊匹配
之前在<使用Power Query进行模糊匹配>一文中我们讨论了如何在Power Query中进行模糊匹配,今天我们来讨论下在Power Pivot中的模糊匹配. 还是之前的案例,图1为产 ...
- python合并两列数据_在pandas / python中的同一数据框中将两列合并...
>>> df Duration End station Start station 0 1407 NaN 14th & V St NW 1 509 NaN 21st & ...
最新文章
- Table嵌套去掉子table的外边框
- 被5月GitHub Top20榜单惊呆了 原来区块链大佬都在做这个
- 解决计算机问题的一般步骤
- 深入理解asp.net中的 __doPostBack函数
- css :after :berfor
- Julia与R/Python/MATLAB比较及Julia中的Text Analysis模块
- 介绍Java中的内存泄漏
- hive三种调用方式
- 在Ubuntu上安装misterhouse
- Oracle的dbf文件迁移
- feign使用_Feign:介绍与使用
- TriCore处理器的上下文切换原理
- C语言---数组排序
- delphi xe7 EMS是什么 什么作用,怎么使用?
- linux防火墙放开pptpd端口号,centos7 安装pptpd(使用iptbales防火墙)
- 【国际象棋】棋盘游戏-微信小程序开发流程详解
- 1986年图灵奖--约翰·霍普克洛夫特和罗伯特·陶尔扬简介
- web网页设计——体育气步枪射击主题(5页面)带图片轮播特效(HTML+CSS) ~学生网页设计作业源码
- Vue引入vuetify框架你需要知道的几点
- laradock 安装使用 kafka
热门文章
- Angular启动过程介绍
- centos7 校正linux系统时间_Linux系统:Centos7下搭建ClickHouse列式存储数据库
- 魅族15系统是android,魅族15系列评测:性能够用王者荣耀优化
- c#二维数据最大最小值_C#| 打印类型,各种数据类型的最大值和最小值
- 评价最高影片JAVAlibrary_视频 | 手游大神,动画导演,机圈新贵,极客怎么评价《愤怒的小鸟2》?...
- 信息系统状态过程图_操作系统中的增强型过程状态图
- 5种高大上的yml读取方式,你知道几种?
- 千万不要这样写代码!9种常见的OOM场景演示
- Java14发布!Switch竟如此简单?Lombok也不需要了?来用Idea搭建Java14吧!​
- C# 读取照片的EXIF信息