datatable怎么根据两列分组_谈谈怎么做服务隔离

来源于公众号孤独烟 ,

作者孤独烟

引言

OK,如下图所示

90d487af0e9691ca5f7709b4014bb989.png
870a9f9595475dc504717ede0fbe6416.png


那显而易见,做服务隔离的目的就是避免服务之间相互影响。毕竟谁也不能说自己的微服务百分百可用,如果不做隔离,一旦一个服务出现了问题,整个系统的稳定性都会受到影响!


因此,做服务隔离是很有必要的。那么怎么隔离呢?

  • 按种类隔离
  • 按用户隔离

OK,接下来开始细说这两种方式!

正文

种类隔离

其实按照服务种类隔离要从两个纬度来说:即服务提供方服务调用方

假设我们一个系统有三个服务:订单服务,库存服务,支付服务!有如下调用关系:

226e66ca29649b0bcc0acfbee7c2d630.png

OK,我们先明确一点,上面有几个服务扮演服务提供方的角色?

一共是三个:支付服务(给用户提供服务)、库存服务(给支付服务提供服务)、订单服务(给支付服务提供服务)

有几个服务扮演服务调用方的角色?

一共是一个:支付服务(调用订单服务和库存服务)

针对服务提供方这个角度而言,怎么做隔离呢?

很简单,每一个服务乃至其对应的数据库,给一个服务器部署就行!这样某个服务出现了故障,就不会相互影响,达到一种物理层面上的隔离!

什么,你们公司服务器不够?了解一下《微服务为什么一定要用docker》

针对服务调用方这个角度而言,怎么做隔离呢?

OK,先明白一点,服务调用方不做隔离会出现什么情况?如图所示

a5ee3c40f9687de5b5ff96c93d0ae4da.png

一个请求过来,占用支付服务中的Tomcat的一个线程。然后,该线程去顺序调用订单服务和库存服务!

那么,一旦库存服务出问题了,这个Tomcat的线程就一直卡在那,无法返回!与此同时,页面上源源不断的有请求过来,会把Tomcat里头的线程池资源全部消耗完毕!对于后面的请求,Tomcat就无法响应!


因此,如果不针对被调服务做服务隔离,一个被调服务出问题,就将导致调用方服务不可用!

那怎么隔离呢?

这里介绍一种线程池隔离方式,给每个微服务都初始化出一个线程池,如下图所示,给订单服务和库存服务都初始化出一个线程池,不使用Tomcat线程池中的线程直接调用,而是用相应线程池中的线程去调用!

2046a603ea6a788b5d0f965dae39ad97.png

OK,如果此时库存服务不可用了呢?


库存服务线程池会被迅速塞满,此时后面进来的新请求发现库存服务线程池满啦,于是乎就不去调库存服务,直接返回!

如下图所示

0c63d59f663d2f8bdd79966425313f0c.png

ps:目前业内有信号量隔离和线程池隔离两种隔离方式,这里举的是线程池隔离!

怎么实现呢?

可以了解一下Hytrix、Sentinel、以及Resilience4j如何和你的项目结合起来使用!Resilience4j只提供信号量隔离!

用户隔离

4adc77ca3ab4c33ff568deee63ce72ff.png
2c80a6427ed68a006ad48afeccc7035f.png

OK,我们先明白一点这里的租户和用户不是一个概念!

  • 用户: 一个环境/系统的一个使用者即该环境/系统的一个用户。
  • 租户:用户从某种粒度上被分到若干内,每组成为一个租户。

这里的可以这么理解:用户根据一定的特征去做分组,比如是VIP的一组,不是VIP的一组。又或者北方的用户一组,南方的用户一组。按照自己的业务场景来分组。

那么所谓的用户隔离,就是按照不同的分组形成不同的服务实例。这样某个服务实例挂了,只影响对应分组的用户,而不是全部用户!

有如下三种方式!

  • 方式一:每个租户有独立的服务和独立的数据库
  • 方式二:每个租户有共享的服务和独立的数据库
  • 方式三:每个租户有共享的服务和共享的数据库

下面开始逐个说明

方式一

每个租户有独立的服务和独立的数据库!

这个在生产上一般是这么做,如下所示

fbddf197968d3c99cce7a8a87a7c9f5a.png

如图所示,用户在请求的时候会经过网关!网关根据tenant_id识别出对应的服务实例,进行转发。至于用什么当网关,我们用的是Zuul。

方式二

每个租户有共享的服务和独立的数据库!

这个在生产上一般是这么做,如下所示

f44a940f66f7951a0b0079e5ecfbf7d4.png

如图所示,用户在请求的时候会经过网关,网关将数据转发给用户服务!用户服务根据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:我只能给你点一下思路,自己去查。因为具体如何配置,都可以写一篇文章!我很不爱写这种贴配置的文章,觉得含金量不高,所以大家根据我的思路去实现即可!

方式三

每个租户有共享的服务和共享的数据库!

这个在生产上一般是这么做,如下所示

13cbdf92abffcaa92215b18a8aa8f673.png

如图所示,用户在请求的时候会经过网关,网关将数据转发给用户服务!用户服务根据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

总结

本文介绍了服务隔离的分类,以及在生产上具体是怎么做的,希望大家有所收获!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

position: absolute;_前端性能优化--transform与position

上个星期去yy语音面试&#xff0c;就有一个这样问题&#xff1a; transform与position:absolute 有什么区别? 我回家后查资料发现这道题目其实不简单啊&#xff0c;涉及到重排、重绘、硬件加速等网页优化的知识。首先看一个用top、left实现的动画效果<style>html,body {…

台式计算机总是重启,台式电脑经常自动重启怎么修复

当我们的电脑出现了电脑自动重启的时候&#xff0c;我们就要注意了&#xff0c;说明我们的电脑主机出现问题了&#xff0c;怎么解决呢。下面是学习啦小编为大家整理的关于台式电脑经常自动重启的相关资料&#xff0c;希望对您有所帮助!台式电脑经常自动重启的解决方法方法/步骤…

gan处理自己的数据集_用GAN生成差分隐私数据集

说在前面今天看了 Generating Differentially Private Datasets Using GANS&#xff0c;明天要讨论。老师不知道从哪里挖出了这篇被拒了的文&#xff0c;研究的主题和我们最近的工作非常相关&#xff0c;而且证明非常有趣&#xff0c;大致地看了一下文章的结构觉得没啥问题&…

ipython安装成功后用不了_ipython安装避坑指南

python学习笔记03 本来想着继续给大家介绍python的数据类型&#xff0c;但是IDLE编辑器&#xff08;默认的 Python shell 编辑器&#xff09;太难用了&#xff0c;导致小编没水出来&#xff0c;所以小编决定装一个别的python shell编辑器&#xff0c;这就是ipython&#xff1b;…

如果用户计算机已接入,01计算机基础知识题(50道)

7、在Windows2000中&#xff0c;切换到MS&#xff0d;DOS方式后&#xff0c;返回Windows2000的命令是。8、在“我的电脑”窗口中用鼠标双击“软盘A”图标&#xff0c;将会。习题参考答案三、填空题1&#xff0e;启动 2&#xff0e;软键盘 3&#xff0e;硬盘 4&#xff0e;弹出式…

k1658停运_最新通知!福州这些列车停运!

停运列车1.4月1日至4月7日太原开k903次&#xff0c;4月3日至4月9日厦门北开k904次停运。2.4月1日至4月8日广州东开k297次&#xff0c;4月2日至4月9日厦门北开k298次停运。3.4月4、5、7日厦门开D6214次、福州开D6229次、厦门开D6224次&#xff0c;4月5、6、8日福州开D6219次、厦…

线程执行完之后会释放吗_java多线程并发:CAS+AQS+HashMap+volatile+ThreadLocal,乐分享...

CyclicBarrier、CountDownLatch、Semaphore 的用法CountDownLatch(线程计数器 )CountDownLatch 类位于 java.util.concurrent 包下&#xff0c;利用它可以实现类似计数器的功能。比如有一个任务 A&#xff0c;它要等待其他 4 个任务执行完毕之后才能执行&#xff0c;此时就可以…

计算机应用基础考查方案,《计算机应用基础》考查方案

《计算机应用基础》考查方案 《计算机应用基础》考核方案 制订人&#xff1a;刘久红老师 计算机应用基础科任教师 制订部门&#xff1a;基础课与思政课教学部 制订时间&#xff1a;2012年12月 一&#xff1a;考核依据 计算机应用基础是面向全院各专业开设的一门重要的公共基础课…

mongodb 导出到sqlserver_SQLServer数据导入Mongodb

SQLServer数据导入Mongodb一、思路MongoVUE免费版支持MySQL导入Mongo,所以思路是SQLServer导入MySQL,再从MySQL导入Mongo。二、准备1&#xff0c;安装mysql数据库(我用的是WAMP&#xff0c;集成mysql&#xff0c;phpadmin)&#xff0c;如果需要&#xff0c;建立自己的数据库如M…

用python画长方形_Python+opencv:绘制矩形,编写文本,PythonOpenCV,画,矩形框

#用 OpenCV 标注 bounding box主要用到下面两个工具——cv2.rectangle() 和 cv2.putText()。用法如下&#xff1a; # cv2.rectangle() # 输入参数分别为图像、左上角坐标、右下角坐标、颜色数组、粗细cv2.rectangle(img, (x,y), (xw,yh), (B,G,R), Thickness) # cv2.putText() …

无法启动此程序因为计算机丢失msvcr110.dll,计算机中丢失msvcr110.dll怎么办

我们在打开电脑程序的时候&#xff0c;系统提示无法启动此程序&#xff0c;因为计算机中丢失MSVCR110.dll&#xff0c;尝试重新安装该程序以解决此问题。这是什么情况呢?因为现在所有的5.5环境都是基于vc11的编译脚本下生成的&#xff0c;所以在windows下你得安装相关组件&…

anaconda pandas运行不了_学习python你必须弄懂的 Python、Pycharm、Anaconda 三者之间的关系...

Python作为深度学习和人工智能学习的热门语言&#xff0c;学习一门语言&#xff0c;除了学会其简单的语法之外还需要对其进行运行和实现&#xff0c;才能实现和发挥其功能和作用。下面来介绍运行Python代码常用到的工具总结。一.Python、Pycharm、Anaconda关系介绍1. PythonPyt…

谁先量子计算机谁就,G、IBM、中科院,比一比谁先实现量子计算霸权?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼前天&#xff0c;科技圈的“重磅”、“突破”&#xff0c;可能又是一条“明明每个字都认识”系列的新闻&#xff1a;中科院在5月3日宣布中国建造了世界上第一台超越早期经典计算机的光量子计算机&#xff0c;自主研发10比特超导量子…

java: 程序包com.alibaba.fastjson不存在_Java开发中的异常

NO.1 Java.alng.NullPointerException这个异常大家肯定都经常遇到&#xff0c;异常的解释是 “程序遇上了空指针 “&#xff0c;简单地说就是调用了未经初始化的对象或者是不存在的对象&#xff0c;这个错误经常出现在创建图片&#xff0c;调用数组这些操作中&#xff0c;比如图…

福大计算机课程表,教学文件 - 福州大学电气工程与自动化学院

第一章 总 则第一条教室是学校教书育人的主要场所&#xff0c;是精神文明的窗口之一&#xff0c;为创造优美、文明、卫生的学习环境&#xff0c;保证教学活动的顺利进行&#xff0c;特制定本管理规定。第二条全校公共教学楼教室的使用均由教务处统一安排&#xff0c;多媒体教…

python爬虫之逆向破解_Python爬虫进阶之APP逆向(二)

最近有朋友在做新闻资讯类的 app 爬虫&#xff0c;也许大多数人都会认为&#xff0c;一个新闻资讯 app 不会有什么反爬吧。 恰恰相反&#xff0c;当你想爬一条新闻的时候都有请求参数加密&#xff0c;可见现在反爬的严重性。 分析 国际惯例先抓包&#xff0c;万幸抓包非常顺利&…

微型计算机的系统组成图,微型计算机系统结构图.doc

时钟复位DBCPUABCBROMRAM定时计数器中断系统I/O口外部设备微型计算机系统结构图图2.1 基于单片机的电气串级调速系统原理图基于单片机的机械串级调速系统原理图图2-1双闭环控制的串级调速系统原理图----图4-1电流环动态结构图及其化简ASRnASR____n图4-2 转速闭环的动态结构图及…

在python中可以使用for作为变量名对吗_python能用一个变量的值作为另一个变量的变量名吗?...

A [零, 一, 二, 三] B [zero, one, two, three] for index, item in enumerate(A): print(变量A的赋值是 *{}*, 变量B的赋值是 *{}*.format(item, B[index])) try: print(eval(item)) except Exception as err: print(错误原因:{}.format(err)) exec({} B[index].format(ite…

关于csgo的观看录像fps低_CSGO:Ququ带队击败LQ豪取五连冠,8次MVP闪耀全场

电子竞技热点资讯&#xff0c;敬请关注老年人三旬&#xff01;自从CSGO这款游戏上市之后&#xff0c;在整个FPS领域内就一直处于顶流位置&#xff0c;这款游戏对于所有热爱射击游戏的玩家来说&#xff0c;不但是经典作品《半条命》的延续&#xff0c;更是一款对玩家要求极高的游…

计算机数学基础 刘树利,计算机数学基础课件教学课件作者刘树利11课件.ppt

计算机数学基础课件教学课件作者刘树利11课件.ppt第十一章 线性方程组 第十一章 线性方程组 后页 首页 前页 后页 首页 前页 基本要求、重点难点 11.1 线性方程组的消元法 11.2 线性方程组解的结构 11.3 线性代数的应用实例 11.4 演示与实验十 ? 基本要求 ? 理解线性方…