基于Sermant的全链路灰度发布在汽车行业DMS系统的应用

作者:聂子雄 华为云高级软件工程师

摘要

随着汽车产业的智能升级,DMS系统作为汽车行业的经销管理系统也面临着更加多种多样的业务场景的挑战。借助Sermant,华为云能够为DMS系统提供一整套端到端全链路灰度发布方案,这套方案可以适应DMS系统应用中更多灵活多变的场景。

一、背景  

汽车行业是一个庞大的产业,涵盖了设计、制造、销售、维修等多个方面。目前,全球汽车行业已经成为了重要的经济支柱之一,每年产生数万亿美元的产值。汽车行业的发展也推动了相关产业的发展,如石油、钢铁、橡胶、玻璃等原材料行业,以及银行、保险、物流等服务行业。随着环保意识的提高和新能源技术的不断发展,汽车行业也面临着转型升级的挑战。目前汽车行业正在向智能化、电动化和共享化方向发展,面对更加多种多样的需求,行业相关的IT系统也需要不断进步以适应这些场景。

在汽车行业IT系统中,经常会提到DMS系统,那什么是DMS系统呢?DMS系统是指汽车经销商管理系统(Dealer Management System),它是一种专门为汽车经销商和售后服务提供商设计的软件系统,用于管理和优化他们的业务流程。DMS系统可以帮助汽车经销商实现业务数字化、自动化和智能化,提高业务效率、降低成本、提升服务质量,是现代化汽车经销商必备的管理工具。目前很多经销商的DMS系统基本上都是做过微服务化改造,里面不同微服务模块之间会相互调用,因此如何高效地使用和管理这些微服务模块是DMS系统的重要挑战之一。

二、痛点场景

目前DMS系统已经广泛应用在汽车经销商的业务当中,其中有一类是DMS系统在实际使用中的痛点场景,具体有:

  • 客户想在某一个门店A上线自己的新业务,作为业务试点门店,比如新品汽车销售,或者打折促销活动等。和新业务相关的流量只会流入试点门店B。
  • 为了节约成本以及降低部署服务工作量,希望能够实现逻辑上的环境隔离。例如,测试环境有部分服务复用生产环境上的模块,开发测试人员只需要聚焦于需要测试的服务模块。
  • 客户的交易、商品服务有新的业务要上线,新上线的功能间有依赖和交互,要在上线前做一些测试工作。
  1. 用户计划让测试人员专门账号来进行现网测试(类似于游戏等白名单控制的开服前验证)。
  2. 用户引入少量比例的生产流量进行验证。

三、解决方案

3.1  单点灰度发布方案是否可行?

针对上述问题,一般的思路是通过灰度发布去解决,通过灰度发布,可以引入部分的测试流量到新业务模块,也能控制带有具体特征的流量只流入到对应的测试模块,其余流量保持原有方式不动。

但是经过仔细考虑,就会发现如果只做单点灰度发布,其实是无法完善地解决以上场景的痛点问题,主要体现在:

  • 业务特征时常只在第一跳,也就是特征只在入口,传递过程中会丢失。

  • 除了第一跳入口,后续微服务之间进行调用的时候也会把特征给丢失。

3.2 全链路灰度方案是怎样的?

因此,仅仅依靠单点灰度发布的能力是不够的,还需要能够做到整条微服务调用链的可灰度,也就是全链路灰度能力,这样就可以灵活解决DMS系统在这一类业务中遇到的问题。目前要实现全链路灰度,一般要考虑这些问题的处理:

1)在第一跳的地方(一般是网关),我们需要能选中各种类型的流量,把这部分流量染色,再路由到正确的目标。

2)除了第一跳,剩下调用链路中的各个微服务能够识别染色标,透传染色标,并路由到正确的目标。

3)能对异常情况进行妥善处理。

目前,华为云针对以上难点,设计出一套相对完善的全链路灰度发布方案,整体方案如下:

1)在前端部分,请求会统一携带流量标签参数发到华为云CSE应用网关上面。

2)CSE应用网关会选中各种类型的流量,将这些流量根据需求分别染色,比如通过请求header进行标记染色。

3)CSE应用网关会将染色后的流量转发到带有不同tag的后端微服务实例,tag可以由应用发布流水线注入到相应发布的微服务实例当中。

4)借助微服务实例上挂载的Sermant Agent,接收到应用网关流量的微服务实例会通过Sermant Agent提供的流量染色以及标签透传能力(适配Dubbo,SpringCloud)将流量特征保留并转发到合适的下一跳微服务实例。对于后续链路上的微服务实例,都可以通过微服务实例上面的Sermant Agent进行特征的传递。

3.3 为什么要选择Sermant Agent?

考虑到目前Dubbo和SpringCloud是国内使用量较多的微服务开发框架,为了不产生过多框架适配工作量,因此选用了基于Java Agent技术的Sermant Agent,利用这种无侵入式的特点,用户只需要在微服务实例启动时将Sermant Agent挂载到实例进程当中即可。Sermant Agent针对Dubbo和SpringCloud两种主流微服务框架适配了流量染色以及标签透传的能力。通过流量染色和标签透传,Sermant Agent就可以实现流量特征的保留以及传递到下一跳。Sermant Agent进行流量染色以及标签透传的全流程如下:

通过配置中心,用户可以在控制台界面下发服务粒度的染色规则,用于判断入方向的流量特征是否符合特定条件,若匹配则对该流量进行染色,在同一调用链的出方向流量中携带该染色标签然后通过请求透传给下一跳,因此用户可以通过下发自定义的染色规则到对应微服务,允许目的特征流量进入微服务实例并为出流量赋予新的特征。

在全链路灰度发布的场景下,Sermant Agent染色规则相对简单,sermant Agent会允许目的特征的流量进入微服务实例然后染色时带上相同的特征,染色后的流量再流入到对应tag的微服务实例。

四、总结

基于Sermant的全链路灰度发布方案可以解决DMS系统目前在一些如新业务在试点门店测试上线等业务场景遇到的困难,并且这一套方案能适应各类敏捷迭代的业务场景。

在开发测试过程中,客户可以根据需求在逻辑上划分出一套属于自己的服务链路,只需要关注自己设定的特征流量即可,这种模式可以为客户省去搭建DMS系统中一些共用的模块时间以及节约环境资源,并且还可以很方便地将带有试点特征的流量引入到含有自己试点应用的链路环境当中。

在发布过程中,客户还可以根据需要把一部分生产流量引入到自己的新版本业务链路环境当中,完成新版本的验证。

----------------------------------------------------------------------------------

Sermant作为专注于服务治理领域的字节码增强框架,致力于提供高性能、可扩展、易接入、功能丰富的服务治理体验,并会在每个版本中做好性能、功能、体验的看护,广泛欢迎大家的加入。

  • Sermant 官网:Sermant
  • GitHub 仓库地址:GitHub - huaweicloud/Sermant: Sermant, a proxyless service mesh solution based on Javaagent.
  • 扫码加入 Sermant 社区交流群

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

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

相关文章

深度学习训练中常用的三个基础库tqdmargparseyaml

文章目录 训练常用工具[tqdm][argparse][yaml]tqdm1. 导入tqdm2. 传入可迭代对象快速使用进阶1:通过update()自定义进度条每次更新的步长进阶2:通过set_description和set_postfix自定义进度条内容 Argparse第一步:创建ArgumentParser对象第二…

机器学习在智能音箱中的应用探索与实践:让声音更懂你

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

在Compose中方便的使用MVI思想?试试useReducer!

写在前面 本文中提及的use开头的函数,都出自与我的 ComposeHooks 项目,它提供了一系列 React Hooks 风格的状态封装函数,可以帮你更好的使用 Compose,无需关系复杂的状态管理,专心于业务与UI组件。 这是系列文章的第…

2024 ccfcsp认证打卡 2023 03 01 田地丈量

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n in.nextInt(); // 输入 n,表示矩形的数量int a in.nextInt(); // 输入 a,表示整个区域的长度int b in.nextInt()…

Hive详解(5)

Hive 窗口函数 案例 需求:连续三天登陆的用户数据 步骤: -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…

如何在Portainer中创建Nginx服务并搭建静态站点实现公网访问本地网站

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

Nginx入门 -- 理解Nginx基础概念:连接(Connection)

在Nginx中,连接(Connection)是一个基础而又关键的概念。它涉及到服务器与客户端之间的通信、并发处理以及网络性能优化等方面。本文将深入探讨Nginx中连接的概念、类型以及相关的优化策略,帮助读者更好地理解和利用Nginx来构建高性…

报错:TypeError: Cannot handle this data type: (1, 1, 3), <f8

报错内容: 解决方法: 这个错误是由于 PIL 库无法处理特定的数据类型引起的。为了解决这个问题,你可以尝试将数据类型转换为 PIL 可以处理的类型,比如转换为 uint8 类型。你可以在调用 Image.fromarray() 方法之前,将…

SQL,group by分组后分别计算组内不同值的数量

SQL,group by分组后分别计算组内不同值的数量 如现有一张购物表shopping 先要求小明和小红分别买了多少笔和多少橡皮,形成以下格式 SELECT name,COUNT(*) FROM shopping GROUP BY name;SELECT name AS 姓名,SUM( CASE WHEN cargo 笔 THEN 1 ELSE 0 END)…

Java中copy 一个list,不用BeanUtils.copyProperties

1.List不起作用(单个对象拷贝有用,list没有用) cn.hutool.core.bean.BeanUtils.copyProperties(a, b); org.springframework.beans.BeanUtils.copyProperties(a, b); 2.有效(使用JSONObject 先转成字符串再转成List对象&#x…

Java基础知识总结(31)

函数式接口 所谓函数式接口,就是接口中有且只能有一个抽象方法。用FunctionalInterface注解标注,接口可以包含多个默认方法、类方法,私有方法。 方法引用 如果Lambda 表达式的代码块只有一条代码,还可以在代码块中使用方法引用…

Qt QML 坐标转换函数

QML坐标转换 版本相关函数 版本 Qt5.15 相关函数 下面这些函数是隶属于Item的 /// Item object mapFromGlobal(real x, real y) object mapFromItem(Item item, rect r) object mapFromItem(Item item, real x, real y, real width, real height) object mapFromItem(Item …

安装使用Scoop

目标 今天看到一款用于windows系统的包管理工具Scoop,可以在powershell的命令行里安装软件,省去了找软件、配置环境等步骤,看起来还是很香的,正好最近再做csapp的家庭作业,安装个gcc看看是不是这么牛 安装Scoop 按照…

使用CRXjs、Vite、Vue 开发 Chrome 多页面插件,手动配置 vite.config.ts 和 manifest.json 文件

一、使用CRXjs、Vite、Vue 开发 Chrome 多页面插件,手动配置 vite.config.ts 和 manifest.json 文件 一、创建 Vue 项目 1. 使用 Vite 创建 Vue 项目 npm create vitelatest # npm yarn create vite # yarn pnpm create vite # pnpm选择 Vue 和 TS 进入项目…

在Windows中使用NVM安装node.js

NVM介绍 Node.js版本管理器(Node Version Manager),简称NVM,是一款用于在单个系统上轻松安装和管理多个Node.js版本的命令行工具。它允许用户根据项目需求在不同版本之间自由切换,解决了因为不同项目依赖于不同Node.j…

Golang与Java:两种编程语言的对比

Golang与Java:两种编程语言的对比 在编程世界中,Golang和Java是两种非常流行的编程语言,它们各自具有独特的优势和特点。本文将对这两种语言进行详细对比,帮助开发者了解它们之间的差异,以便根据项目需求选择合适的编…

Python快速入门系列-6(Python高级特性)

第六章: Python高级特性 6.1 列表推导式与生成器6.1.1 列表推导式6.1.2 生成器6.1.2.1 生成器表达式6.1.2.2 生成器函数6.2 装饰器与迭代器6.2.1 装饰器6.2.2 迭代器6.3 异常处理与错误调试6.3.1 异常处理6.3.1.1 try-except语句6.3.1.2 try-except-else语句6.3.2 错误调试6.3…

【缺陷】硅光电二极管中的DT侧壁陷阱态的DLTS表征

【A DLTS study on Deep Trench Processing induced Trap States in Silicon Photodiodes】 概括 本研究通过深能级瞬态光谱(DLTS)技术对硅光电二极管中的深沟槽(DT)侧壁诱导的陷阱态进行了详细分析。研究发现,这些陷…

golang语言系列:通用技能之 Scrum、Kanban等敏捷管理策略

云原生学习路线导航页(持续更新中) 本文是 golang语言系列 文章,主要对编程通用技能 Scrum、Kanban等敏捷管理策略 进行学习 1.什么是敏捷开发 敏捷是一个描述软件开发方法的术语,它强调增量交付、团队协作、持续规划和持续学习。…

深入探秘Python生成器:揭开神秘的面纱

一、问题起源: 想象一下,您掌握了一种魔法,在代码世界里,您可以轻松呼唤出一个整数。然而,事情并不总是看起来那样简单。在Python的奇妙王国中,我遇到了一个有趣的谜题: def tst():try:print(…