springcloud多租户灰度设计(代码片段)

isea533 isea533     2022-12-07     248

关键词:

需求

SaaS微服务环境中,每个租户都有自己独立的数据库,当应用服务升级时(通常数据库表结构或数据需要同步改动时),需要保证升级后的租户能够使用升级后的应用服务,没有升级的租户仍然使用旧版本的服务。

前端灰度参考: OpenResty实现按租户灰度发布

环境

框架使用 Spring Cloud(不带 Alibaba,抛弃 Dubbo 了)。

运行环境为 K8s 集群。

设计

K8s 中的部署名(deploy)和 Spring Cloud 服务名(spring.application.name)相同,有小bug补丁更新时直接替换部署的镜像,版本不变,此时可以通过让实例数的滚动更新可控即可实现另一个概念上的灰度更新(不涉及后端库的变化,不需要针对租户区分)。

当有大的更新时,原有部署仍然保留,假设原服务为 cloud-system-v1。此时会创建新的部署,服务名可以是 cloud-system-v1.1 版本,此时同时运行了两个版本的服务,新版本暂时没有人使用。

当给指定租户数据库升级完成后,需要让租户能使用对应的新版本,首先需要控制好网关的路由,通过网关访问后端服务时能够选择正确的版本。其次是服务间调用时,需要能够调用到正确的版本。

网关

前端请求后端时,可以在请求头中带上租户信息,也可以在网关中根据访问用户获取租户信息后追加到请求头中,网关负载均衡到后端服务时查看租户应用的版本配置,存在配置时根据配置进行路由。

服务间Feign调用

服务间Feign调用时需要定义 Feign 接口,接口上会指定服务名,假设存在 A,B 两个服务,B存在v1和v2两个版本,A只有一个服务,A调用B时需要能够选择版本,在 A 中定义 B 中的 Feign 接口时指定服务名为 B,此时在服务发现 DiscoverClient 中通过 B 无法找到任何可用的实例,这一步可以简单改造,增加一个自定义的服务注册发现客户端:

  1. 获取所有服务名
  2. 根据 B 作为前缀过滤出 B-v1, B-v2 两个服务
  3. 将 v1, v2 所有实例都获取到,交给后续的负载均衡处理

服务发现中获取不到请求信息,不在这里根据租户版本进行过滤

上面的操作首先解决了获取实例的问题,后续在 Spring Loadbalance 中根据租户配置的版本选择一个实例即可,通过下面方式配置一个 LB:

@LoadBalancerClients(defaultConfiguration = LbConfig.class)

LbConfig 中提供一个 Bean 的实现:

@Bean
public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(
       Environment environment,
       LoadBalancerClientFactory loadBalancerClientFactory) 
    String serviceId = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
    ObjectProvider<ServiceInstanceListSupplier> 
           serviceInstanceListSupplierProvider
               = loadBalancerClientFactory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class);
    return new ReactorServiceInstanceLoadBalancer() ...
      

在这里面可以获取请求头,然后选择租户版本进行过滤。

在获取请求头时还需要针对 Feign 进行处理,默认新请求是不会传递请求头的,需要通过 Feign 拦截器传递(参考 Spring Cloud Alibaba 本地调试方案)。

实现了这两大块就能支持按租户的灰度访问了。

配置租户服务版本

上面的主要流程解决后,剩下的这个问题就简单了,可以提供简单的界面配置,也可以在升级过程中通过 API 调用设置新版本。

全部已升级到最新版本

等所有租户都升级到最新版本后,低版本的服务就可以去掉了。

此时可以保留所有租户服务的版本配置,也可以清空所有版本配置,同时通过全局的默认服务版本进行控制。

springcloud多租户灰度设计(代码片段)

...端灰度参考:OpenResty实现按租户灰度发布。环境框架使用SpringCloud(不带Alibaba,抛弃Dubbo了)。运行环境为K8s集群。设计K8s中的部署名(deploy)和SpringCloud服务名(spring.application.name)相同,有小bug补... 查看详情

springcloudalibaba前后端分离多租户saas企业开发架构技术选型和设计方案(代码片段)

        基于SpringCloudAlibaba分布式微服务高并发数据平台化(中台)思想+多租户saas设计的企业开发架构,支持源码二次开发、支持其他业务系统集成、集中式应用权限管理、支持拓展其他任意子项目。一、架构技术选型... 查看详情

libra-platform微服务平台之全链路蓝绿灰度发布(代码片段)

1、Libra-Platform微服务平台Libra-Platform微服务平台。基于SpringCloud(2020.0.x)+SpringCloudAlibaba(2021.x)+SpringBoot(2.4.x)+Vue3开发,基于多租户SaaS模式的设计,拥有强大的用户中心,权限基于RBAC设计,支持全链路蓝绿 查看详情

java版springcloud+springboot+redis多租户社交电子商务平台断路器监控(hystrixdashboard)(代码片段)

b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.在我的第四篇文章断路器讲述了如何使用断路器,并简单的介绍了下HystrixDashboard组件,这篇文章更加详细的介绍HystrixDashboard。一、HystrixDashboard简介在微服务架构... 查看详情

云平台-多租户技术设计(代码片段)

...技术方案实现共享数据库,共享数据架构设计原则1、租户间是资源隔离的。相互无法访问对方的数据。2、组织也是一种资源,各租户都有自己的组织。3、租户可以通过组织进行资源划分。4、租户不支持多层级,租... 查看详情

云平台-多租户技术设计(代码片段)

...技术方案实现共享数据库,共享数据架构设计原则1、租户间是资源隔离的。相互无法访问对方的数据。2、组织也是一种资源,各租户都有自己的组织。3、租户可以通过组织进行资源划分。4、租户不支持多层级,租... 查看详情

saas架构模式下的多租户系统设计(代码片段)

...而且任何的定制化都通过修改配置来实现。第2级(多租户[multi-tenant]、高层建筑[Hi 查看详情

4种多租户数据库设计方案对比及思考,一文全讲透(代码片段)

...、方案选型五、引申问题的解决方案六、写在最后前言多租户是SaaS(Software-as-a-Service)下的一个概念,意思为软件即服务,即通过网络提供软件服务。SaaS平台供应商将应用软件统一部署在自己的服务器上,客... 查看详情

springcloudalibaba+mybatis+elementui前后端分离分布式微服务高并发数据平台化(中台)思想+多租户saas企业开发架构技术选型和设计方案(代码片段)

     基于SpringCloudAlibaba分布式微服务高并发数据平台化(中台)思想+多租户saas设计的企业开发架构,支持源码二次开发、支持其他业务系统集成、集中式应用权限管理、支持拓展其他任意子项目。一、架构技术选型 核... 查看详情

架构02-构建多租户(代码片段)

01-什么是多租户:多租户应用是指一个应用同时服务于多个独立的租户(用户、客户、组织等),每个租户的数据都是隔离的。开发多租户应用需要在架构设计、数据存储、权限管理等方面做一些特殊处理。以下是一些建议,可... 查看详情

springcloud构建全球多租户分布式微服务部署的方案

参考技术A最近在用springcloud分布式微服务云架构做一个全球多租户分布式部署的方案,我在这里只是简单的记录,当前的架构图只能是一个大概的方案,具体实施的方案和细节,IT老铁们可以自己去揣摩,因为业务链不同,细节... 查看详情

openresty实现按租户灰度发布(代码片段)

K8s上的一套SaaS服务,每个租户都有自己的独立数据库,前后端分离,后端微服务,前端Nginx。当SaaS服务升级的时候,需要按照租户逐个进行升级,因此升级过程中需要逐步将租户迁移到新的服务上,后... 查看详情

多租户改造(代码片段)

一、多租户概念1.多租户是什么意思?怎么理解?​多租户是一种单个软件实例可以为多个不同用户组提供服务的软件架构。在云计算中,多租户也可以指共享主机,其服务器资源将在不同客户之间进行分配。与... 查看详情

多租户通用权限设计(基于casbin)(代码片段)

多租户通用权限设计(基于casbin)所谓权限控制,概念并不复杂,就是确认某个操作是否能做,本质上仅仅就是个bool判断.权限几乎是每个系统必不可少的功能,和具体业务结合之后,在系统中往往表现的非常复杂和难于控制,很大部分原... 查看详情

springcloud优雅下线以及灰度发布(代码片段)

文章目录前言优雅下线常见的下线方式优雅的下线方式灰度发布蓝绿部署滚动部署金丝雀部署前言在生产环境中,如何保证在服务升级的时候,不影响用户的体验,这个是一个非常重要的问题。如果在我们升级服务的... 查看详情

什么是多租户saas架构设计

本文来说下什么是多租户saas架构设计文章目录概述多租户架构多租户,多组织,用户区别多租户和多组织租户和用户SaaS应用和PaaS平台的多租户多租户架构设计和资源隔离共享资源时候的资源隔离多租户下的资源计费多... 查看详情

springmvc+hibernate动态切换数据源实现多租户数据分离(代码片段)

需求我们为客户开发了移动端应用,基于数据安全性的考虑,需要将业务数据按照数据库隔离的方式进行设计。数据库架构数据库设计说明master数据库用于基础数据的管理和综合业务查询–基础数据包括:用户、角色... 查看详情

servicestack多租户的实现方案(代码片段)

以SqlServer为例子说明ServiceStack实现多租户,在SqlServer中创建4个Database:TMaster、T1,T2,T3,为了安全起见每个Database不用sa账号,而是用独立的数据库的账号和密码,为了方便演示这密码设置成一样租户TMasterDatabase:TMaster 账号... 查看详情