首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >把数十万级用户SaaS服务迁移至单台服务器,研发都做了哪些努力?

把数十万级用户SaaS服务迁移至单台服务器,研发都做了哪些努力?

作者头像
腾讯云开发TCB
发布于 2024-12-27 08:45:31
发布于 2024-12-27 08:45:31
20400
代码可运行
举报
文章被收录于专栏:云开发云开发
运行总次数:0
代码可运行

面对十几万用户 SaaS 服务迁移的巨大挑战,如何在单台服务器上实现高效、稳定、安全的部署运行? 本文详细探讨了这一挑战背后的技术实践过程,包括技术架构的演进、面临的挑战及解决方案,以及最终实现的架构维度和资源维度的显著收益。通过这一创新实践,微服务数量从30+锐减至个位数,资源占用大幅下降,仅需 8C16G 即可轻松应对,为企业在成本、效率及灵活性上带来前所未有的突破。

关注腾讯云开发者,一手技术干货提前解锁👇

01、背景

1.1 前言

为了满足不同场景、不同的行业的用户诉求、以及为了满足传统行业安全合规等问题,都会要求采购的软件需要在本地化环境部署运行。在这种场景下,我们如何把公有云的 SaaS 平台服务搬迁到微搭单台服务器上?

传统的私有化是将所有服务涉及的计算+存储私有化,微搭低代码平台作为开发/运行平台,不仅承担了开发工具的职责,也承担了运行部署平台。这就意味着我们同时要把开发平台和运行部署平台都要搬迁到单台服务器上。

1.2 微搭是什么

腾讯云微搭低代码是一个高性能的低代码开发平台。免前端开发,支持一码多端,自由定制管理系统和小程序,PC/H5 应用,支持连接本地和外部数据库,支持 AI 大模型自动生成页面,快速集成各类 AI 模型,支持被集成,一条命令将系统私有部署到任意服务器。支持打通企业内外部数据,轻松创建数据分析、业务管理、消息推送、用户权限等能力的企业管理系统。快速连接腾信生态,支持原生小程序,助力企业内外部运营协同和营销管理。

02、搬迁实践

2.1 产品的形态

微搭低代码产品整体上分为两部分:设计态和运行态。

设计态:应用工作区,用来开发应用 ,把开发好的应用构建发布成物料。

运行态:应用运行环境底座,基于设计态开发好的物料,做部署安装。

2.2 技术架构

基于这种业务形态,结合我们公有云本身就是微服务的架构体系。我们快速落地了技术架构。

微搭低代码混合云的整体架构,包含基础服务、网关服务、服务控制、容器平台以及支撑组件;

  • 基础服务负责前端和后端 API 的接入,通过 DNS、LB 将用户请求分发到不同区域的控制台;
  • 网关服务负责对后端和前端流量分别进行处理;
  • 服务控制包含了所有微搭所有的服务组件(微服务粒度30+),包含权限控制,数据模型,流程,消息中心,应用管理,企业工作台管理等;
  • 支撑组件,包含 MySQLMongoDBRedis、Kafka、S3 对象存储等 。

我们架构推进过程中,也遇到了一些问题挑战:

  1. 微服务粒度30+ ,针对私有化场景下客户机器数量有限。有没有一种方案可实现可以同时支持微服务和单体架构?
  2. 公有云产品能力实时迭代,软件化这块如何与公有云保持同步

下面我们来看下,微搭在这两个挑战上是如何解决的?

03、搬迁过程中的一些挑战

3.1 架构挑战

3.1.1 架构演进

有没有一种方案可实现可以同时支持公有云的微服务和软件化可合(单体)架构?

微服务 是「可分」

单体架构 是「可合」

我们要支持公有云的架构是「可分」,私有化的架构是「可合」,并且原则是:以公有云的微服务架构为基准。

那这块我们的思路是:「可分」单个微服务可以编译成单个进程,「可合」也可以编译成子模块集成到大进程中 这样相当于把30+个进程从架构基于领域来大大进行了压缩 。

注意:这里主要是将后端服务来做合并,因为本身前端只有一个微服务进程。

3.1.2 架构方案实现

原则是:以公有云的微服务架构为基准,通过搭建一个单体应用的S pring 启动框架,通过 dependency 将微服务的 jar 引入进来,通过 @ComponentScan来排除掉各个子进程的启动类 。

只启动单体应用的进程,进而达到 N 个进程合并成1个进程的效果。

单体架构应用:没有任何逻辑,只有启动类和一个配置文件。

单体应用启动类伪代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@EnableFeignClients
@ComponentScan(basePackages = {"com.tencent.weda"},
        excludeFilters = {@ComponentScan.Filter(
        type = FilterType.ASSIGNABLE_TYPE,
        classes = {
                com.tencent.weda.WeDaBusinessApplication.class,
                com.tencent.weda.ServerApplication.class,
                com.tencent.weda.DsServerApplication.class,
                com.tencent.weda.DsAdapterApplication.class,
                com.tencent.weda.WeDaAuthServerApplication.class,
                com.tencent.weda.WedaApiServerApplication.class,
                com.tencent.weda.Application.class,                               com.tencent.weda.WedaWorkflowServerApplication.class,
                省略xxxxxxx.class
        }
)}
)
@SpringBootApplication
public class WedaApplication {

    public static void main(String[] args) {
        SpringApplication.run(WedaApplication.class, args);
    }
}

3.2 服务合并落地挑战

架构上制定了服务合并的策略,那么接下来看下服务合并存在哪些问题和挑战?

3.2.1 bean 冲突改造

如果各个业务中存在同名的bean,在 Spring 启动的时候,会基于 name 加载到 Spring 容器中,造成 Spring 启动失败 ,为了避免 Bean 冲突。

有以下处理策略:

1.每个微服务修改包名 ,基于「领域」修改包路径。例如:权限加 auth、流程加 workflow 等。

2.如果业务中存在通过之前 name 来注入 Bean 的。比如 @Bean(name="")、@Resource(name="")、@Autowired(name="") @Service(name="") @Qualifier(name="") 等,建议加上业务「领域」属性,避免冲突。

3.2.2 Feign + Consul 调用改造

我们公有云微服务之间的服务注册调用都是使用 Feign +Consul 来实现的。

由于是单体应用,软件化这块就没必要再使用 Consul 了(当然这块不是必须要修改的,不做修改也没问题。我们主要考虑是减少中间件的依赖)。因为单体应用对外提供的接口能力都是127.0.0.1, 所以需要我们把 Feign + consul 调用 ,改成 Feign + localhost (127.0.0.1)。

@FeignClient 注解默认也提供了这样的能力(在 @FeignClient 注解中,url 属性的作用是指定目标服务的 URL 地址)。

通过增加 url 属性值来制定到目标服务的 url 地址。

业务微服务 添加 url="${spring.feign.ip:}",公有云 url 默认为空(还是基于注册中心来进行选择实例),在软件化 yaml 中将该值设置为127.0.0.1:port 即可。

示例:

3.2.3 pom.xml 改造

原来公有云 pom.xml 有 dev、test、pre 和 prod 的对应的 profile,增加一个私有化所对应的 profile 节点 private,这样对公有云构建和编译也不受任何影响。

在单体流水线构建出包的时候,各个微服务的 SPRING_PROFILE=private。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn clean install -DskipTests -P$SPRING_PROFILE -s ../settings.xm

另外需要注意的地方,需要在 private 节点中移除 spring-boot-maven-plugin 的 maven plugin 和排除掉微服务中的 resources 配置文件。

(因为配置文件已经统一合并成一个了,在单体项目中引入即可)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 私有化环境
<profile>
    <id>private</id>
    <build>
         <resources>
                    <resource>
                        <directory>src/main/resources</directory>
                        <filtering>true</filtering>
                        <excludes>
                        <exclude>application.properties</exclude>
                            <exclude>bootstrap.yaml</exclude>
                            <exclude>bootstrap.yml</exclude>
                            <exclude>application.yaml</exclude>
                            <exclude>application-*.yaml</exclude>
                            <exclude>application.yml</exclude>
                            <exclude>application-*.yml</exclude>
                        </excludes>
                    </resource>
                </resources>
    </build>
<profile>

3.2.4 配置文件改造

通过制定规范来进行管控和约束。每个微服务 yaml 合并一个 yaml 。所有微服务的 yaml 针对存量的 key 统一做合并,新增的 key 统一加下微服务前缀标识来区分,确保每个微服务的 key 各不相同。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
weda.model.xxx:123
weda.auth.xxx:456
weda.connector.xxx:789

3.3 公有云的数据库 DDL 与 DML 如何自动同步到软件化中?

那么技术上如何保证公有云的数据库 DDL 与 DML 自动同步到软件化中呢?在架构上我们设计了一个旁路服务,通过定时扫描监听 公有云数据库的 DDL 与 DML 变动,形成 SQL 物料 - 自动同步到 软件化的物料包中 ,这样软件化的数据库 就能实时与公有云保持同步。

公有云还保持原来的设计和链路,软件化这块做适配。针对微服务使用不同的 database,这块软件化统一合成一个 database,由统一的 init-data 服务来完成数据库的创建和初始化。

3.4 如何简化服务运维以及功能准确性?

3.4.1 合流 + 自动化测试保障单体架构

为了保证单体应用功能的正确性,我们在公有云合流阶段做了流水线,当公有云微服务代码合并主干分支时触发「软件化应用」构建&部署 。如果部署成功,会执行自动化测试用例来提前发现私有化功能上的一些问题(通过技术手段来保证:用来检测每个微服务 yaml、Bean 要互斥,不能出现同名的 key 和同名的 Bean)。

3.4.2 服务做了合并,出问题了如何定位代码分支

下面我们再来看下服务做了合并,出问题了如何定位代码分支?如果说单体架构中某个业务模块出现问题/报错了,如何定位到其错误信息具体对应公有云的 git仓库上的 commit/代码片段?

我们在软件化出包的时候,会实时获取到每个微服务对应的 commitId(微服务出包时对应的分支/tag),实时写入/推送到固定的 git 上,业务研发同学可基于当前部署包的版本号来统一查找各个微服务对应的 commitId,从而快速定位到具体公有云微服务对应的代码片段。

04、落地成果

4.1 架构维度

从架构上来看:

我们进行架构改造实践落地后,从之前的微服务架构做了大量的服务合并,微服务数量从 30+个 变成个位数 。

4.2 资源维度

从资源维度来看:新架构下占用的机器资源大幅下降。

公有云微服务架构下30+服务,占用大量的cvm 资源,软件化的架构下由于服务做了大量合并,这块仅需 8C16G 就可以运行起来。

4.3 交付客户

我们能力上把十几万用户的公有云使用的 SaaS 服务搬到只使用1台服务器就可以部署运行,那么我们能够满足什么的客户呢?我理解有以下诉求的客户都可以考虑来使用我们。

  1. 客户机器 IDC 预算不足(机器数量有限,我们只需1台 8C16G 机器)。
  2. 私有部署开发模式,开发者可在本地服务器上使用微搭低代码本地部署管理工具进行应用开发。
  3. 有本地软件化部署的诉求 (一键部署本地化系统到任意服务器,5min 完成安装运行)。
  4. 支持多平台 小程序、web、H5。
  5. 集成企微等相关能力。

总而言之,腾讯云微搭低代码提供了应用开发的一站式低代码开发服务,从底层能力迭代至行业级方案,前后端一体可视化构建发布,让您能够完全专注于业务场景,小白也可以极速搭建出成熟、专业的应用。

05、总结

我们把十几万用户的公有云 SaaS 搬到单台服务器的实践来看,对于客户来说有以下优势:

  1. 微服务的减少让响应更快了。
  2. 新架构资源让用户投入的硬件资源更少了,成本更低了。
  3. 客户预算不足的,有跨平台应用开发需求的,应用需要本地化开发的,都可适配这个版本(而且我们再不断完善)。

当然了,也不是说软件化可合并的架构比微服务架构要好,可合并架构在运维方面相对(微服务)而言还是有些弊端。至于是在交付业务时选择软件化架构还是微服务架构,我想这块没有一个严格确切的答案。主要还是要基于业务场景来权衡利弊,在业务发展中不断探索最合适的模式。

软件设计的首要目标应该是满足业务需求,而不是为了设计而设计。如果一个设计没有为业务需求服务,那么它就是过渡设计,是没有意义的。‍

-End-

原创作者|谢艳祥

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云开发CloudBase 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
云原生-不是简单的微服务+DevOps+容器云集成
今天准备谈下云原生的概念,在前面文章里面已经对微服务,DevOps有了比较详细的一个描述和说明,对于Docker容器云网上材料比较多,因此不准备再详细去描述。
人月聊IT
2025/06/24
870
云原生-不是简单的微服务+DevOps+容器云集成
云原生技术实践-关键要素和原则
今天谈下云原生技术实践的一些关键原则和要素。对于云原生实践,在很早就有云原生12要素,本文则结合云原生12要素的一些内容,重新思考和整理企业上云或在进行云原生技术实践的时候的一些关键原则。
人月聊IT
2025/06/24
840
云原生技术实践-关键要素和原则
盘点几款支持“私有化部署”的低代码平台,看看你都用过哪一款
如果大家正在寻找支持私有化部署的低代码平台,说明大家对数据主权、安全性或行业合规性有较高要求——这在金融、医疗、军工等行业特别常见。
informat低代码
2025/06/11
4750
从微服务转回单体:服务个数从21下降到2,版本类运维量降为0
大家好,我是 anson。做过 To B 项目的开发者朋友都知道,传统行业为了满足安全合规等问题,大多会要求采购的软件需要在本地化环境部署运行。
腾讯云开发者
2023/11/10
1.2K0
从微服务转回单体:服务个数从21下降到2,版本类运维量降为0
如何优雅兼容公有云和私有化?腾讯低代码混合云「可分可合」架构值得借鉴
「架构设计」没有放之四海而皆准的方法。“软件架构不像桥梁和房屋的架构。桥梁建成后就很难改变,但软件不一样。软件一旦运行起来,我们就可以更深入地了解我们的工作负载,然后再选择一个可演进的架构,在不影响客户体验的情况下进行更改。并且我们没有强制要求特定的架构风格。我想重申,没有一种架构模式可以满足所有的情况,单体没有消亡(恰恰相反),可演进的架构也在不断变化的技术格局中扮演着越来越重要的角色。
腾讯技术工程官方号
2023/11/01
7950
如何优雅兼容公有云和私有化?腾讯低代码混合云「可分可合」架构值得借鉴
回归单体成为潮流?腾讯文档如何实现灵活架构切换
软件架构从来没有所谓的银弹,好的架构除了良好的设计,更少不了持续的迭代优化。腾讯文档在业务挑战之下,实现了一种灵活切换单体、微服务的架构设计方案,对业界同类型同场景项目具备较高可借鉴性。本文将详细介绍腾讯文档在实现单体服务和微服务切换过程中所采用的具体方法和技术,以及所取得的收益。
腾讯云开发者
2023/12/13
7600
回归单体成为潮流?腾讯文档如何实现灵活架构切换
如何选择适合你的微服务 API 网关:对比 Kong、APISIX、Trk、Apigee 和其他网关
API 网关并非一个新兴的概念,在十几年前就已经存在了,它的作用主要是作为流量的入口,统一的处理和业务相关的请求,让请求更加安全、快速和准确的得到处理。它有以下传统的功能:
温铭@APISIX
2020/02/24
4.2K1
【周末瞎想】微服务saas如何做私有化部署
在这之上构建我们的微服务体系,包括k8s、中间件、微服务、监控系统、CI/CD系统。
阿丸笔记
2023/10/30
9680
【周末瞎想】微服务saas如何做私有化部署
SaaS遇上私有化部署,如何实现高效、快捷交付?
近年来,SaaS 伴随着公有云的落地而逐渐兴起并稳步前进。随着 SaaS 产品的发展完善,市场催生出一种新的需求——能否将 SaaS 产品进行私有化部署?表面上 SaaS 专为网络交付而设计,与私有化部署似乎格格不入,然而,从市场状况来看,SaaS 产品的私有化部署却具备长期存在的价值。 SaaS 遇上私有化部署,挑战重重 调查数据显示,未来几年内,中国的私有云市场会保持 22% 的年增速,最终和公有云市场形成一个相对稳定的市场平衡。对于私有云用户来说,SaaS 产品的私有化部署能够满足其个性化定制的需求
腾讯SaaS加速器
2022/02/17
4.6K0
对企业IT系统全部迁移公有云的演进路线思考
今天重点是整理和思考下对企业IT系统全部上云的一些关键点思考,当然IT全部上云本身也是云原生解决方案要解决的一个重点内容。对于企业遗留系统迁移上云是一个相当复杂的主题,一篇文章肯定无法讲清楚,包括我自己也需要在整理过程中进行相关内容学习和细化。
人月聊IT
2025/06/24
700
对企业IT系统全部迁移公有云的演进路线思考
微服务架构深度解析微服务定义是什么?微服务与云原生有何关联?
微服务的概念来源于Martin Fowler 的一篇知名博文 :MicroServices。在博文中,“微服务架构”这个术语用来描述一种将软件应用程序设计为可独立部署的服务套件的特定方式。
愿天堂没有BUG
2022/10/28
8040
微服务架构深度解析微服务定义是什么?微服务与云原生有何关联?
单体到微服务架构服务演化过程
在 Web 应用程序发展的早期,大部分工程是将所有的服务端功能模块打包到单个巨石型(Monolith)应用中,譬如很多企业的 Java 应用程序打包为 war 包,最终会形成如下的架构:
架构狂人
2023/09/28
4810
单体到微服务架构服务演化过程
应用架构演化进程
那么应用架构主要有哪些阶段呐?这里作者凭着自己的理解粗糙的讨论一下。算是对这个问题的一种探索吧!
写一点笔记
2022/08/11
3890
利用 Jenkins Pipline 来编排 DevOps 工具链
讲师 | 林栗 编辑 | 黄晓轩 讲师简介 林栗 Micro Focus DevOps工程师 擅长组织级持续集成架构设计与实施,专注于软件配置管理、DevOps 领域十余年,对 CMMI、Agile 与 DevOps 有切肤之体会与感人之经验,依然乐此不疲的自我迭代中。 前言 我今天跟大家分享的话题是:利用 Jenkins Pipline 来编排 DevOps 工具链,把我们的产品部署到任何地方。主要内容分成三块: 第一个我会简单介绍一下我们公司的敏捷和 DevOps 转型; 第二个简单介绍一下
DevOps时代
2018/04/17
2.2K2
利用 Jenkins Pipline 来编排 DevOps 工具链
漫谈何时从单体架构迁移到微服务?
对于项目起步阶段,单体是最高效也是最节省成本的方式。因为初期阶段,由于人力,成本,业务熟悉程度,微服务技术积累等因素,如何过度设计可能工期和复杂度会急剧上升,造成交付困难,问题百出,从而错过了时间窗口。最合适,简单的方式还是单体优先,这是创业公司的特点决定的。当然设计面向微服务的单体架构也是一种聪明的方法,这遵守了系统演化的法则。
纯洁的微笑
2019/09/05
6080
日均服务调用超65万亿!腾讯是怎么做云原生微服务治理的?
云原生时代,越来越多的企业借助于微服务与容器化,来提升业务弹性与研发效率。在服务治理的道路上,我们也吸取各家之所长打磨了相关的产品。本次分享以腾讯微服务架构建设为主,介绍了 TCS/TSF、北极星(PolarisMesh)和微服务治理方面的实践经验,以及在企业的相关落地案例。
腾讯云开发者
2024/12/03
9670
日均服务调用超65万亿!腾讯是怎么做云原生微服务治理的?
云计算网络技术内幕 (23) 向云原生进军 (上)
在前几期,我们从容器基本原理讲到了容器网络的开源社区实现、容器网络的大型公有云实现以及私有化容器平台实现。实际上,与大型公有云同构的私有化容器平台,如腾讯TCS等,被赋予了一个更重要的使命——企业云原生平台。
用户8289326
2023/09/06
2390
云计算网络技术内幕 (23) 向云原生进军 (上)
微服务、容器、DevOps的三角恋
单体应用拆分成多个微服务后,虽能实现快速开发迭代,但带来更大测试和运维部署的成本。
JavaEdge
2021/02/23
5440
微服务、容器、DevOps的三角恋
无门槛,一键交付企业级容器平台:3节点、3步骤、3小时
腾讯专有云PaaS平台Tencent TCS(Tencent Cloud-native Suite)为企业云原生转型提供一站式解决方案,涵盖容器、微服务、消息中间件以及数据库等核心能力,适用于云原生PaaS平台、容器与微服务平台、边缘计算等关键场景。
腾讯专有云
2025/06/15
1640
无门槛,一键交付企业级容器平台:3节点、3步骤、3小时
腾讯云副总裁沙开波:坚定自研,打造公私同源的云服务
5月16日,在腾讯全球数字生态大会广州峰会上,腾讯云副总裁沙开波表示,腾讯云坚定自研战略,坚持公私同源的技术路线,为客户提供行业领先的性能和稳定性。谈及融合创新,沙开波表示,腾讯云将聚焦软件层能力,在硬件支持上保持开放,不会绑定任何单一的硬件,积极推进软硬件深度适配。
腾讯专有云
2025/05/21
1740
腾讯云副总裁沙开波:坚定自研,打造公私同源的云服务
推荐阅读
相关推荐
云原生-不是简单的微服务+DevOps+容器云集成
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档