【原创】谈谈怎么做服务隔离

引言

OK,如下图所示

那显而易见,做服务隔离的目的就是避免服务之间相互影响。毕竟谁也不能说自己的微服务百分百可用,如果不做隔离,一旦一个服务出现了问题,整个系统的稳定性都会受到影响!
因此,做服务隔离是很有必要的。那么怎么隔离呢?有如下两种方式

  • 种类隔离
  • 用户隔离

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

正文

种类隔离

其实按照服务种类隔离要从两个纬度来说:即服务提供方服务调用方
假设我们一个系统有三个服务:订单服务,库存服务,支付服务!有如下调用关系:

OK,我们先明确一点,上面有几个服务扮演服务提供方的角色?
一共是三个:支付服务(给用户提供服务)、库存服务(给支付服务提供服务)、订单服务(给支付服务提供服务)

有几个服务扮演服务调用方的角色?
一共是一个:支付服务(调用订单服务和库存服务)

针对服务提供方这个角度而言,怎么做隔离呢?
很简单,每一个服务乃至其对应的数据库,给一个服务器部署就行!这样某个服务出现了故障,就不会相互影响,达到一种物理层面上的隔离!

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

针对服务调用方这个角度而言,怎么做隔离呢?
OK,先明白一点,服务调用方不做隔离会出现什么情况?如图所示

一个请求过来,占用支付服务中的Tomcat的一个线程。然后,该线程去顺序调用订单服务和库存服务!那么,一旦库存服务出问题了,这个Tomcat的线程就一直卡在那,无法返回!与此同时,页面上源源不断的有请求过来,会把Tomcat里头的线程池资源全部消耗完毕!对于后面的请求,Tomcat就无法响应!
因此,如果不针对被调服务做服务隔离,一个被调服务出问题,就将导致调用方服务不可用!

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

OK,如果此时库存服务不可用了呢?
库存服务线程池会被迅速塞满,此时后面进来的新请求发现库存服务线程池满啦,于是乎就不去调库存服务,直接返回!如下图所示

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

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

用户隔离

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

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

这里的可以这么理解:用户根据一定的特征去做分组,比如是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

总结

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

原文地址:https://www.cnblogs.com/rjzheng/p/10360454.html

时间: 2024-11-09 17:51:09

【原创】谈谈怎么做服务隔离的相关文章

为什么架构设计要进行服务隔离?

前言 我们在做系统架构设计的时候,经常离不开的一个话题就是进行服务的隔离设计. 那什么是「服务隔离」呢? 顾名思义,它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖.当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体的系统服务. 其实隔离设计并非软件行业独创,它是借鉴于造船行业. 如上图,造船行业有一个专业术语叫做「舱壁隔离」.利用舱壁将不同的船舱隔离起来,如果某一个船舱进了水,那么就可以立即封闭舱门,形成舱壁隔离,只损失那一

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

前言 我们在做系统架构设计的时候,经常离不开的一个话题就是进行服务的隔离设计. 那什么是「服务隔离」呢? 顾名思义,它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖.当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体的系统服务. 其实隔离设计并非软件行业独创,它是借鉴于造船行业.行业有一个专业术语叫做「舱壁隔离」.利用舱壁将不同的船舱隔离起来,如果某一个船舱进了水,那么就可以立即封闭舱门,形成舱壁隔离,只损失那一个船舱,其他船

谈谈软件的服务模式

软件服务是一种把管理软件和实施服务一体化打包的软件服务模式,在目前的市场上主流软件服务有五种模式. 一是以开发和销售为主的外包模式; 第二种是IaaS(Infrastructure-as-a-Service),基础设施即服务; 第三种是PaaS(Platform-as-a-Service)平台即服务; 第四种是注重通讯的CaaS(Communications-as-a-Service),协作即服务, 第五种是SaaS(Software-as-a-Service),软件即服务. 其实还可以再细度划

【Hystrix】实现服务隔离和降级

一.背景 1.1 服务熔断 1.2 服务降级 1.3 服务隔离 1.4 总结 二.使用Hystrix实现服务隔离和降级 2.1 Hytrix 简介 2.2 线程池方式 2.3 信号量 三.项目搭建 3.1 订单工程 1. 引入Maven依赖 2. Service 3.Controller 4.工具类 3.2 会员工程 四.项目源码 一.背景 在今天,基于SOA的架构已经大行其道.伴随着架构的SOA化,相关联的服务熔断.降级.限流等思想,也在各种技术讲座中频繁出现. 伴随着业务复杂性的提高,系统的

windows中的服务隔离 service isolation and service SID(Virtual Account)

windows 中的服务隔离在windows vista 以及server 2008之后就有了,可以让管理员控制本地资源的使用(如文件.注册表等等).之前windows版本中,系统内置了一些高权限的服务账号,大家所熟悉的有Local System,Network,LocalService 为了最小化权限使用,通常我们需要创建账号来赋予最小权限,然后配置服务以这个账号运行,但是如果服务较多,那么有许许多多的账号要维护,而且如果你有严格的密码策略的话,比如定期要更改服务账号的密码,那真是头疼. wi

我们能提供基于JSP的网站设计帮做服务,联系我们

一. 一.服务项目服务流程二. 毕业将至,答辩难过.而我们提供基于java,基于web,基于ssh,基于ssm,基于j2ee的管理系统的设计与实现之类的题目的作品代做服务.三. 四. 二.通过扣·扣联系我们之后,我们可以根据您提供的作品设计要求来商定价格,然后×××,商定之后即刻开工,作品完成之后我们将发给您验收,满意合格之后再付款即可.五. 六. 三.联系我们七. 我们口.口.号:1.0.3.2.3.7.1.2.1八. 九. 代写java毕业设计,买javaee毕业设计,ssh毕业设计代写,找

谈谈我对服务熔断、服务降级的理解

伴随着微服务架构被宣传得如火如荼,一些概念也被推到了我们面前(管你接受不接受),其实大多数概念以前就有,但很少被提的这么频繁(现在好像不提及都不好意思交流了).想起有人总结的一句话,微服务架构的特点就是:“一解释就懂,一问就不知,一讨论就吵架”. 其实对老外的总结能力一直特别崇拜,Kevin Kelly.Martin Fowler.Werner Vogels……,都是著名的“演讲家”.正好这段时间看了些微服务.容器的相关资料,也在我们新一代产品中进行了部分实践,回过头来,再来谈谈对一些概念的理解

做服务端开发所需要的知识

网上流传一篇文章叫<Linux C++服务器端开发技术>,也就是做Linux C++开发需要哪些技术,内容如下 1.基本知识:掌握C/C++语法,熟悉STL标准库.ACE库.Boost库. 2.应用技能:多线程编程.网络编程.Oralce数据库.内存管理.正则表达式. 3.内功修炼:算法与数据结构.操作系统.软件工程.数据库原理.设计模式. 4.综合素质:沟通能力.表达能力.人际交往能力.英文阅读能力. 5.工具使用:GDB.GCC.Makefile.单元测试.SVN版本管理.UML. 6.其

如何使用Vue2做服务端渲染

花费了一个月时间,终于在新养车之家项目中成功部署了vue2服务端渲染(SSR),并且使用上了Vuex 负责状态管理,首屏加载时间从之前4G网络下的1000ms,提升到了现在500-700ms之间,SSR的优势有很多,现在让我来跟你细细道来. 技术栈 服务端:Nodejs(v6.3) 前端框架 Vue2.1.10 前端构建工具:webpack2.2 && gulp 代码检查:eslint 源码:es6 前端路由:vue-router2.1.0 状态管理:vuex2.1.0 服务端通信:axi