阿里云 MSE 助力开迈斯实现业务高增长背后带来的服务挑战

news2024/11/19 19:20:36

开迈斯新能源科技有限公司于 2019 年 5 月 16 日成立,目前合资股东分别为大众汽车(中国)投资有限公司、中国第一汽车股份有限公司、一汽-大众汽车有限公司[增资扩股将在取得适当监督(包括反垄断)审批后完成]、万帮数字能源股份有限公司和安徽江淮汽车集团控股有限公司,总部位于江苏常州。开迈斯集车企与充电企业优势于一体,提供从充电基础设施的研发制造到软件的智能互联,从私人充电用户到半公共、公共以及商务用户,从电力供应的行业源头到服务平台的终端体验,实现每一个业态的前后端无缝连接。

开迈斯为中国新生代消费者而来,不仅注重私家电动车主的充电体验,还以高端的品质服务提供用户便捷无忧、智能高效的全新充电体验,开启乐享生活的旅程。同时,开迈斯致力于为电动出行提供全场景充电服务,依托强大的研发实力、先进的核心技术和高质量服务,还收获了国内新能源汽车充电领域的诸多奖项:2021 年,开迈斯荣膺“中国充电桩行业最佳运营服务创新奖”;2023 年 3 月,开迈斯一举获得“高质量充电五星级场站奖“,成为首批获得五星级评价的优秀充电运营商(五星级别是最高级别最高标准的场站);同年 6 月,开迈斯荣获 2023 中国充换电行业十大影响力运营商品牌奖。开迈斯将持续推动充电网络建设速度和充电用户旅程的优化创新,并将聚焦高功率充电设备研发和新能源服务领域的探索,从而推动新能源与新能源汽车深度融合的绿色发展。

业务稳定性挑战大

2023 年,开迈斯将继续致力于以用户为中心的整合创新,助力智能电动化出行。截止今年7月底,开迈斯充电网络覆盖国内 192 城,建设 1,274 座充电站和 11,113 个充电终端,积累用户超 241 万。从建设滞后到“适度超前”,未来三年充电桩产业将迎来大发展,市场规模达千亿级。现在全国各地很多城市在对充电桩的增设和利用上在不断升级加码,随着新能源汽车的发展,充电用户群体的诉求飞速增长,开迈斯伴随着业务的快速增长,对其架构的稳定性以及可用性也提出了前所未有的挑战。

开迈斯采用传统的 SpringBoot 方式进行应用开发,应用间通过 Http 请求方式进行互通互联,也正是 SpringBoot 架构的简单性,有效帮助到开迈斯的业务以及微服务数量进行快速扩张。但是随着微服务规模的增大,逐渐发现应用在发布、运行等各个阶段的都存在一些稳定性与效率上的问题。开迈斯架构同学也意识到需要引入微服务治理能力对当前的微服务进行恰当的治理,从而进一步提升业务的稳定性。 同样的,业务依旧面临快速发展的诉求,如果将原先的 SpringBoot 框架升级成 Spring Cloud 并且引入各种高阶的服务治理能力,对于开迈斯研发同学来说,成本过于太大。

升级架构不改代码

是否有一种不用改代码的方式实现我们微服务的治理能力呢?比如通过实施全链路灰度发布来避免变更带来的稳定性风险;通过限流降级能力保障运行态的稳定性,解决不确定的流量带来的稳定性风险;通过鉴权能力解决微服务间调用的安全风险。这就好比,我们如何可以在飞机高速运行的过程中,通过更换引擎来提升飞机的性能?更关键的是,对于我们飞机上的乘客来说,还要是无感的。

我们将问题进一步抽象,如何可以不改代码,实现任意 Java 应用的服务治理能力,并且在这个过程中我们需要确保稳定性、问题诊断效率、架构的可持续性、性能等一系列现实的因素。

技术的探索总是为业务服务的,我们围绕着开迈斯的方案进行了一步讨论,是否可以通过 ServiceMesh 的方案解决用户无侵入服务治理的难题。

  1. 主流的分布式 Sidecar 模式在近几年受到了大家的青睐,但是在使用过程中也有问题逐渐暴露了出来,Sidecar 模式在内存消耗上比较可控,最多也是在 MB 这个量级,但是在 CPU 利用率上,随着业务吞吐量的增长,Sidecar 的 CPU 消耗基本达到了与业务消耗持平的量级,相当于在使用 Sidecar 之后,相同业务规模需要两倍的集群数来承载。总的来看,业内也逐渐意识到了这个问题,逐渐演进出了其他方案,通过集中化的方式实现无侵入的流量路由。
    1. 另一方面,引入 Envoy Sidecar 对于开迈斯来说则增加了不必要的运维成本、问题诊断的效率也大幅度上升,同时引入 ServiceMesh 的技术复杂度对业务的研发同学来说也是非常高的门槛。
  2. 既然 ServiceMesh 方案对用户来说门槛比较高,那么是否可以通过 Higress 实现服务间调用的治理诉求? 只需透出网关的操作界面即可,基于托管的 Higress 给无侵入的服务治理提供了一种新的思路,在满足用户服务治理治理需求的同时,相比Sidecar 在资源利用率、运维复杂度、性能和时延等方面具有优势。

图片

如何实现服务间的流量转发与治理

既然思路敲定了,大家评估完了稳定性、安全与成本之后,那么就快速开始方案的实践与探索了。我们首先面临的问题是原先通过域名调用 K8s Service 的方式,我们如何将流量转发至 Higress 并且通过 Higress 再转发给真实对应的 Pod 呢?并且在这个过程中我们需要考虑方案的稳定性。

  • 直接想到的方式就是修改 K8s 中的 Service 跟 Endpoints 配置,利用 coreDNS 能力将流量转发至 Higress。
apiVersion: v1
kind: Service
metadata:
 name: provider
spec:
  type: ClusterIP
  clusterIP: None
---
apiVersion: v1
kind: Endpoints
metadata:
  name: provider
spec:
  subsetS:
    ip: ${higress-slb}
    port: 80
  • 出于商业化稳定性的考虑 CoreDNS,可以使用同类型产品 privatelinkZone DNS 进行替代,同时可以配置 CNAME 类型的 DNS 记录批量将服务间访问的域名 *.camsnet.com 切换至云原生网关上。

到目前为止我们完成了 Order 的流量被先转发至内部网关 Higress 上,接下来我们需要配置 Higress 路由规则,将流量转发至真实的目标服务中。

图片

  • 我们在 MSE 云原生网关(Higress 商业版)中同步容器服务的 Service 至网关,并且配置对应的路由规则,实现流量转发。

流量经过 MSE 云原生网关转发之后,我们就可以做更多的治理能力了

  • 这个过程中我们直接可以配置标签路由实现灰度发布的能力,再结合链路追踪实现全链路灰度的能力。
  • 这个过程中我们可以在路由上配置 JWT 鉴权规则,从而达到服务间的安全调用。

如何实现可观测与全链路追踪

开迈斯通过接入应用实时监控服务 ARMS -应用监控,无需修改一行代码就可以实现应用的监控诊断能力,可以快速了解应用最关键的响应时间,吞吐量,错误率这黄金三指标,同时根据指标的异常利用调用链能力对整个微服务进行快速跟踪。

同时链路追踪能力也为应用实现全链路灰度提供了一个技术底座支持。

如何实现全链路流量标签透传

借助 Tracing Baggage 机制在全链路中传递对应染色标识,因为大部分 Tracing 框架都支持 Baggage 概念及能力,如:OpenTelemetry、Skywalking、Jaeger 等等。当然 ARMS Tracing 能力也是符合这个标准的,我们通过实现 Higress WASM 插件,在 Higress outbound Filter 中将指定的透传 key 如 x-mse-tag 从 Tracing 协议指定位置的 Baggage 中读出 x-mse-tag 对应的值,并塞入到 Http 的 Header 中,供 Higress 进行路由。从而实现自定标签全链路透传的能力。

图片

具备自定标签全链路透传的能力之后,我们就可以构建完整的全链路灰度能力了。什么是全链路灰度呢?

在微服务架构下,有一些需求开发,涉及到微服务调用链路上的多个微服务同时发生了改动,通常每个微服务都会有灰度环境或分组来接受灰度流量,我们希望通过进入上游灰度环境的流量,也能进入下游灰度的环境中,确保 1 个请求始终在灰度环境中传递,即使这个调用链路上有一些微服务没有灰度环境,这些应用请求下游的时候依然能够回到灰度环境中。如果一次发布涉及到链路中的多个微服务,我们可以顺滑地进行全链路灰度发布,并且不用担心灰度流量乱窜的风险。

当我们实现全链路透传 x-mse-tag 标签后,我们可以在 Higress 路由上,配置基于 x-mse-tag 的标签路由规则,实现带有特定标签的流量在应用特定版本的节点内流量闭环,从而实现“流量泳道”的全链路灰度能力。

图片

如何实现流量防护能力

如何可以不用修改代码,实现流量防护能力?以常见的流量控制与熔断降级为例,下面我们先来介绍一下流量防护能力。

  • 流量控制

图片

流量是非常随机性的、不可预测的。前一秒可能还风平浪静,后一秒可能就出现流量洪峰了(例如双十一零点的场景)。每个系统、服务都有其能承载的容量上限,如果突然而来的流量超过了系统的承受能力,就可能会导致请求处理不过来,堆积的请求处理缓慢,CPU/Load 飙高,最后导致系统崩溃。因此,我们需要针对这种突发的流量来进行限制,在尽可能处理请求的同时来保障服务不被打垮,这就是流量控制。

  • 熔断降级

图片

现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。

开迈斯通过接入 MSE 服务治理流量防护能力(Sentinel 企业版),无缝实现流量防护能力。 相比社区版本,Sentinel 企业版无论是在使用还是功能层面都有一定的优势。

图片

更多的探索与实践

不需要改代码,我们也能快速具备完整、体系化的微服务治理能力。目前开迈斯基于 Higress 实现了全链路灰度、全链路追踪与可观测、流量防护等一系列能力,使得开迈斯当前的架构可以更加从容地面对快速增长业务带来的挑战。

另一方面,对于 Higress 来说,开迈斯方案的落地为 Higress 生态的发展注入了新鲜的思路,我们也在持续地提升 Higress 的易用性与稳定性,希望可以给更多企业带来更大的价值。

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

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

相关文章

matlab使用教程(27)—微分代数方程(DAE)求解

1.什么是微分代数方程? 微分代数方程是一类微分方程,其中一个或多个因变量导数未出现在方程中。方程中出现的未包含其导数的变量称为代数变量,代数变量的存在意味着您不能将这些方程记为显式形式 y ′ f t , y 。相反,您可以…

详细讲解移植u-boot.2022.10版本移植到开发板基本方法

大家好,我是ST​。​ 今天给大家讲一讲如何将u-boot.2022.10版本移植到imx6ull开发板上。 环境 选项内容编译主机UbuntuLTS 18.04目标板ATK I.MX6ULL(512MB DDR3 8GB EMMC)u-boot版本2022.10交叉编译工具链gcc-linaro-7.5.0-2019.12-i686…

springBoot打印精美logo

文章目录 🐒个人主页🏅JavaEE系列专栏📖前言:🎀文本logo 🐒个人主页 🏅JavaEE系列专栏 📖前言: 本篇博客主要以提供springBoot打印精美logo 🎀文本logo ??…

克努森数与连续介质

1 克努森数的概念 克努森数(Knudsen number)定义为分子平均自由程和空间尺度的比例: 克努森数的取值决定了物理问题的类型及其适用的方程。 各方程对应的克努森数适用范围(图源:researchgate.net) 2 大克努…

嵌入式学习笔记(4)S5PV210的启动过程详解

1.9.1内存 SRAM 特点是容量小,价格高,优点是不需要软件初始化直接上电就能用 DRAM 特点是容量大,价格低,缺点是上电后不能直接使用,需要软件初始化 1.9.2外存 NorFlash:特点是容量小,价格高&am…

为什么劝年轻人不要频繁跳槽?

这是一个让很多年轻人犯愁的问题,尤其是在现如今竞争激烈的职场环境中。许多年轻人因为各种原因选择频繁跳槽,但是在我看来,这并不是一个明智的选择。下面就让我们来看看为什么劝年轻人不要频繁跳槽。 1. 错失成长机会 每一个工作都有其独特…

记一次批量更新mysql数据过程

一、前言 需求背景:mysql数据库中有一个表的数据(600多万)有一个字段的内容需要解密再通过另外一种加密方式进行加密再回存。通过java程序计算完成更新。 二、方案一 一条条计算更新。这里是将手机号解密,在通过另外一种方式回…

港联证券:哪里可以买卖股票?

股票作为一种出资品,已经成为了出资者不可忽视的重要东西。然而,关于新手出资者来说,他们往往不知道哪里能够生意股票。本文将从多个视点剖析,介绍股票市场的基本知识、股票生意的方法以及购买股票需求留意的事项。 一、股票市场的…

(三)行为模式:6、备忘录模式(Memento Pattern)(C++示例)

目录 1、备忘录模式(Memento Pattern)含义 2、备忘录模式的UML图学习 3、备忘录模式的应用场景 4、备忘录模式的优缺点 (1)优点: (2)缺点 5、C实现备忘录模式的实例 1、备忘录模式&#…

实战教程:如何自己搭建一个小程序商城?

如今,随着移动互联网的发展,电子商务已经成为人们购物的主要方式之一。而商城小程序的出现,更是方便了商家进行线上销售和推广。本文将为大家详细介绍如何搭建一个商城小程序,让你从小白变为专家。 首先,我们需要登录乔…

Linux内核源码分析 (3)调度器的实现

Linux内核源码分析 (3)调度器的实现 文章目录 Linux内核源码分析 (3)调度器的实现一、概述二、调度器数据结构1、task_struct中与调度有关的的成员2、调度器类3、就绪队列4、调度实体 三、处理优先级1、优先级的内核表示2、计算优先级3、计算负荷权重 四、核心调度器1、周期性调…

工作的记录

request.getServletPath(),request.getContextPath()的区别 request.getSession().getServletContext().getRealPath("/"); request.getServletPath(),request.getContextPath()的区别_中森明菜的博客-CSDN博客 spring中 getBeansOfType 灵…

可拖动表格

支持行拖动&#xff0c;列拖动 插件&#xff1a;sortablejs UI: elementUI <template><div><hr style"margin: 30px 0;"><div><!-- 数据里面要有主键id&#xff0c; 否则拖拽异常 --><h2 style"margin-bottom: 30px&qu…

【大山里的女孩】

我生来就是高山而非溪流&#xff0c;我欲于群峰之巅仰视平庸的沟壑。 这是她们的呐喊&#xff01; “我不知道我还有多少时间&#xff0c;现在还能动&#xff0c;我想做点事。” 这是张桂梅平凡的宣言&#xff0c;也是她一生都在践行的梦想。 17岁的她&#xff0c;为了祖国建…

Python-matplotlib画图时标题中的指数表示

1.示例 2.核心代码 # 修改横轴的刻度 # 生成刻度的位置和标签 total_steps 1000000 # 总共100万步 num_segments 10 # 分成10段 segment_length total_steps // num_segments # 每段的步数# 生成刻度的位置 custom_ticks np.arange(0, total_steps 1, segment_length…

基于孪生神经网络Siamese开发构建牛脸识别分析系统

关于牛脸识别相关的项目开发实践&#xff0c;在我前面的一篇文章中已经有非常详细的实践记录了&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a;《助力养殖行业数字化转型&#xff0c;基于深度学习模型开发构建牛脸识别系统》 在我们以往接触到的项目或者是业务场景中…

L1-044 稳赢(Python实现) 测试点全过

题目 大家应该都会玩“锤子剪刀布”的游戏&#xff1a;两人同时给出手势&#xff0c;胜负规则如图所示&#xff1a; 现要求你编写一个稳赢不输的程序&#xff0c;根据对方的出招&#xff0c;给出对应的赢招。但是&#xff01;为了不让对方输得太惨&#xff0c;你需要每隔K次就…

小红书运营 变现方法总结

大家好&#xff0c;我是网媒智星&#xff0c;今天跟大家分享一下小红书如何变现的方法。介绍四个赛道和玩法给大家参考。 想在小红书成为博主的同学们要牢记一句话&#xff1a;赛道的选择比流量更重要。方向错误&#xff0c;再怎么努力也是徒劳。小红书是近几年最值得投资的平台…

JUC并发编程--------基础篇

一、多线程的相关知识 栈与栈帧 我们都知道 JVM 中由堆、栈、方法区所组成&#xff0c;其中栈内存是给谁用的呢&#xff1f;其实就是线程&#xff0c;每个线程启动后&#xff0c;虚拟 机就会为其分配一块栈内存。 每个栈由多个栈帧&#xff08;Frame&#xff09;组成&#xf…

Linux 常用命令 2

Linux 常用命令 2 1、组和权限管理1.1、ls 指令1.2、chown 指令1.3、chgrp 指令1.4、chmod 指令1.5、chown 指令1.6、chgrp 指令 2、crond 任务调度2.1、crontab2.2、时间格式2.3、脚本无法执行问题2.4、案例 3、进程管理3.1、ps 指令3.2、kill 和 killall 指令3.3、pstree 指令…