充换电企业开迈斯低成本提升线上应用稳定性的最佳实践

news2024/11/30 14:44:12

作者:开迈斯新能源

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

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

业务稳定性挑战大

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

开迈斯采用传统的 SpringBoot 方式进行应用开发,应用间通过 Http 请求方式进行互通互联,也正是 SpringBoot 架构的简单性,有效帮助到开迈斯的业务以及微服务数量进行快速扩张。但是随着微服务规模的增大,逐渐发现应用在发布、运行等各个阶段的都存在一些稳定性与效率上的问题。随着用户与的增多,相应的需求也越来越多,业务场景也越来越复杂。在这个时候仅依靠内部测试很难保证可以覆盖到所有的场景,每次应用的发布都需要进行充分的测试与足够的灰度验证。为了满足快速迭代的业务诉求,如何可以做到低成本地进行多个迭代在开发环境并行,并且保证每次业务发版的稳定,成了提效的关键。

在大规模之下,再小的问题都会牵一发而动全身。一方面,我们面对的流量是随机的、无法预测的,当激增流量超出服务承载上限时,可能会使服务变慢、负载飙高,导致服务崩溃。另一方面,分布式微服务架构是复杂的网状架构,调用链路错综复杂,这时候任何一个服务(包括依赖的外部服务)出现不稳定因素(如慢调用或异常)时,都有可能把上游调用方拖垮,进而形成级联影响。因此,在微服务治理中,我们需要一些手段来预防这些不稳定的情况。

面对持续演进增长的微服务架构,开迈斯架构同学也意识到需要引入微服务治理能力对当前的微服务进行恰当的治理,从而进一步提升微服务的稳定性与效率。 同样的,业务依旧面临快速发展的诉求,如果将原先的 Spring Boot 框架升级成 Spring Cloud 并且引入各种高阶的服务治理能力,对于目前面对业务快速发展的开迈斯研发同学来说,需要投入成本过于太大。

无感实现微服务架构升级

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

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

技术的探索总是为业务服务的,我们围绕着开迈斯的方案进行了一步讨论,是否可以通过统一南北和东西向流量治理的方案来解决用户无侵入服务治理的难题?

  1. MSE 云原生网关是兼容 K8s Ingress 标准的下一代网关产品,将流量网关、微服务网关 和 WAF 安全网关三合一,具备高集成、易使用、易扩展、热更新的特点。它打通了 K8s/Nacos 等多种服务来源,通过无损上下线、全链路灰度、过载保护、故障自愈、限流降级等手段,提升整个链路的应用稳定性。

  2. MSE 云原生网关采用了全托管的模式,用户在选择云原生网关之后,只需要关心网关的具体使用,无需关心云原生网关本身的运维、稳定性、监控、报警 等功能, 开箱即用,使用门槛低。

考虑到云原生网关可以通过路由规则统一流量以及流控,那么是否能够通过 Higress 实现服务间调用流量的治理诉求?

图片

服务间的流量转发与治理

既然思路敲定了,大家评估完了稳定性、安全与成本之后,那么就快速开始方案的实践与探索了。我们首先面临的问题是原先通过域名调用 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/1095677.html

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

相关文章

vh、vw、vmin、vmax

1、分别是什么? vh:指屏幕可见视窗的高, vw:指屏幕可见视窗的宽, vmin:vh和vw之间选较小的值, vmax:vh和vw之间选较大的值。 2、和百分比的区别 百分比时基于父元素的宽高,而vh\vw\vmin\vmax基于屏幕可见视图的宽…

【MySQL JDBC】使用Java连接MySQL数据库

一、什么是JDBC? 理解API的概念 API:Application Programing Interface -- 应用程序编程接口写好一个程序,这个程序需要给别人提供哪些功能?这些功能就是通过一些 函数/类 这样的方式来提供的。例如 Random、Scanner、ArrayList..…

2.Python-用Flask框架创建一个简单的Web程序

怎么安装Flask框架 在终端输入以下命令: pip install flask 验证flask安装: flask --version 编写app.py文件 app文件py如下: #导入flask框架中的两个模块 #Flask允许创建一个Flask应用实例,处理路由、请求和响应等功能 #render…

zookeeper应用场景(二)

单机环境下可以利用jvm级别的锁,比如synchronized、Lock等来实现锁,如果是多机部署就需要一个共享数据存储区域来实现分布式锁 一、分布式锁实现方式 1、基于数据库实现分布式锁 可以用数据库唯一索引来实现 2、基于redis实现分布式锁 redis实现的分…

测试除了点点点,还有哪些内容呢?

今天和一个网友讨论了一下关于互联网行业中测试的情况,希望能够了解现在的互联网行业主要的测试工作内容。小编根据以往的工作经历和经验情况,来做一个总结和整理。 1、岗位分类 现在的岗位划分主要是分为两大类:测试工程师 和 测试开发工程…

1、验证1101序列(Moore)

题目要求: 用Moore型状态机验证1101序列。 题目描述: 用使用状态机验证1101序列,注意:允许重复子序列。如图 端口描述: module moore_1101(input clk,//时钟信号input clr,//reset复位信号,高电平有效in…

Netty 入门 — 亘古不变的Hello World

这篇文章我们正式开始学习 Netty,在入门之前我们还是需要了解什么是 Netty。 什么是 Netty 为什么很多人都推崇 Java boy 去研究 Netty?Netty 这么高大上,它到底是何方神圣? 用官方的话说:Netty 是一款异步的、基于事…

【网络协议】聊聊ifconfig

我们知道在linux是ifconfig查看ip地址,但是ip addr也可以查看 IP 地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号码。 从IP地址的划分来看,C类地址只可以容纳254个,而B类6W多,那么又没有一种折中的…

系统文件IO、文件描述符fd、重定向、文件系统、动态库和静态库

目录 C文件接口系统文件I/O系统调用和库函数文件描述符0 & 1 & 2FILE和fd的关系文件描述符的分配规则 重定向重定向的本质输出重定向输入重定向追加重定向 dup2函数 FILE理解文件系统了解磁盘的物理结构逻辑抽象文件系统文件系统的图解和解析通过文件系统来理解ls -al通…

74.C++ STL stack容器

目录 1.什么是stack 2.stack的构造函数 3.赋值操作 4.数据存取操作 5.大小操作 1.什么是stack stack 是 C 标准库中的容器适配器,它提供了一个堆栈(栈)数据结构的封装,用于管理元素的插入和移除。栈是一种后进先出的数据结构…

【RWKV】如何新增一个自定义的Tokenizer和模型到HuggingFace

0x0. 前言 RWKV社区在Huggingface上放了rwkv-4-world和rwkv-5-world相关的一系列模型,见:https://huggingface.co/BlinkDL/rwkv-4-world & https://huggingface.co/BlinkDL/rwkv-5-world ,然而这些模型的格式是以PyTorch的格式进行保存的…

$ vue -Vbash: vue: command not found

$ vue -V bash: vue: command not found报这个错,我们需要找到vue安装路径,添加在环境变量的用户变量中: 1、vue安装路径 2、编辑环境变量 然后重新打开命令框,就可以了

嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)

目录 前言 一、sqlite概念和特性 二、sqlite安装 三、sqlite3数据类型 四、sqlite数据库约束 五、sqlite常用命令 六、SQL语句(增删改查) 七、sqlite使用实例(教学管理数据库) 总结 前言 数据在实际工作中应用非常广泛…

Linux网络编程系列之服务器编程——阻塞IO模型

Linux网络编程系列 (够吃,管饱) 1、Linux网络编程系列之网络编程基础 2、Linux网络编程系列之TCP协议编程 3、Linux网络编程系列之UDP协议编程 4、Linux网络编程系列之UDP广播 5、Linux网络编程系列之UDP组播 6、Linux网络编程系列之服务器编…

Stream流中的 max()和 sorted()方法

需求:某个公司的开发部门,分为开发 一部 和 二部 ,现在需要进行年中数据结算。分析: 员工信息至少包含了(名称、性别、工资、奖金、处罚记录)开发一部有 4 个员工、开发二部有 5 名员工分别筛选出 2 个部门…

1.2 向量的长度与点积

一、向量的点积 两个向量 v ( v 1 , v 2 ) \boldsymbol v(v_1,v_2) v(v1​,v2​) 与 w ( w 1 , w 2 ) \boldsymbol w(w_1,w_2) w(w1​,w2​)的点积或内积是数字 v ⋅ w \boldsymbol v\cdot\boldsymbol w v⋅w: v ⋅ w v 1 w 1 v 2 w 2 ( 1.2.1 ) \boldsymbo…

【Agora UID 踩坑记录 Java 数据类型】

目录 负数二进制表示Java中32位无符号数的取法项目踩坑记录Java 0xffffffff隐式类型转换的坑 负数二进制表示 由于计算机中数据都以二进制表示,而负数的二级制是根据正数二进制取补码(补码就是先取反码,然后加1)得到,…

关于Gym变成Gymnasium

根据网页搜索的gym官网,发现如下网站https://www.gymlibrary.dev/ 刚进页面时 翻译一下,意思就是 Gym 的所有开发都已迁移到 Gymnasium,这是 Farama 基金会中的一个新软件包,由过去 18 个月来维护 Gym 的同一团队开发人员维护。如果您已经在使用最新版…

Java基础(运算符篇)

一、算术运算符 正号-负号加法-减法*乘法/除法%模运算(取余)自增--自减 算术运算符的使用比较简单,只需要注意一些细节。 tips: 加号( )除了可以作为正号,还可以用于字符串拼接。 public c…

解读下SWD协议以及其应用

SWD协议原理 SWD(Serial Wire Debug)协议是一种用于ARM Cortex微控制器的调试接口协议。它定义了主机计算机与目标设备之间通过SWD线进行通信的格式和规范。 SWD协议使用两根线进行通信:SWDIO(Serial Wire Debug I/O&#xff09…