高效降本|深度案例解读 Koupleless 在南京爱福路的落地实践

news2024/11/19 9:32:30

15ec3fb13ee5013d607e90d5b6b1ef35.gif

文|祁晓波

南京爱福路汽车科技基础设施负责人

主要研究微服务、可观测、稳定性、研发效能、Java 中间件等领域。

本文 4812 字 阅读 12 分钟

Koupleless(原 SOFAServerless)自 2023 年开源以来已经落地了若干企业,这些企业也见证了从 SOFAServerless 到 Koupleless 的品牌&技术能力迭代升级。随着 Koupleless 1.0 的重磅发布,一些企业已经在内部取得了不错的效果,例如南京爱福路汽车科技有限公司。

南京爱福路汽车科技有限公司和大多数科技企业一样,在企业生产开发过程遇到了微服务的一些问题,例如资源成本过高、启动慢等问题。在看到 Koupleless 项目正不断开源出实实在在的能力和案例,在解决很实际的微服务痛点问题,决定采用 Koupleless 进行尝试,并随着 Koupleless 一路走来,已经将 6 个应用合并成 1 个应用大幅降低资源成本,取得了不错的效果。

01

背景

南京爱福路汽车科技有限公司(以下简称爱福路)作为行业 top 的汽车后市场解决方案提供商,为维修门店提供智慧管理系统、为行业提供维修应用大数据,致力于成为汽车后市场数智化构建者。

30cfec0594e83f0e3f10bd6787bda302.png

随着其服务的企业增多,爱福路也越来越多地接触到了各类体量的企业。

这就对爱福路的服务提供形式提出了较多不同的诉求:除了单纯的公有云 SAAS 之外,还包括私有化部署等解决方案的诉求。

02

问题提出

我们知道,随着微服务和云原生技术的普及,应用数量急剧膨胀。

350fd9603d67b4b478f56017e71cba19.png

如此多的应用也带来了比较大的成本问题。

爱福路在为海量公域客户提供服务的时候,更关注稳定、弹性。

但是在为某个客户提供独立部署方案时,爱福路发现如此多的服务在部署到 K8s 时所带来的服务器成本非常高(通常来说,独立部署服务面向的客户群体比之公域客户少了 1-2 个数量级),而单个客户也很难有足够的预算负担整个部署方案。这就大大阻塞了爱福路后续持续拓展私有化部署客户的进度。

举个例子:一个应用在进行 K8s 交付时,最少会提供两个副本;而大量这样的 Java 应用存在对于整体的集群利用率不高,继而造成较高的成本。

因此爱福路面临着如下的课题:当进行私有化交付时,如何能够更便捷地、低成本地交付我们现有的产物?

其中,低成本至少应该包含如下几个角度:

1、既存代码的低成本改造;

2、新的交付方式低成本的维护;

3、运行产物低成本的 IT 成本。

37df9efdf175b5656e6c2bdc85bc6d51.png

03

问题探索和推导

爱福路基于当前的微服务架构和云原生方式进行了思考和探索:是否到了爱福路微服务架构进一步升级的时候了?

在当前整体降本增效的大环境趋势中,在保持服务稳定的前提下对于服务器有更加极致的使用。

从业务视角来看,服务单店的整体服务器成本越低,爱福路的竞争力就越强。

那么,有没有可能在保持 Java 的生态环境下,低成本的同时能够保证爱福路继续享受云原生的红利?爱福路做了如下推导:

bff1c0b62f2d722fdc3ea0812982f508.png

通过上述的推导,爱福路判断也许「模块化+Serverless」将是一种解法。

因此一款来自蚂蚁的开源框架成为他们重点的关注,那就是 Koupleless(阅读原文可跳转官网地址:https://koupleless.io/user-cases/ant-group/)

当然一个重要原因是蚂蚁开源一直做得不错,社区也比较活跃。除了社区群和 GitHub 之外,PMC 有济也积极地建立了独享的 VIP 群进行专门对接。

04

Koupleless(原SOFAServerless)

5abd51323a4d9b38887f56227530228b.png

Koupleless 技术体系是在业务发展、研发运维的复杂性和成本不断增加的情况下,蚂蚁集团为帮助应用又快又稳地迭代而决定研发,从细化研发运维粒度和屏蔽基础设施的角度出发,演进出的一套低成本接入的「模块化+Serverless」解决方案。

核心方式是通过类隔离和热部署技术,将应用从代码结构和开发者阵型拆分为两个层次:业务模块和基座,基座为业务模块提供计算环境并屏蔽基础设施,模块开发者不感知机器、容量、中间件等基础设施,专注于业务研发帮助业务快速向前发展。

合并部署降成本

在企业中, “80%” 的长尾应用仅服务 “20%” 的流量,蚂蚁集团也不例外。

在蚂蚁集团存在大量长尾应用,每个长尾应用至少需要 预发布、灰度、生产 3 个环境,每个环境最少需要部署 3 个机房,每个机房又必须保持 2 台机器高可用,因此大量长尾应用 CPU 使用率不足 10%。

通过使用 Koupleless,蚂蚁集团对长尾应用进行了服务器裁撤,借助类委托隔离、资源监控、日志监控等技术,在保证稳定性的前提下,实现了多应用的合并部署,极大降低了业务的运维成本和资源成本。

dc34708c31802d9a445b2f53cf12bf2d.png

此外,采用这种模式,小应用可以不走应用申请上线流程,也不需要申请机器,可以直接部署到业务通用基座之上,从而帮助小流量业务实现了快速创新。

2023 年底 SOFAServerless 品牌全新升级为 Koupleless(GitHub页面:https://github.com/koupleless/koupleless)

企业里不同业务有不同的发展阶段,因此应用也拥有自己的生命周期。

536232ce5cb8cef264ae512d282a9fc4.jpeg

  • 初创期:一个初创的应用一般会先采用单体架构

  • 增长期:随着业务增长,应用开发者也随之增加。此时您可能不确定业务的未来前景,也不希望过早把业务拆分成多个应用以避免不必要的维护、治理和资源成本,那么您可以用 Koupleless 低成本地将应用拆分为一个基座和多个功能模块,不同功能模块之间可以并行研发运维独立迭代,从而提高应用在此阶段的研发协作和需求交付效率。

  • 成熟期:随着业务进一步增长,您可以使用 Koupleless 低成本地将部分或全部功能模块拆分成独立应用去研发运维。

  • 长尾期:部分业务在经历增长期或者成熟期后,也可能慢慢步入到低活状态或者长尾状态,此时您可以用 Koupleless 低成本地将这些应用一键改回模块,合并部署到一起实现降本增效。

119fc8cafece20a06a33f40d719328fe.png

应用生命周期演进

可以看到 Koupleless 主要通过将应用模块化来降低整个服务的运行成本,更值得称道的是支持模块和应用的来回切换,可以更低成本地接入,支持平滑演进。

05

架构适配尝试

Spring Boot 1「可行性确认」

爱福路的存量应用中,九成使用的是 Spring Boot 1,RPC 主要依赖 Dubbo 2.6。这点和社区是有一定出入的,社区仅仅支持 SpringBoot 2。

为此爱福路需要尝试对于 Spring Boot 1 的支持,也因此提出了相应的 issue👇

https://github.com/sofastack/sofa-ark/issues/268

通过和社区沟通协调确认,爱福路发现只是社区没能够完全覆盖到这块,企业自身可以通过部分扩展进行支持。

cde136cb59d97bcf1bbb70d3a55f7ab1.png

当时社区同学认为这个是比较重要的变更,可以进一步覆盖更多的社区用户,为此还特地调整了中央仓库的发版频次:加速 review、加速发 snapshot。

447d0be3fcc0f5acbe24dff9c02c24de.png

正是这些细节让爱福路更加信任 Koupleless 团队👍,也坚定了此次方案能够实际落地的信心。

应用合并

当 Spring Boot 1 得到支持之后,爱福路可以快速地将原来的应用转换成为模块,也能够成功地启动和运行。

Dubbo 2.6 合并问题

Dubbo 是一种高效、可扩展、可靠的分布式服务框架解决方案,由阿里巴巴公司开发并开源,适用于构建大型分布式系统。它基于 RPC 的服务调用和服务治理,具有透明化的远程调用、负载均衡、服务注册与发现、高度可扩展性、服务治理等特点。

正如上文所说,爱福路的服务主要是 Dubbo 进行 RPC 调用,但是 Dubbo 2.6 对于 Sofa-ark 倡导的多 ClassLoader 支持不够完善,因此爱福路也通过各种方式来进行尝试。

b1db49d844d3e55f77ea06a791d11e62.png

为此,爱福路也和社区进行沟通确认,最后社区提供了一套相对简便的能够增强 Dubbo 版本、支持多 ClassLoader 的方案👇

https://github.com/sofastack/sofa-serverless/pull/279

应用模型抽象封装

Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

服务端基于 Spring Boot 和 Spring Cloud 开发,打包后可以直接运行,不需要额外安装 Tomcat 等应用容器。Java 客户端不依赖任何框架,能够运行于所有 Java 运行时环境,同时对 Spring/Spring Boot 环境也有较好的支持。

但问题是,在同一个 JVM 中,Apollo 的 appid 会互相污染,导致最后只有一个 Apollo 配置能够获取。

https://github.com/apolloconfig/apollo/issues/2921

private static final String[] APOLLO_SYSTEM_PROPERTIES = {"app.id", ConfigConsts.APOLLO_CLUSTER_KEY,
      "apollo.cacheDir", "apollo.accesskey.secret", ConfigConsts.APOLLO_META_KEY, PropertiesFactory.APOLLO_PROPERTY_ORDER_ENABLE};
/**
   * To fill system properties from environment config
   */
  void initializeSystemProperty(ConfigurableEnvironment environment) {
    for (String propertyName : APOLLO_SYSTEM_PROPERTIES) {
      fillSystemPropertyFromEnvironment(environment, propertyName);
    }
  }


  private void fillSystemPropertyFromEnvironment(ConfigurableEnvironment environment, String propertyName) {
    if (System.getProperty(propertyName) != null) {
      return;
    }


    String propertyValue = environment.getProperty(propertyName);


    if (Strings.isNullOrEmpty(propertyValue)) {
      return;
    }


    System.setProperty(propertyName, propertyValue);
  }

核心是因为其使用了 System.setProperty 导致了 appid 的覆盖。基于此,社区也提供了相关的一键接入组件,可以便捷接入。

静态合并发布加速

6ae8ab60eff9c6e73fe19c69da8d83d3.png

此外爱福路还遇到了启动时间太长的问题。与社区沟通后,社区立项提供了静态部署的加速方案,将原来的串行发布修改为并行发布,启动速度提升明显。

ca6ea206e735478a135ed4826cb8502d.png

对比上下两张图,可以发现修改之后,启动时间从原来的 114 秒加速到了 29 秒。

06

初步成果

爱福路接入了 Koupleless 之后,成功地合并了多个应用。

6a8d7d0530f40c5817b0f64ecd2a3d83.png

07

后续演进和诉求

对于社区,爱福路有着满满的肯定,更多应用也将落地 Koupleless,因此提出了后续的演进诉求:

1、对于模块应用的卸载稳定性的诉求:对于动态发布,不希望每次修改一个模块就要重启整个应用;

2、针对爱福路利用 K8s 的 service 作为 http 的自动发现来说,pod 的就绪探针是一起的,那么如何做到一个模块发布不影响其他流量请求,以及 ingress 需要如何做;

3、针对云原生发布来看,如何更加无缝接入当前的发布体系

Koupleless Star 一下✨:

https://github.com/koupleless/koupleless

  本周推荐阅读  

621c6364d17dc2c16b7d5768198617c6.png

SOFAServerless 品牌升级为 Koupleless,重磅发布 1.0 版本

34a40756d3b5b5bca1e7174152bddc94.png

线上应用 10 秒启动、只占 20M 内存!

f8f489ee8ff754169301a0e1ec6a6846.jpeg

大象转身:支付宝资金技术 Serverless 提效总结

3ca57a76079a2d67d3c70ed29426cfdf.png

Lunettes - 让 Kubernetes 服务运营更简单

ea2746762974e910f4910c0a2b0d853d.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1478754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++之标准库中string的底层实现方式

目录 1、Eager Copy(深拷贝) 2、COW(Copy-On-Write)写时复制 2.1写时复制的实现 3、SSO(Short String Optimization)短字符串优化 4、最佳策略 5、线程安全性 我们都知道, std::string的一些基本功能和用法了,但它底层到底是如何实现的…

基于SSM SpringBoot vue物流配送人员管理系统

基于SSM SpringBoot vue物流配送人员管理系统 系统功能 登录注册 个人中心 员工管理 考勤信息管理 小区信息管理 打卡信息管理 出勤统计管理 派单信息管理 工资结算管理 任务统计管理 开发环境和技术 开发语言:Java 使用框架: SSM(Spring SpringMVC Mybaits)或…

黑马c++ STL部分 笔记(3) deque容器

双端数组,可以对头端进行插入删除操作 deque与vector区别: vector对于头部的插入删除效率低,数据量越大,效率越低(每次头插,后面的元素就往后移) deque相对而言,对头部的插入删除速…

Java Web(十)--jQuery

介绍 官网文档:jQuery 教程 jQuery API 中文文档 | jQuery API 中文在线手册 | jquery api 下载 | jquery api chm 下载地址:https://jquery.com/download/%20jQuery jQuery 是一个快速的,简洁的 javaScrip工具库,使用户能更方…

尝鲜18倍速大模型Groq和世界第二AI Mistral(Le Chat)

01 尝鲜 中午,一边吃饭,一边尝试一下最新的AI:Groq,它使用了重新设计的LPU,据说比英伟达的GPU快了18倍。 运行了开源的Mixtral-8x7b模型,屏幕上的文字回复几乎是瞬间的,那种速度感,让人心跳加速。 接着,我尝试了来自欧洲的新贵——Mistral AI的Le Chat。 这个三天前…

前端同时传递文件数据+非文件数据,前后端解决方案

之前录制视频《文件上传组件》的时候有位观众提了个问题,如果我没有理解错的话,应该就是前后同时传递文件数据 非文件数据,前后端数据该如何接收,这里我给出我自己的解决方案 tip:下文在编写前端代码的时候,用到了这篇…

基于SpringBoot的民宿租赁管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

生成voc格式数据集

数据集存放格式:(Annotations文件夹放标注的xml文件,JPEGImages文件夹放标注的图片) 运行代码: import os import random import xml.etree.ElementTree as ETimport numpy as npdef get_classes(classes_path):with …

nacos开启鉴权+springboot配置用户名密码

nacos默认没有开启鉴权,springboot无需用户名密码即可连接nacos。从2.2.2版本开始,默认控制台也无需登录直接可进行操作。 因此本文记录一下如何开启鉴权,基于nacos2.3.0版本。 编辑nacos服务端的application.properties: # 开…

期货开户保证金保障市场正常运转

期货保证金是什么?在期货市场上,采取保证金交易制度,投资者只需按期货合约的价值,交一定比率少量资金即可参与期货合约买卖交易,这种资金就是期货保证金。期货保证金(以下简称保证金〕按性质与作用的不同。…

力扣-移除元素

问题 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长…

手机如何使用NFC卡模拟门禁刷卡

部分手机具备NFC卡刷卡功能,理论上也可模拟门禁卡。 一个功能强大且免费的NFC卡模拟器,可模拟各类门禁卡、电梯卡、部分公司(工厂)工卡或饭卡、部分学校饭卡、部分图书馆借书卡等各类IC卡,用手机替代卡片去刷门禁、刷…

377组合总和 Ⅳ

题目 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。示例 1:输入:nums [1,2,3], target 4 输出:7 解释&…

DDD设计学习

之前在研究生项目中遇到的问题便是: 随着业务需求的不断改变,需要在原有项目代码中不断进行修改,导致代码不断累积。 那如何构建高质量应用,那就要遵循三大设计原则: 1.单一职责原则:一个类只负责单一的职…

Unity 佳能SDK 及数据获取

1. 填写信息跟官方申请SDK,大概1-2个工作日会邮件回复你 佳能(中国)- 佳定制(佳能影像产品),SDK,EDSDK,CCAPI,软件开发包下载 2. 将SDK这两个文件放到 Unity Plugins文件夹 3. 把CameraControl 下面只要是绿色的 .cs 文件都复制到Unity 中

windows U盘不能识别

windows U盘不能识别 1、问题描述2、问题分析解决3、把U盘插到windows电脑上试试能不能识别 1、问题描述 windwos u盘不能识别 u盘被拿到mac电脑上做了启动盘之后,就不能被windows识别了。题主很奇怪里面被mac电脑的同学放了什么,因此想到把优盘挂载到L…

Cesium-广告牌

创作来源 1、道路标识牌 2、视频广告 创作思路 1、创建有颜色柱体 2、创建长方体并带有纹理 3、将视频问题贴到长方体上 实现步骤 1、创建柱体 /*** 获取柱状几何对象* param radius* param height* return {Geometry}*/ export const getCylinderGeometry (radius, he…

how to deploy parent pom without module deployment

how to deploy parent pom without module deployment deploy -N -f pom.xml

从1-20之间随机抽取5个数,输出抽取出来的5个数之和与剩余未被抽取的15个数之和

从1-20之间随机抽取5个数&#xff0c;输出抽取出来的5个数之和与剩余未被抽取的15个数之和&#xff0c;每个答案独占一行 代码&#xff1a; #include <cstdio> #include <stdlib.h> int main() {int arr[20] { 0 };printf("抽取的5个随机数是&#xff1a;&…

Unity(第八部)Vector3的三维向量和旋转(坐标和缩放也简单讲了一下)

对了&#xff0c;Unity的生命周期自行百度吧&#xff1b;我这边整理的都不是很满意 Vector 是结构体 Vector2是指里面有两个变量 Vector3是指里面有三个变量 Vector4是指里面有四个变量 Vector3常用的变量就是x y z,所以&#xff0c;它可以代表坐标、旋转、缩放、三维向量 创…