阿里云 MSE 助力开迈斯实现业务高增长背后带来的服务挑战
开迈斯新能源科技有限公司于 2019 年 5 月 16 日成立,目前合资股东分别为大众汽车(中国)投资有限公司、中国第一汽车股份有限公司、一汽-大众汽车有限公司[增资扩股将在取得适当监督(包括反垄断)审批后完成]、万帮数字能源股份有限公司和安徽江淮汽车集团控股有限公司,总部位于江苏常州。开迈斯集车企与充电企业优势于一体,提供从充电基础设施的研发制造到软件的智能互联,从私人充电用户到半公共、公共以及商务用户,从电力供应的行业源头到服务平台的终端体验,实现每一个业态的前后端无缝连接。
开迈斯为中国新生代消费者而来,不仅注重私家电动车主的充电体验,还以高端的品质服务提供用户便捷无忧、智能高效的全新充电体验,开启乐享生活的旅程。同时,开迈斯致力于为电动出行提供全场景充电服务,依托强大的研发实力、先进的核心技术和高质量服务,还收获了国内新能源汽车充电领域的诸多奖项:2021 年,开迈斯荣膺“中国充电桩行业最佳运营服务创新奖”;2023 年 3 月,开迈斯一举获得“高质量充电五星级场站奖“,成为首批获得五星级评价的优秀充电运营商(五星级别是最高级别最高标准的场站);同年 6 月,开迈斯荣获 2023 中国充换电行业十大影响力运营商品牌奖。开迈斯将持续推动充电网络建设速度和充电用户旅程的优化创新,并将聚焦高功率充电设备研发和新能源服务领域的探索,从而推动新能源与新能源汽车深度融合的绿色发展。
业务稳定性挑战大
2023 年,开迈斯将继续致力于以用户为中心的整合创新,助力智能电动化出行。截止今年7月底,开迈斯充电网络覆盖国内 192 城,建设 1,274 座充电站和 11,113 个充电终端,积累用户超 241 万。从建设滞后到“适度超前”,未来三年充电桩产业将迎来大发展,市场规模达千亿级。现在全国各地很多城市在对充电桩的增设和利用上在不断升级加码,随着新能源汽车的发展,充电用户群体的诉求飞速增长,开迈斯伴随着业务的快速增长,对其架构的稳定性以及可用性也提出了前所未有的挑战。
开迈斯采用传统的 SpringBoot 方式进行应用开发,应用间通过 Http 请求方式进行互通互联,也正是 SpringBoot 架构的简单性,有效帮助到开迈斯的业务以及微服务数量进行快速扩张。但是随着微服务规模的增大,逐渐发现应用在发布、运行等各个阶段的都存在一些稳定性与效率上的问题。开迈斯架构同学也意识到需要引入微服务治理能力对当前的微服务进行恰当的治理,从而进一步提升业务的稳定性。 同样的,业务依旧面临快速发展的诉求,如果将原先的 SpringBoot 框架升级成 Spring Cloud 并且引入各种高阶的服务治理能力,对于开迈斯研发同学来说,成本过于太大。
升级架构不改代码
是否有一种不用改代码的方式实现我们微服务的治理能力呢?比如通过实施全链路灰度发布来避免变更带来的稳定性风险;通过限流降级能力保障运行态的稳定性,解决不确定的流量带来的稳定性风险;通过鉴权能力解决微服务间调用的安全风险。这就好比,我们如何可以在飞机高速运行的过程中,通过更换引擎来提升飞机的性能?更关键的是,对于我们飞机上的乘客来说,还要是无感的。
我们将问题进一步抽象,如何可以不改代码,实现任意 Java 应用的服务治理能力,并且在这个过程中我们需要确保稳定性、问题诊断效率、架构的可持续性、性能等一系列现实的因素。
技术的探索总是为业务服务的,我们围绕着开迈斯的方案进行了一步讨论,是否可以通过 ServiceMesh 的方案解决用户无侵入服务治理的难题。
- 主流的分布式 Sidecar 模式在近几年受到了大家的青睐,但是在使用过程中也有问题逐渐暴露了出来,Sidecar 模式在内存消耗上比较可控,最多也是在 MB 这个量级,但是在 CPU 利用率上,随着业务吞吐量的增长,Sidecar 的 CPU 消耗基本达到了与业务消耗持平的量级,相当于在使用 Sidecar 之后,相同业务规模需要两倍的集群数来承载。总的来看,业内也逐渐意识到了这个问题,逐渐演进出了其他方案,通过集中化的方式实现无侵入的流量路由。
-
- 另一方面,引入 Envoy Sidecar 对于开迈斯来说则增加了不必要的运维成本、问题诊断的效率也大幅度上升,同时引入 ServiceMesh 的技术复杂度对业务的研发同学来说也是非常高的门槛。
- 既然 ServiceMesh 方案对用户来说门槛比较高,那么是否可以通过 Higress 实现服务间调用的治理诉求? 只需透出网关的操作界面即可,基于托管的 Higress 给无侵入的服务治理提供了一种新的思路,在满足用户服务治理治理需求的同时,相比Sidecar 在资源利用率、运维复杂度、性能和时延等方面具有优势。
如何实现服务间的流量转发与治理
既然思路敲定了,大家评估完了稳定性、安全与成本之后,那么就快速开始方案的实践与探索了。我们首先面临的问题是原先通过域名调用 K8s Service 的方式,我们如何将流量转发至 Higress 并且通过 Higress 再转发给真实对应的 Pod 呢?并且在这个过程中我们需要考虑方案的稳定性。
- 直接想到的方式就是修改 K8s 中的 Service 跟 Endpoints 配置,利用 coreDNS 能力将流量转发至 Higress。
apiVersion: v1
kind: Service
metadata:name: provider
spec:type: ClusterIPclusterIP: 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 的易用性与稳定性,希望可以给更多企业带来更大的价值。
相关文章:

阿里云 MSE 助力开迈斯实现业务高增长背后带来的服务挑战
开迈斯新能源科技有限公司于 2019 年 5 月 16 日成立,目前合资股东分别为大众汽车(中国)投资有限公司、中国第一汽车股份有限公司、一汽-大众汽车有限公司[增资扩股将在取得适当监督(包括反垄断)审批后完成]、万帮数字…...

消灭怪物的最大数量【力扣1921】
一、题目分析 需要满足的条件: 只能在每分钟的开始使用武器武器能杀死距离城市最近的怪兽怪兽到达城市就会输掉游戏 游戏最优策略:我们可以在每分钟的开始都使用一次武器,用来杀死距离城市最近的怪兽。这样可以在力所能及的范围内…...
数据结构之算法
算法的基本概念 计算机解题的过程实际上是在实施某种算法,这种算法称为计算机算法 算法的基本要素 一个算法是由两种基本要素组成:一是对数据对象的运算和操作;二是算法的控制结构 算法中对数据的运算和操作 在一般计算机系统中…...
MyBatis与MyBatis-Plus的分页以及转换
一、介绍 MyBatis和MyBatis-Plus都是Java持久化框架,用于简化数据库访问和操作。它们提供了面向对象的方式来管理关系型数据库中的数据。 MyBatis是一个轻量级的持久化框架,通过XML或注解配置,将SQL语句与Java对象进行映射,使开…...
TCP/IP网络编程(二) 套接字协议及其数据传输特性
文章目录 套接字协议及其数据传输特性关于协议创建套接字协议族套接字类型1:面向连接的套接字(SOCK_STREAM)套接字类型2:面向消息的套接字(SOCK_DGRAM)协议的最终选择面向连接的套接字:TCP套接字…...

在k8s中使用secret存储敏感数据与四种用法
当需要存储敏感数据时可以使用,secret会以密文的方式存储数据。 创建secret的四种方法 (1)通过--from-literal #每个--from-literal对应一个信息条目 kubectl create secret generic mysecret --from-literalusernameadmin --from-litera…...

国产10米分辨率的卫星介绍、下载和处理教程
10米分辨率的资源卫星介绍、下载和处理教程 简介 说起免费的10米分辨率卫星影像,大家首先想到的是sentinel卫星。但其实还有我国的中巴地球资源卫星04星(CBERS04)。 中巴地球资源卫星(China Brazil Earth Resources Satellite, CBERS)是中国和巴西共同投资、联合研制的地球…...
解决SpringBoot项目war部署到tomcat下无法Nacos中注册服务问题
问题说明 怎么解决Spring Boot项目部署到tomcat下无法Nacos中注册服务问题",希望能够解决您遇到有关问题。 在使用Nacos作为注册中心的Spring Boot项目,以war包形式部署到服务器上,启动项目发现该服务无法在Nacos中注册。 分析 …...
C++中的##、#符号含义
在C中,## 和 # 是两个不同的预处理符号。这些符号都是在C的预处理阶段使用的,用于在代码编译之前对文本进行操作。 #(字符串化操作符): 用于将宏参数转换为字符串常量。 #define STRINGIZE(x) #x const char* str S…...

探究Vue3中的Composition API:优化组件逻辑的新利器
一、toRef函数 在 Vue 3.0 中,引入了一种新的响应式 API,即 toRef。toRef 函数可以将一个普通值转换为响应式引用类型,这样就可以在模板中直接使用这个响应式引用类型的属性,并且当该属性发生变化时,视图会自动更新。 <templat…...

Google Services Framework 谷歌服务框架的安装以及遇到的常见问题
安装谷歌三件套: 1、Google 服务框架(Google Services Framework)下载地址: https://www.apkmirror.com/apk/google-inc/google-services-framework/ 注意一定要选择与自己手机对应的安卓系统版本的服务框架。 2、Google Play Se…...

学习高级数据结构:探索平衡树与图的高级算法
文章目录 1. 平衡树:维护数据的平衡与高效性1.1 AVL 树:严格的平衡1.2 红黑树:近似平衡 2. 图的高级算法:建模复杂关系与优化2.1 最小生成树:寻找最优连接方式2.2 拓扑排序:解决依赖关系 拓展思考 …...
centos7离线安装neo4j
一、准备需要的rpm包 本地环境执行如下命令: docker pull couchbase/centos7-systemd docker run -it couchbase/centos7-systemd bash # 可能需要换源 yum update -y vi /etc/yum.conf # 修改其中的keepcache1 rpm --import https://debian.neo4j.com/neotechnol…...

【黑马头条之项目部署_持续集成Jenkins】
本笔记内容为黑马头条项目的项目部署_持续集成部分 目录 一、内容介绍 1、什么是持续集成 2、持续集成的好处 3、今日内容 二、软件开发模式 1、软件开发生命周期 2、软件开发瀑布模型 3、软件的敏捷开发 三、Jenkins安装配置 1、Jenkins介绍 2、Jenkins环境搭建 …...

前端自动化部署,Devops,CI/CD
DevOps 提到 Jenkins,想到的第一个概念就是 CI/CD 在这之前应该再了解一个概念。 DevOps Development 和 Operations 的组合,是一种方法论,并不特指某种技术或者工具。DevOps 是一种重视 Dev 开发人员和 Ops 运维人员之间沟通、协作的流程。…...

22 元类技术(面向切片编程)|ORM的实现|抽象类与接口类
文章目录 前情知识补充hasattr 函数setattr函数getattr函数join 函数 元类技术使用type创建类什么是元类(概念总结)\_\_metaclass\_\_属性使用metaclass 的函数方式进行创建类使用metaclass 的类方式进行创建类 自定义元类 元类实现ORM接口类与抽象类抽象…...
fuchsia系统介绍
fuchsia系统 Fuchsia,是由Google公司开发的继Android和Chrome OS之后的第三个系统,已在Github中公开的部分源码可以得知。Google对于Fuchsia的说明是“Pink(粉红)Purple(紫色)Fuchsia(灯笼海棠…...
解决Jenkins执行Python脚本不能实时输出打印信息的问题
问题: 在使用Jenkins的shell command来执行python脚本时,总是会等脚本执行完毕,最后一次性才把脚本中的print语句给打印出来; 解决方法: 在print语句后加上sys.stdout.flush(), 就可以达到实时输出的目的了。...

2021年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试
C/C++编程(1~8级)全部真题・点这里 第1题:最小新整数 给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。 现在从m位中删除k位(0<k < m),求生成的新整数最小为多少? 例如: n = 9128456, k = 2, 则生成的新整数最小为12456 时间…...

【微服务】服务发现和管理技术框架选型调研
选型背景 方案对比 结论 结合实际业务和开发需要,着重考虑性能可靠性、功能和社区支持程度三方面,认为Nacos更适合作为服务发现和管理的技术框架。具体理由如下: 性能更好,可靠性更高 经过阿里、APISIX、SpringCloudAlibaba,阿…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...
算法250609 高精度
加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...

NineData数据库DevOps功能全面支持百度智能云向量数据库 VectorDB,助力企业 AI 应用高效落地
NineData 的数据库 DevOps 解决方案已完成对百度智能云向量数据库 VectorDB 的全链路适配,成为国内首批提供 VectorDB 原生操作能力的服务商。此次合作聚焦 AI 开发核心场景,通过标准化 SQL 工作台与细粒度权限管控两大能力,助力企业安全高效…...