草庐IT

要想不踩SaaS那些坑,得先了解“SaaS架构”

华为云开发者联盟 2023-05-18 原文
摘要:围绕当下许多企业青睐的SaaS应用开发,华为云开发者技术服务工程师程泽在DTT首期带来主题为 《SaaS云原生应用典型架构》 的DTT首期直播分享。

本文分享自华为云社区《DTT直播首期精彩回顾:要想不踩SaaS那些坑,得先了解“SaaS架构”》,作者:华为云社区精选。

DTT(DTSE Tech Talk)是华为云开发者社区推出的技术公开课直播栏目,聚焦云上前沿、热门技术话题,带来技术、产品、产业等全方位的深度解读,开阔 IT 从业者视野,推动IT技术更广泛的传播、讨论和变革。

围绕当下许多企业青睐的SaaS应用开发,华为云开发者技术服务工程师程泽在DTT首期带来主题为 SaaS云原生应用典型架构 的DTT首期直播分享,以下是精彩内容回顾。

企业数字化转型,为何SaaS模式如此重要?

随着全球进入后疫情时代,数字经济重要性日益显现。SaaS作为一种有效的软件交付形式,可以让企业IT团队将工作的重心从部署和业务系统定制,转移到管理业务系统所提供的服务上来。

SaaS服务没有任何软硬件维护费用,服务模式使用非常灵活,企业花费少量的费用便能享受优质服务,让企业集中资金流进行核心业务探索与运营。SaaS是即下载即使用的服务模式,大大节省了系统构架成本。但SaaS开发过程中的各种问题,如人力成本、多租户管理、高可用、安全性等,让企业在SaaS化转型时有所顾虑。

在长期的SaaS应用上云技术支持实践中,华为云总结了企业在SaaS化转型过程中遇到的很关键的问题:

  • 基础设施选择:在什么基础设施上部署SaaS系统,是选择公有云还是自有数据中心方式?
  • 系统架构设计:SaaS系统的访问性能、运维监控、系统弹性扩容、安全性以及合规性等如何设计?
  • 数据存储架构设计:如何设计安全可靠,可灵活扩展的数据存储架构?

不仅如此,租户权限管理、租户间干扰以及多租计费策略等问题同样困扰企业转型。

一图了解SaaS多租户架构

其实,很多人对于一些SaaS技术问题还是知之甚少,例如企业在进行SaaS企业软件选型时,仍不了解“多租户”与“独立架构”是什么概念,二者之间有什么区别。

用现实中的房子例子是很好解释的。“独立架构”如同一个别墅,里面有属于自己的餐厅、房间、厨房等设施,所有设施都是独立配置、部署的;“多租户”就如同住在公寓,每个人有一个属于自己的房间,健身房、客厅等属于公共区域,大家共享这些资源。

独立部署架构在业务发展前期有比较有优势,可根据客户需求灵活配置资源量、独立部署。但随着企业增长,老的业务系统依旧存在,企业不得不面临运维效率、成本等挑战,这些挑战最终会影响到企业业务的增长和创新。为解决这个问题,系统向SaaS演进似乎是必然的选择。从SaaS应用本身来看:

与独立部署不同,在SaaS系统中,有租户概念,通常一个企业或者组织作为一个租户(Tenant),租户下会有多个用户;租户与租户之间会共享一定资源,为保证租户安全性,在租户架构设计时,会做好逻辑或者物理隔离,逻辑隔离和物理隔离也可以同时存在,如SaaS混合部署模式。在创建租户时,需要分配数据空间和配置租户路由规则,租户和租户下的用户可能有不同的权限配置,根据路由规则获取授权信息。

租户路由是SaaS应用的核心模块,当用户发起请求时,租户路由模块根据请求携带的租户ID信息,将请求路由到该用户所属租户运行环境、数据空间等。在SaaS租户隔离的逻辑下,租户路由模块是保证租户所属用户请求互不干扰的关键。华为云技术团队开发了租户路由模块,并进行了开源,可前往gitee的saas-tenant-router-starter项目了解或者贡献。

SaaS改造升级的方向通常是容器化的微服务架构,华为云企业级云容器引擎CCE可应用提供容器运行和编排环境,基于云容器引擎可以快速实现集群创建、应用部署和运维管理;在SaaS应用场景下,CCE集群可以提供集群、namespace以及pod层级的资源隔离;华为云微服务引擎CSE为SaaS应用提供微服务应用注册发现、配置下发、服务治理等能力,其中,配置下发能支持在租户创建时,配合消息总线,动态配置多租户运行环境。

在云上构建SaaS应用时,租户间隔离从应用层、数据库到基础设施层(计算、存储以及网络)都是应该关注的,在应用层我们通过租户路由插件实现租户间隔离;数据库层多租模式可支持数据库实例、数据库schema以及表字段实现隔离;在计算资源层,租户间隔离借助云容器引擎CCE的namespace和pod能力;在网络层面,可通过VPC、子网实现租户间隔离,每个租户应用可以放在一个VPC或者一个子网中,但是租户数量会受到可创建的VPC和子网配额限制。

SaaS多租户架构不仅包含SaaS基础应用,还提供了配套的 SaaS运营与运维平台。这也是相对于独立部署架构的独特优势。从SaaS运营与运维角度来看:

  • 运营方面:
    • 在技术方面,SaaS场景的租户管理面负责租户创建,配置管理,SaaS租户管理员可以在用户购买SaaS服务后,配置租户访问域名、租户管理员以及租户权限等信息;
    • 计费模式有按照用户数、活跃用户、特性+服务等级、基础版免费+增值特性付费等多种计费模式,设计优秀的计费模式能保证在租户和产品功能特性持续增加的背景下,仍然能有不错的收益;
    • 运营分析是SaaS在实现持续业务增长必不可少的内容,从技术维度看,涉及用户数据采集、数据实时处理和分析、数据可视化等内容,支持企业决策和管理。
  • 运维方面
    为SaaS系统建立可观测运维是保证良好租户、及时定位和解决用户问题的基础,包括指标监控、应用链路追踪和日志管理等;在SaaS应用系统下,在建立统一租户运维设施基础上,也需充分考虑不同租户运维需求。
    • 在系统中提供不同层级的资源监控、告警是基础的运维能力,华为云提供了完备能力,如应用运维管理AOM、云监控服务CloudEye等;
    • 租户日志管理采集可按照租户维度进行,根据上层分析需求,再做数据的统一聚合;
    • 链路追踪通常借助APM能力实现,对各个服务调用的性能、健康状态进行监控,及时做资源调整。

多种多租户架构方式,肯定有符合你的那一款

多租户架构方式,使得不同企业之间共享代码及基础设施成为可能,从而提高了代码及底层基础设施的效率,而通过这种资源使用的效率提升,更是降低了SaaS服务的运营成本。事实上,SaaS应用的成功很大程度上依赖于多租户架构。

当然,企业在考虑搭建SaaS系统时,需要优先确定哪种租户模式适合您的客户和业务特点,不同租户模式并不会影响您的业务功能,但对商业模式、技术架构、租户隔离、租户成本以及后续运维运营费用会产生影响。从租户资源共享程度来看,多租户模式可以按如图所示,分为三类:独享资源租户模式、共享资源池租户模式、混合租户模式

独享资源租户模式

每个用户单独交付部署一套环境,例如,像具有“web层-应用层-数据层”多层应用系统,每个用户得到一套独立的web层、应用层以及数据层,每一层之间互不共享,实际上是一种物理隔离模式,开发实现较为容易,但随着用户数增多,维护成本会增加,每套系统实际产生的收益会减少。

共享资源池租户模式

共享模式能提高资源利用效率,设计良好资源共享模式和商业策略将会为企业提升盈利能力;共享资源池模式下,每个用户共享相同的资源,不同用户之间采用逻辑隔离方式,为了避免租户间互不影响,在租户架构设计和开发上会有些复杂,但会带来长期的收益。由于现在多采用分层架构进行开发,为了方便展示,我们将系统架构分为三层:web层、应用层以及数据层。针对每一层级,我们根据部署情况,可以分为如下三类:

  • 全共享模式

    web层、应用层以及数据层都采用共享资源池模式部署。对于用户体验环境,可以优先考虑全共享资源池模式,但并不等同于全共享模式只适合用户体验环境使用,租户业务量稳定且对计算、内存以及数据库IO等资源需求稳定的场景,全共享模式也是合适的。

  • 数据层共享模式

    web层和应用层每个租户独立部署,但共享数据层,例如数据层的关系数据库-MySQL,可采用不同层级的逻辑隔离方式,如数据库实例、数据库database以及表级别隔离方式。对计算资源和内存资源消耗比较大的业务场景,如AI分析、大数据计算等,可以优先考虑数据层共享资源池模式,应用层可以进行物理隔离模式部署,每个租户应用层可以独享资源,互不干扰。

  • 租户应用环境共享模式

    数据层不共享,例如每个租户配置一个数据库实例,web层和应用层采用共享方式部署,共享相同的租户运行环境,如采用云容器引擎CCE集群,按业务模块部署,根据租户需求弹性扩容node节点和容器pod。对数据库IO要求比较高,应用层处理简单业务逻辑的业务场景,如OA、ERP等,可以优先考虑应用层共享资源池模式,数据层进行物理隔离模式部署,每个租户应用层可以独享资源,互不干扰,如在华为云上,可以采用不同的RDS实例进行隔离。

混合租户模式

综合独享资源模式和共享资源池租户模式特点,部分用户采用共享资源池租户模式,另一部分用户采用独享资源模式;在交付系统时,根据客户对费用、资源隔离性和安全性要求,选择对应交付模式。

一个良好设计、架构优雅的SaaS应用可以给应用提供商和客户带来双赢。华为云SaaS 服务架构帮助企业应用SaaS的过程中,真正获得交付门槛低、配置要求低、技术难度低、操作难度低、使用成本低等服务价值。

“云原生2.0”的理念下的SaaS云原生应用架构

两年前华为云率先在业界发布了“云原生2.0”的理念,推动了企业云化从“ON CLOUD”走向“IN CLOUD”,从“以资源为中心”转为“以应用为中心”。 在华为伙伴暨开发者大会2022期间,华为云宣布云原生2.0全景图全面升级。

基于长期的技术支持实践经验,华为云结合在产品和技术方面的沉淀,总结了云上典型的SaaS云原生应用架构

微服务化和容器化是应用现代化的基本特点。微服务包含两个阶段:微服务拆分和微服务开发。

  • 微服务拆分可以参考华为云微服务应用开发相关实践;微服务开发社区中提供了多种开发框架,如springcloud、servicecomb等,目前各大云厂商也提供了相关微服务引擎,如华为云CSE,与华为云CSE微服务引擎对接,提供微服务注册发现、服务治理以及配置管理等能力。开源地址:https://github.com/huaweicloud/spring-cloud-huawei。

容器化后的应用可以基于华为云容器引擎CCE部署,华为云CCE提供灵活的自动弹性伸缩、挂载多种存储类型等能力,并且能轻松对接云上应用运维能力。

在云原生的SaaS化应用系统中,除解决微服务化和容器化问题,需要考虑搭建运维监控平台,如日志处理采用ELK方案,监控告警采用Pormetheus+Grafana方案,应用链路追踪采用zipkin、skywalking等方案,但基于云上的运维能力,可以更快速搭建监控运维平台,如采用应用运维管理AOM实现运维的监控告警;云日志服务LTS实现日志采集、分析以及转储;APM实现应用链路追踪,从而构建“问题发现-问题追踪-问题定位”立体监控运维体系

对于SaaS企业而言,让平台数据发挥价值,支持企业实现“拓客-留客-增长”,建立统一的数据分析平台很重要。云原生SaaS应用架构很关键的优势在于能够容易实现数据的聚合和流转,通过集成SDK方式将日志数据、定时任务等数据上报至LTS ,业务数据库中数据可以通过DRS或者cannal开源组件抽取至kafka等消息队列中;华为云对象存储OBS提供结构化和非结构化数据存储能力,并且存储成本低,可以作为统一数据湖底座。基于统一数据湖底座和实时数据接入能力,构建SaaS云原生数据分析运营平台,同时,也支持机器学习接入。

在SaaS云原生应用架构中,开发和部署的CICD流水线可以采用云上devcloud平台能力,也可以采用Jenkins搭建,对接华为云VSS安全扫描能力和容器镜像仓库SWR,VSS能力实现web应用发布前的安全扫描;SWR作为镜像存储仓库,按照组织和版本等策略管理镜像,在CCE中可以直接加载SWR镜像,配置service、ingress等访问策略,完整应用部署。

华为云SaaS支持计划,助力企业SaaS化转型

“随着企业数字化转型的持续深耕,SaaS将会成为云计算为企业提供数字化服务的主要形式。当下,各行各业的SaaS渗透率在逐步增加,未来十年将是SaaS发展的黄金十年。” 华为云CEO张平安在华为伙伴暨开发者大会2022上表示。

为了更好的推动SaaS生态发展,在面向SaaS企业方面,华为云推出SaaS支持计划,从技术、资源、商机等维度为企业提供全生命周期的支持,助力企业创新和商业变现

为了更好的推动云原生SaaS应用开发,华为云开发者团队基于SaaS项目技术支持实践,将SaaS化经验沉淀到SaaS应用开发指导中。内容包括SaaS典型部署架构、多租户模式、多租设计、数据存储多租设计、K8S集群环境下多租设计、云上多租网络设计、分析与运营平台、计费策略设计等。可配合SaaS-housekeeper项目使用。如果您在云原生应用开发或者技术选型等过程中有任何技术问题,都可以给华为云开发者技术团队提issues,我们将及时响应您的需求。也欢迎来自企业、个人开发者参与内容贡献。

相关链接地址:

  1. 应用开发文档:文档中心
  2. 参考示例代码:HuaweiCloudDeveloper: 为开发者提供SaaS、云容器、微服务、serverless、AI等应用构建的技术参考文档、samples代码,如果您在云原生应用开发或者技术选型等过程中有任何技术问题,都可以给华为云开发者技术团队提issues,我们将及时响应您的需求。也欢迎来自企业、个人开发者参与内容贡献。
  3. 问题咨询和专家服务预约(需注册华为云账号):https://support.developer.huaweicloud.com/feedback/?ticket=ST-5385866-mPu9vjwIeAGISrz1rXBAdwt7-sso

直播回看:[SaaS云原生应用典型架构]

点击关注,第一时间了解华为云新鲜技术~

有关要想不踩SaaS那些坑,得先了解“SaaS架构”的更多相关文章

  1. ruby - 了解在 Ruby 中与 lambda 一起使用的 inject 行为 - 2

    我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject

  2. ruby-on-rails - 如何测试自己对 Ruby/ROR 的了解? - 2

    是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby​​和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T

  3. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  4. ruby-on-rails - 了解 "attribute_will_change!"方法 - 2

    我想覆盖store_accessor的getter。可以查到here.代码在这里:#Fileactiverecord/lib/active_record/store.rb,line74defstore_accessor(store_attribute,*keys)keys=keys.flatten_store_accessors_module.module_evaldokeys.eachdo|key|define_method("#{key}=")do|value|write_store_attribute(store_attribute,key,value)enddefine_met

  5. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  6. ruby-on-rails - 正确了解 Rails 框架的最佳方式是什么? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我一直在Rails上做两个项目,它们运行良好,但在这个过程中重新发明了轮子,自来水(和热水)和止痛药,正如我随后了解到的那样,这些已经存在于框架中。那么基本上,正确了解框架中所有智能部分的最佳方法是什么,这将节省时间而不是自己构建已经实现的功能?从第1页开始阅读文档?是否有公开所有内容的特定示例应用程序?一个特定的开源项目?所有的rails交通?还是完全

  7. ruby - 了解 Ruby Enumerable#map(具有更复杂的 block ) - 2

    假设我有一个函数defodd_or_evennifn%2==0return:evenelsereturn:oddendend我有一个简单的可枚举数组simple=[1,2,3,4,5]然后我用我的函数在map中运行它,使用一个do-endblock:simple.mapdo|n|odd_or_even(n)end#=>[:odd,:even,:odd,:even,:odd]如果不首先定义函数,我怎么能做到这一点?例如,#doesnotworksimple.mapdo|n|ifn%2==0return:evenelsereturn:oddendend#Desiredresult:#=>[

  8. ruby - 了解 Ruby 中赋值和逻辑运算符的优先级 - 2

    在以下示例中,我无法理解Ruby运算符的优先级:x=1&&y=2由于&&的优先级高于=,我的理解是类似于+和*运算符:1+2*3+4解析为1+(2*3)+4它应该等于:x=(1&&y)=2但是,所有Ruby源代码(包括内部语法解析器Ripper)都将其解析为x=(1&&(y=2))为什么?编辑[08.01.2016]让我们关注一个子表达式:1&&y=2根据优先规则,我们应该尝试将其解析为:(1&&y)=2这没有意义,因为=需要特定的LHS(变量、常量、[]数组项等)。但是既然(1&&y)是一个正确的表达式,那么解析器应该如何处理呢?我试过咨询Ruby的parse.y,但它太像意大利面条

  9. ruby-on-rails - 具有六边形架构和 DCI 模式的框架和数据库适配器 - 2

    我尝试用Ruby设计一个基于Web的应用程序。我开发了一个简单的核心应用程序,在没有框架和数据库的情况下在六边形架构中实现DCI范例。核心六边形中有小六边形和网络,数据库,日志等适配器。每个六边形都在没有数据库和框架的情况下自行运行。在这种方法中,我如何提供与数据库模型和实体类的关系作为独立于数据库的关系。我想在将来将框架从Rails更改为Sinatra或数据库。事实上,我如何在这个核心Hexagon中实现完全隔离的rails和mongodb的数据库适配器或框架适配器。有什么想法吗? 最佳答案 ROM呢?(Ruby对象映射器)。还有

  10. ruby - 了解 ruby 奎因 - 2

    我在维基百科上找到了这个代码块,作为Ruby中quine(打印自身的程序)的示例。puts但是,我不明白它是如何工作的。特别是,我没有得到的是,当我删除最后一行时,出现此错误:syntaxerror,unexpected$end,expectingtSTRING_CONTENTortSTRING_DBEGortSTRING_DVARortSTRING_END这些行中发生了什么? 最佳答案 语法以here-document开始,通过Perl从UNIXshell借用-它基本上是一个多行字符串文字,从之后的行开始当一行以something

随机推荐