基于开源体系的云原生微服务治理实践与探索

news2024/11/15 9:09:16

作者:董艺荃|携程服务框架负责人

携程微服务产品的发展历程

在这里插入图片描述

携程微服务产品起步于 2013 年。最初,公司基于开源项目 ServiceStack 进行二次开发,推出 .Net 平台下的微服务框架 CServiceStack。

2014 年,公司推出 Java 平台下同 CServiceStack 完全互通的自研微服务框架 Baiji 和第一代服务注册中心。该服务注册中心后续经历多次重构,目前使用的已是第四代产品。

2017 年,公司正式引进开源产品 Dubbo,推出整合携程治理能力的 CDubbo 框架。该框架最初基于 Dubbo 2.5.4 版本进行二次开发,经历多次版本升级后,目前使用 Dubbo 2.7.7 版本。

2020 年,公司正式开始探索落地 Service Mesh 项目。目前,相关产品已经在生产环节正式落地,正在进行接入推广工作。

在这里插入图片描述

携程微服务产品情况复杂,主要在于以下四点。

第一,线上同时运行着三种微服务框架产品。

第二,同时采用 HTTP 和 Dubbo 两种通信协议。

第三,采用完全自研的基础设施,包括注册中心和配置中心。

第四,现存 8000 多个线上服务,实例数超过 10 万个。

在这里插入图片描述

随着研发的深入,我们团队主要遇到了以下三点问题。

第一,维护多个功能类似的中间件产品工作量较大,保证产品之间功能对齐需要花费大量的精力。

第二,由于产品以 SDK 公共依赖包的形式集成在业务应用内,进行版本升级需要业务方配合,推动升级比较困难,版本长尾问题严重。

第三,由于团队工作精力和技术栈的限制,只有少数几个语言平台上存在 SDK 支持,不利于小众语言用户使用微服务产品。

携程的云原生微服务架构设计

在这里插入图片描述

由于线上集群已初具规模,如何平滑过度和迁移框架成为关键问题。彻底抛弃现有基础设施,一步到位实现全面云原生,不仅实施难度较大,项目周期也比较长。

因此,项目决定采用“小步快走”的方式。首先保证代码完全向后兼容,其次保证整体架构支持业务应用迁移,提升接入容错率。

在这里插入图片描述

项目进行架构设计时,遇到了三个关键的问题。

数据权威问题:常见的 Service Mesh 实践以 K8S 为准则,将所有的数据保存在 K8S 内,但平台现有数据大部分保存在自研的注册中心和配置中心内。

有方案提出采用两条推送路的方式,云内数据保存在 K8S 内,云外数据保存在现有注册中心里,通过外部工具或组件实现双向同步。但双向同步复杂度较高,既要保证数据的准确性和实时性,也要保证同步不成环。

因此,出于架构简便性考虑,项目最终选择保持注册中心数据权威地位不变,通过外部组件将数据写入 K8S。

边界划分问题:目前的项目部署体系是一个 Region 内包含多个 Zone,一个 Zone 内又包含多个 K8S 集群,集群之间网络互通。但由于故障隔离的需要,数据最好保持在 Zone 内收敛,使实例信息不需要进行跨 Zone 同步。

Zone 内收敛存在的问题是当调用方发起跨 Zone 调用时,需要经过网关进行中转。这种调用方式和现有的调用链路存在差异,会提高计算复杂度。

因此,项目最终选择保持现有工作模式不变,使得调用方能够获取 Region 内所有的 Zone 服务实例,保持数据在 Region 内透明。

技术选型问题:过去,项目研发产品大部分采用自研模式,通过整个团队成员协作完成开发工作,而依托开源社区能够更容易地产出优秀产品。

因此,项目最终选择基于开源产品进行二次开发。

在这里插入图片描述

目前所使用的 Service Mesh 架构设计,也被称为“渐进性”架构,主要有三个方面的特点。

开源方面:选择 Istio 和 Envoy 作为 Service Mesh 的基础设施。

实例和配置同步方面:由新开发的 SOA Operator 负责将存储在注册中心和配置中心中的数据写入 K8S。

同时,该程序也会把K8S集群内服务提供方的数据写入注册中心,使得 K8S 集群外用户也能够正常读取服务数据。并且,该服务不需要 SDK 支持,由 SOA Operator 直接完成注册和发现,任何语言都可以方便地接入微服务产品体系。

使用方面:K8S 集群外的应用仍然使用过去的交互方式,通过SDK和注册中心进行通信。

K8S 集群内的应用,如果使用 SDK,检测到 Sidecar 存在之后,SDK 会自动地关闭服务治理功能,使用特殊的 host 进行请求。如果不存在 SDK 支持,接入 Mesh 可以直接使用 HTTP Client,继续使用特殊的 host 发起请求。

在这里插入图片描述

HTTP 协议在 Service Mesh 架构上运行良好,但 Dubbo 协议在 Sidecar 网关上存些一些问题。

其一,元数据的位置:HTTP 协议中元数据位于报文最前端,而 Dubbo 协议中元数据位于报文末端,因此需要先解析报文才能定位到元数据位置。

其二,序列化问题:解析报文需要对报文进行反序列化处理,目前 Envoy 支持 Dubbo 默认序列化协议。但这种方式会产生额外开销,而且 Dubbo 服务使用的序列化器复杂,甚至还有一些团队为进一步降低报文大小,使用了压缩算法,网关解析难度大。

在这里插入图片描述

Dubbo 3 推出了 Triple,这是一种使用基于 HTTP/2 的 gRPC 并通过请求标头实现元数据信息传递的通信协议,也是 Dubbo 3 中推荐使用的服务通信协议。

Triple 协议适用于 Envoy 框架,且能轻松接入 Service Mesh。Dubbo 版本升级也并不复杂。

在这里插入图片描述

由于 gRPC 的 PB 序列化格式,Triple 协议无法直接使用。尽管 Triple 协议对 PB 兼容性较好,但 PB 要求先写契约再生成代码,而 Dubbo 要求先写代码,不存在契约,数据模型也是与 PB 对象完全不同的 POJO 格式。

为了连接 POJO 和 PB 对象,Triple 协议设计了 Wrapper。将原 POJO 对象序列化处理得到二级数据后,传入到 Wrapper 用 PB 进行序列化。

然而,这种方式不仅会导致内存占用变大,而且会引发更多的 GC。多次 GC 和重复序列化将会增大 CPU 负载。

在这里插入图片描述

为解决 Triple 协议带来的问题,项目给 gRPC 添加了自定义序列化器。这样不仅可以实现流式的序列化,也可以为用户提供和原生 Dubbo 一样的使用体验。

其他语言想要调用这种 gRPC 服务,只需要具备这种自定义序列化器即可,默认的自定义序列化器 JSON 可以被大部分语言解析。

在这里插入图片描述

治理方面,Service Mesh 使用 Istio 和 Envoy 作为基础设施,通过 Istio 读取 K8S 中 CRD 数据,并生成配置推送给 Envoy。

因此,保存在自研服务治理系统里内的实例数据、配置数据必须全部转化成 CRD 格式,同步到 K8S 以供 Istio 处理。

Operator 作为翻译机包含了大量模型转换逻辑,能够将配置模型翻译成 CRD 模型。针对一些复杂的功能,项目通过 Envoyfilter 或者 Envoy 的二次开发,添加自定义的 Envoyfilter 进行实现。

目前,所有的常用功能都已完成对齐,整体功能覆盖率超 90%。数千个线上应用完成接入,进入后续接入推广工作。

云原生微服务产品的未来发展趋势

在这里插入图片描述

Service Mesh 提供的都是通用能力,如分组、路由、流量控制、负载均衡等。这些功能本身没有语义,一线的业务研发和运维人员理解起来存在一定困难。

而且,该产品功能与现存治理系统的功能存在差异。为了给一线人员提供更好的微服务治理体验,需要将实际运维需求和底层控制数据联系起来。

在这里插入图片描述

目前,社区内 Dubbo Mesh 的研发工作也在积极进行,其做法跟携程云原生微服务治理框架类似。通过单独的控制面将配置数据写到 K8S 里,将实例数据通过 MCP 进行同步。

在这里插入图片描述

另外,新的开源产品 OpenSergo 也在研发中。据官方介绍,该项目力图打造一套通用的面向云原生的微服务治理标准,并且提供一系列的 API 和 SDK 实践。

目前,多家大型互联网企业和开源社区正在共同推进该项目的进行,希望能够完成从服务治理到云原生基础设施的全链路生态覆盖。

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

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

相关文章

【PhD Debate —11】矛与盾的对决——神经网络后门攻防

点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入!2022年7月9日,AI TIME组织了Ph.D. Debate第十一期,题为“矛与盾的对决——神经网络后门攻防”的研讨活动,特别邀请了宾夕法尼亚州州立大学电子工程系博士生向臻、清华大学博士生…

区块链基础知识(一)

参考书籍《区块链原理、设计与应用》 基本原理 比特币网络工作流程 技术的演化与分类 分布式共识 交易性能 扩展性问题 数据库和存储系统 数据库也是区块链中重要的一环 分布式系统核心问题 单节点结构演变为分布式系统,首先遇到的问题就是一致性的保障。 一致性问…

小程序开发经验分享(5)-全屏展示小程序

小程序的 navigationBar,有APP开发经验的同学应该知道,navigationBar也就是程序最顶部的一条,我们同常的开发页面,也都是在navigationBar下方的主体区用标签开发UI部分 如下面两个图片,左边的翻译君官方小程序中上面就有这样一个navigationBar用于展示自己的title和菜单按…

K8s 认证工程师 CKA 考题分析和题库练习(下)

目录 10、考核知识:检查可用节点数量 题目内容 题目内容中文解释 做题解答 11、考核知识:一个 Pod 封装多个容器 题目内容 题目内容中文解释 官方文档搜索关键字:pod ​编辑做题解答 12、考核知识:持久卷 PersistentV…

Mac M1芯片 搭建RocketMQ

Mac M1芯片 搭建RocketMQ RocketMQ需要启动三个组件 1、nameserver 路由中心,为整个MQ集群提供服务协调与治理 2、broker 提供消息的转发和存储功能 3、console 控制台面板工具 1、下载RocketMQ https://rocketmq.apache.org/dowloading/releases/ 选择 Binary: rocketmq-all-4…

对外投资追踪汇率数据金融开放指数

一、2005-2020年中国全球投资追踪数据 “中国全球投资跟踪”(China Global Investment Tracker)数据库,由美国企业研究所于1月28日发布。该数据库是唯一一套涵盖中国全球投资和建设的综合数据集,同时使用分别记录和汇总记录两种方…

这几个算法可视化网站,太牛了!

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构等核心知识点,欢迎star~ Github地址:https://github.com/Tyson0314/Java-…

深入 Android 底层服务(service)

前言 我们都知道,字节最近发布了PICO4VR眼镜,我买了一个,体验还行。因为我也是做VR眼镜的Android应用层开发的,所以想把自己项目中遇到的一些Android技术分享给读者。近些年随着VR眼镜的兴起,Android的的服…

项目经理跨部门沟通,如何避免踢皮球?

软件项目干系人越多,沟通成本也就越高,非常容易出现相互提皮球的现象。那么如何高效沟通? 1、划分干系人 不同干系人不同策略 软件项目涉及干系人众多,项目不经理不可能对每一个人进行详细沟通,那么我们需要将干系人的…

如何把优化Docker镜像大小

什么是Docker Docker是一个开源的虚拟化平台,可以让开发人员将应用程序和依赖项打包在轻量级容器中,然后可以轻松地在任何环境中运行。这样,开发人员可以将容器作为独立的可移植单元在不同的环境中部署和运行应用程序,而不用担心环…

系统学习ElasticSearch

1.1 、ElasticSearch(简称ES) Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。 能够达到实时搜索,稳定,可靠,快速,安装使用方便。 客户端支持Java、.NET(C#)、…

SAP FICO财务月结-外币评估

月末操作-外币评估 —文章整理自高林旭老师的《由浅入深学习SAP财务》一书,SAP相关从业人员值得一读。 企业的外币业务在记账的时候一般都是使用期初的汇率或者即时汇率,但是在月末,需要按照月末汇率对外币的余额或者未清项进行重估&#xf…

c语言入门-3-打印复杂类型

打印复杂类型前言上代码字符整形浮点型打印超长小数向内存中申请空间局部变量,全局变量使用输入函数 scanf作用域生命周期深度解析1 c语言中数据类型2 这些字段类型的大小又是多少呢3 计算机的大小单位4 scanf 报错下一篇前言 语言本身的学习,有两点比较…

【前端】Vue项目:旅游App-(7)city:搜索框search和标签页Tabs

文章目录目标过程与代码搜索框初步自己实现取消功能样式修改标签页效果总代码修改的文件common.csscity.vuemain.js目标 过程与代码 搜索框 初步 在Vant文档中找到搜索框:Search搜索 按照文档要求引入(如果以插件的形式安装vant就不用这样引入&#x…

c语言 动态内存分配 柔性数组

常见的动态内存错误 对null指针的解引用操作 int main()//错误1 因为没有判断 {int* p (int*)malloc(10000);int i 0;for (i 0; i < 10; i){*(p i) i;}return 0; }对动态开辟空间的越界访问 int main() {int* p malloc(10 * sizeof(int));if (p NULL){return 1;}…

5G NR标准: 第16章 初始接入

第16章 初始接入 在 NR 中&#xff0c;初始接入功能包括&#xff1a; • 设备在进入系统覆盖区域时最初找到小区的功能和过程。 • 处于空闲/非活动状态的设备访问网络的功能和程序&#xff0c;通常是请求建立连接&#xff0c;通常称为随机访问。 在相当大的程度上&#xff0…

ORA-27102:out of memory Linux-x86_64 Error: 12: Cannot allocate memory

一 问题描述 无法启动数据库&#xff0c;报错&#xff1a; 二 排查思路 1.确保sga_target,sga_max_size比可用物理内存小 2.检查kernel.shmmax&#xff0c;kernel.shmall是否设置得太小 一般出现ORA-27102&#xff1a;out of memory&#xff0c;是/etc/sysctl.conf种内核参…

Apache Tomcat 存在 JsonErrorReportValve 注入漏洞(CVE-2022-45143)

漏洞描述 Apache Zeppelin是一款基于 Web 可实现交互式数据分析的notebook产品。 在Apache Zeppelin 0.10.1及以前的版本中“Move folder to Trash”功能存在路径遍历漏洞&#xff0c;由于未对InterpreterSettingManager类remove方法中id参数进行正确校验&#xff0c;攻击者可…

看完这篇文章,我再也不用担心线上出现 CPU 性能问题了(上)

目录CPU 使用率平均负载进程上下文切换总结生产环境上出现 CPU 性能问题是非常典型的一类问题&#xff0c;往往这个时候就比较考验相关人员排查问题的能力我相信不少小伙伴在工作当中多多少少都会碰到 CPU 出现性能瓶颈 不知道小伙伴们有没有跟我一样的感受——当 CPU 出现性能…

小红书排行榜 | 粉丝增量500w+,探寻爆款种草内容密码

随着兔年来临&#xff0c;回首上个月小红书母婴动态&#xff0c;行业热度依旧高涨&#xff0c;越来越多的达人和新品牌都涌入了小红书&#xff0c;母婴品牌要如何巧用小红书数据分析工具抢占用户心智&#xff1f;增量500w&#xff0b;的母婴博主有何亮点之处&#xff1f;和我一…