戳蓝字“CSDN云计算”关注我们哦!


转自:  孤独烟

引言

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框架,动态选择数据源的问题!我以国内流行的hibernatemybatis来进行说明!
(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地址都给你贴出来了:
https://mp.baomidou.com/guide/dynamic-datasource.html

ps:我只能给你点一下思路,自己去查。因为具体如何配置,都可以写一篇文章!我很不爱写这种贴配置的文章,觉得含金量不高,所以大家根据我的思路去实现即可!

方式三

每个租户有共享的服务和共享的数据库!
这个在生产上一般是这么做,如下所示

如图所示,用户在请求的时候会经过网关,网关将数据转发给用户服务!用户服务根据tenant_id确定操作数据库中的哪一行记录!
老规矩,和你们说一下在ORM中难点在哪!以mybatis为例,所有的sql上都要加一句

AND t.tenant_id = ?

是不是觉得很麻烦?怎么解决呢?
(1)hibernate方式
利用hibernate filter配置, OR-Mapping配置文件使用Filter,可以在进行数据查询时自动过滤数据!
如下所示

<class name="User" table="user_tb">
    //省略
    <filter name="tenantFilter" condition="tenant_id = :tenantFilterParam" />
</class>

ps:看不懂的童鞋略过,懂hibernate的童鞋自然懂这个配置!
(2)mybatis方式
mybatis中有一个东西叫做自定义Interceptor,可以拦截出你要执行的sql,然后动态拼上你的租户条件即可!
嫌麻烦?
OK,介绍你一个插件叫mybatis plus可以实现这种多租户的更改,可以动态的解析出sql,增加上条件!
API地址都给你贴出来了:
https://mp.baomidou.com/guide/tenant.html

总结

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

福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

2、公众号后台回复:工具,获取开源云监控工具详细资料!

推荐阅读:

  • 女神节 | 那些奋斗在IT领域的“女神”们

  • 云漫圈 | 如何给女朋友解释什么是HTTP

  • 趣挨踢 | 跳槽季,让我们一起攻克算法吧!

  • 互联网没有春天

  • 学 Python 没找对路到底有多惨?| 码书

  • 这份“插件英雄榜Top20”才是Chrome的正确打开方式!

  • 剧情反转! 创始人去世事件再爆新料, 1.8亿美元难道去了天堂?

喜欢就点击“好看”吧

云漫圈 | 谈谈怎么做【服务隔离】相关推荐

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

    来源于公众号孤独烟 , 作者孤独烟 引言 OK,如下图所示 那显而易见,做服务隔离的目的就是避免服务之间相互影响.毕竟谁也不能说自己的微服务百分百可用,如果不做隔离,一旦一个服务出现了问题,整个系统的 ...

  2. 云漫圈 | 什么是微服务?

    戳蓝字"CSDN云计算"关注我们哦! 作者:小灰 来源:程序员小灰 单体架构的痛点 缺点一:项目过于臃肿当大大小小的功能模块都集中在同一项目的时候,整个项目必然会变得臃肿,让开发者 ...

  3. 云漫圈 | 女生适合做程序员吗?

    戳蓝字"CSDN云计算"关注我们哦! 转自:程序员小灰   女生适合做程序员吗?这是IT行业常常讨论的话题. 以小灰的观点,在这个平等自由的时代,女生绝对是非常适合做程序员!在IT ...

  4. 谈谈怎么做【服务隔离】

    本文转载自公众号  孤独烟 引言 OK,如下图所示 那显而易见,做服务隔离的目的就是避免服务之间相互影响.毕竟谁也不能说自己的微服务百分百可用,如果不做隔离,一旦一个服务出现了问题,整个系统的稳定性都 ...

  5. 看懂架构设计中的服务隔离

    前言 我们在做系统架构设计的时候,经常离不开的一个话题就是进行服务的隔离设计. 那什么是「服务隔离」呢? 顾名思义,它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖.当有 ...

  6. 使用Consul做服务发现的若干姿势

    作者:波斯码 来源:http://blog.bossma.cn/consul/consul-service-register-and-discovery-style/?hmsr=toutiao.io& ...

  7. re.containerbase.startinternal 子容器启动失败_微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)...

    走过路过不要错过 点击蓝字关注我们 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程.平台提供基础设施.中间件 ...

  8. 云平台圈地须群攻莫单打

    DT(数据处理技术)时代无云不互联,尚在初级阶段的云计算领域已群雄并起,封地之争无处不见,如何更有效地圈地占市场,乐视云CEO吴亚洲认为,必须是开放全资源上阵群攻,而不能保守的只搞业务合作. &quo ...

  9. 谈谈SOA面向服务体系架构的安全问题

    谈谈SOA面向服务体系架构的安全问题 本文我们讨论的是面向服务体系架构(SOA)的安全应用.在展开讨论之前,首先让我们来解析面向服务体系架构的实际含义.面向服务体系架构是一种涉及若干以服务为导向的应用 ...

最新文章

  1. Oracle递归查询
  2. javaweb功能模块如何合理设计_产品设计:如何设计出合理的凑单模式?
  3. stm32f102 SPI口重复初始化引起的问题及解决办法
  4. redis set数据类型常用命令及应用场景
  5. QT绘制百分比条形图。
  6. 40无法u盘启动_戴尔主板bios设置u盘启动 戴尔台式电脑如何bios设置U盘启动教程...
  7. info testing mysql_SQLMASQLMAP中文说明(linux版本)
  8. python matplotlib相关 dateutil
  9. 说说如何在 Spring 框架中使用 SpEL 表达式
  10. 剑指offer面试题[9-1]-跳台阶
  11. Linux静态库、动态库的制作
  12. 编码——隐匿在计算机软硬件背后的语言
  13. 提高Office2010等高版的启动速度文章链接收集-Office2010打开慢速度怎么办?
  14. hibernate的HQL查询部分属性
  15. EIGRP路由协议实现网络互联
  16. python五子棋双人对弈_基于python的socket实现单机五子棋到双人对战
  17. 锐浪报表 Grid++Report PrintPreview 显示模式
  18. UMTS与WCDMA
  19. Matlab RGB 颜色对照表(0-1之间取值)
  20. GuLi商城-简介-项目介绍、分布式基础概念、微服务架构图

热门文章

  1. 分解连续自然数的和_小学奥数各年级经典题解题技巧大全——分解因数法(2)...
  2. java方法不可覆盖_详解Java构造方法为什么不能覆盖,我的钻牛角尖病又犯了.......
  3. python脚本式编程_Python编程入门(一)
  4. python赋值的数组无序怎么办_Python的多维空数组赋值方法
  5. 重磅!13所985高校,成立大学联盟!
  6. 中国500多名理工科研究生被美国拒签!美国「制裁清单」影响开始深入校园!...
  7. 知乎高赞:自控力极差的人如何自救?
  8. 任正非签发最新电邮:管理者的18种堕怠行为
  9. 清华网红自行车火了!背后是登在《自然》上的黑科技
  10. html带正方形项目列表,5种简单实用的css列表样式实例,可以直接用到项目中。...