云小蜜 Dubbo3.0 实践:从微服务迁移上云到流量治理

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
可观测监控 Prometheus 版,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 阿里云-达摩院-云小蜜对话机器人产品基于深度机器学习技术、自然语言理解技术和对话管理技术,为企业提供多引擎、多渠道、多模态的对话机器人服务。17 年云小蜜对话机器人在公共云开始公测,同期在混合云场景也不断拓展。为了同时保证公共云、混合云发版效率和稳定性,权衡再三我们采用了 1-2 个月一个大版本迭代。

01

前言


阿里云-达摩院-云小蜜对话机器人产品基于深度机器学习技术、自然语言理解技术和对话管理技术,为企业提供多引擎、多渠道、多模态的对话机器人服务。17 年云小蜜对话机器人在公共云开始公测,同期在混合云场景也不断拓展。为了同时保证公共云、混合云发版效率和稳定性,权衡再三我们采用了 1-2 个月一个大版本迭代。


经过几年发展,为了更好支撑业务发展,架构升级、重构总是一个绕不过去的坎,为了保证稳定性每次公共云发版研发同学都要做两件事:


1. 梳理各个模块相较线上版本接口依赖变化情况,决定十几个应用的上线顺序、每批次发布比例;

2. 模拟演练上述1产出的发布顺序,保证后端服务平滑升级,客户无感知。

上述动作每次都需要 2-3 周左右的时间梳理、集中演练,但是也只能保证开放的 PaaS API 平滑更新。

控制台服务因为需要前端、API、后端保持版本一致才能做到体验无损(如果每次迭代统一升级 API 版本开发、协同成本又会非常大),权衡之下之前都是流量低谷期上线,尽量缩短发布时间,避免部分控制台模块偶发报错带来业务问题。


针对上面问题,很早之前就考虑过用蓝绿发布、灰度等手段解决,但是无奈之前对话机器人在阿里云内部业务区域,该不再允许普通云产品扩容,没有冗余的机器,流量治理完全没法做。


迁移阿里云云上


带着上面的问题,终于迎来的 2021 年 9 月份,云小蜜将业务迁移至阿里云云上。

Dubbo 3.0 的实践


“当时印象最深的就是这张图,虽然当时不知道中间件团队具体要做什么事情,但是记住了两个关键词:三位一体、红利。没想到在 2021 年底,真真切切享受到了这个红利。”


1.png


云小蜜使用的是集团内部的 HSF 服务框架,需要迁移至阿里云云上,并且存在阿里云云上与阿里内部业务域的互通、互相治理的诉求。云小蜜的公共服务部署在公有云 VPC,部分依赖的数据服务部署在内部,内部与云上服务存在 RPC 互调的诉求,其实属于混合云的典型场景。


简单整理了下他们的核心诉求,概括起来有以下三点:

1. 希望尽可能采用开源方案,方便后续业务推广;

2. 在网络通信层面需要保障安全性;

3. 对于业务升级改造来说需要做到低成本。


2.png


在此场景下,经过许多讨论与探索,方案也敲定了下来:

  • 全链路升级至开源 Dubbo3.0,云原生网关默认支持 Dubbo3.0,实现透明转发,网关转发 RT 小于 1ms;
  • 利用 Dubbo3.0 支持 HTTP2 特性,云原生网关之间采用 mTLS 保障安全;
  • 利用云原生网关默认支持多种注册中心的能力,实现跨域服务发现对用户透明,业务侧无需做任何额外改动;
  • 业务侧升级 SDK 到支持 Dubbo3.0,配置发布 Triple 服务即可,无需额外改动。


解决了互通、服务注册发现的问题之后,就是开始看如何进行服务治理方案了。

03

阿里云云上流量治理


迁移至阿里云云上之后,流量控制方案有非常多,比如集团内部的全链路方案、集团内单元化方案等等。

设计目标和原则


1. 要引入一套流量隔离方案,上线过程中,新、旧两个版本服务同时存在时,流量能保证在同一个版本的“集群”里流转,这样就能解决重构带来的内部接口不兼容问题;2. 要解决上线过程中控制台的平滑性问题,避免前端、后端、API更新不一致带来的问题;3. 无上线需求的应用,可以不参与上线;4. 资源消耗要尽量少,毕竟做产品最终还是要考虑成本和利润。


方案选型


1. 集团内部的全链路方案:目前不支持阿里云云上;

2. 集团内单元化方案:主要解决业务规模、容灾等问题,和我们碰到的问题不一样;

3. 搭建独立集群,版本迭代时切集群:成本太大;

4. 自建:在同一个集群隔离新、老服务,保证同一个用户的流量只在同版本服务内流转


以 RPC 为例:


方案一:通过开发保证,当接口不兼容升级时,强制要求升级 HSF version,并行提供两个版本的服务;缺点是一个服务变更,关联使用方都要变更,协同成本特别大,并且为了保持平滑,新老接口要同时提供服务,维护成本也比较高。方案二:给服务(机器)按版本打标,通过 RPC 框架的路由规则,保证流量优先在同版本内流转。


全链路灰度方案


就当 1、2、3、4 都觉得不完美,一边调研一边准备自建方案 5 的时候,兜兜绕绕拿到了阿里云 MSE 微服务治理团队《如何用20分钟就能获得同款企业级全链路灰度能力?》,方案中思路和准备自建的思路完全一致,也是利用了 RPC 框架的路由策略实现的流量治理,并且实现了产品化(微服务引擎-微服务治理中心),同时,聊了两次后得到几个“支持”,以及几个“后续可以支持”后,好像很多事情变得简单了...


image.gif3.png


从上图可以看到,各个应用均需要搭建基线(base)环境和灰度(gray)环境,除了流量入口-业务网关以外,下游各个业务模块按需部署灰度(gray)环境,如果某次上线某模块没有变更则无需部署。

  • 各个中间件的治理方案


1. Mysql、ElasticSearch:持久化或半持久化数据,由业务模块自身保证数据结构兼容升级;


2. Redis:由于对话产品会有多轮问答场景,问答上下文是在 Redis 里,如果不兼容则上线会导致会话过程中的 C 端用户受影响,因此目前 Redis 由业务模块自身保证数据结构兼容升级;


3. 配置中心:基线(base)环境、灰度(gray)环境维护两套全量配置会带来较大工作量,为了避免人工保证数据一致性成本,基线(base)环境监听 dataId,灰度(gray)环境监听 gray.dataId 如果未配置 gray.dataId 则自动监听 dataId;(云小蜜因为在 18 年做混合云项目为了保证混合云、公共云使用一套业务代码,建立了中间件适配层,本能力是在适配层实现)


4. RPC 服务:使用阿里云 one agent 基于 Java Agent 技术利用 Dubbo 框架的路由规则实现,无需修改业务代码;


应用只需要加一点配置:


1)linux 环境变量  alicloud.service.tag=gray 标识灰度,基线无需打标profiler.micro.service.tag.trace.enable=true 标识经过该机器的流量,如果没有标签则自动染上和机器相同的标签,并向后透传


2)JVM 参数,标识开启 MSE 微服务流量治理能力SERVICE_OPTS="${SERVICE_OPTS} -Dmse.enable=true"


  • 流量管理方案


流量的分发模块决定流量治理的粒度和管理的灵活程度。


对话机器人产品需要灰度发布、蓝绿发布目前分别用下面两种方案实现:


1. 灰度发布:

部分应用单独更新,使用 POP 的灰度引流机制,该机制支持按百分比、UID 的策略引流到灰度环境


2. 蓝绿发布:
1)部署灰度(gray)集群并测试:测试账号流量在灰度(gray)集群,其他账号流量在基线(base)集群


2)线上版本更新:所有账号流量在灰度(gray)集群


3)部署基线(base)集群并测试:测试账号流量在基线(base)集群,其他账号流量在灰度(gray)集群


4)流量回切到基线(base)集群并缩容灰度(gray)环境:所有账号流量在基线(base)集群


全链路落地效果


上线后第一次发布的效果:“目前各个模块新版本的代码已经完成上线,含发布、功能回归一共大约花费 2.5 小时,相较之前每次上线到凌晨有很大提升。”


MSE 微服务治理全链路灰度方案满足了云小蜜业务在高速发展情况下快速迭代和小心验证的诉求,通过 JavaAgent 技术帮助云小蜜快速落地了企业级全链路灰度能力。


流量治理随着业务发展会有更多的需求,下一步,我们也会不断和微服务治理产品团队,扩充此解决方案的能力和使用场景,比如:RocketMQ、SchedulerX 的灰度治理能力。


更多的微服务治理能力


使用 MSE 服务治理后,发现还有更多开箱即用的治理能力,能够大大提升研发的效率。包含服务查询、服务契约、服务测试等等。这里要特别提一下就是云上的服务测试,服务测试即为用户提供一个云上私网 Postman ,让我们这边能够轻松调用自己的服务。我们可以忽略感知云上复杂的网络拓扑结构,无需关系服务的协议,无需自建测试工具,只需要通过控制台即可实现服务调用。支持 Dubbo 3.0 框架,以及 Dubbo 3.0 主流的 Triple 协议。


4.png

04

结束语


最终云小蜜对话机器人团队成功落地了全链路灰度功能,解决了困扰团队许久的发布效率问题。在这个过程中我们做了将部分业务迁移至阿里云云上、服务框架升级至 Dubbo3.0、选择 MSE 微服务治理能力等等一次次新的选择与尝试。“世上本没有路,走的人多了便成了路”。经过我们工程师一次又一次的探索与实践,能够为更多的同学沉淀出一个个最佳实践。我相信这些最佳实践将会如大海中璀璨的明珠般,经过生产实践与时间的打磨将会变得更加熠熠生辉。

相关实践学习
阿里巴巴智能语音交互技术与应用
智能语音交互,是基于语音识别、语音合成、自然语言理解等技术,为企业在多种实际应用场景下,赋予产品“能听、会说、懂你”式的智能人机交互体验。适用于多个应用场景中,包括智能问答、智能质检、法庭庭审实时记录、实时演讲字幕、访谈录音转写等。 本课程主要讲解智能语音相关技术,包括语音识别、人机交互、语音合成等。  
相关文章
|
6天前
|
API 持续交付 开发者
后端开发中的微服务架构实践与挑战
在数字化时代,后端服务的构建和管理变得日益复杂。本文将深入探讨微服务架构在后端开发中的应用,分析其在提高系统可扩展性、灵活性和可维护性方面的优势,同时讨论实施微服务时面临的挑战,如服务拆分、数据一致性和部署复杂性等。通过实际案例分析,本文旨在为开发者提供微服务架构的实用见解和解决策略。
|
7天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
2天前
|
消息中间件 设计模式 运维
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过实际案例分析,揭示了其在提升系统灵活性、可扩展性及促进技术创新方面的显著优势。同时,文章也未回避微服务实施过程中面临的挑战,如服务间通信复杂性、数据一致性保障及部署运维难度增加等问题,并基于实践经验提出了一系列应对策略,为开发者在构建高效、稳定的微服务平台时提供有价值的参考。 ####
|
3天前
|
消息中间件 监控 数据管理
后端开发中的微服务架构实践与挑战####
【10月更文挑战第29天】 在当今快速发展的软件开发领域,微服务架构已成为构建高效、可扩展和易于维护应用程序的首选方案。本文探讨了微服务架构的核心概念、实施策略以及面临的主要挑战,旨在为开发者提供一份实用的指南,帮助他们在项目中成功应用微服务架构。通过具体案例分析,我们将深入了解如何克服服务划分、数据管理、通信机制等关键问题,以实现系统的高可用性和高性能。 --- ###
22 2
|
4天前
|
监控 安全 应用服务中间件
微服务架构下的API网关设计策略与实践####
本文深入探讨了在微服务架构下,API网关作为系统统一入口点的设计策略、实现细节及其在实际应用中的最佳实践。不同于传统的摘要概述,本部分将直接以一段精简的代码示例作为引子,展示一个基于NGINX的简单API网关配置片段,随后引出文章的核心内容,旨在通过具体实例激发读者兴趣,快速理解API网关在微服务架构中的关键作用及实现方式。 ```nginx server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_service:5000;
|
8天前
|
Kubernetes Cloud Native API
云原生架构下微服务治理的深度探索与实践####
本文旨在深入剖析云原生环境下微服务治理的核心要素与最佳实践,通过实际案例分析,揭示高效、稳定的微服务架构设计原则及实施策略。在快速迭代的云计算领域,微服务架构以其高度解耦、灵活扩展的特性成为众多企业的首选。然而,伴随而来的服务间通信、故障隔离、配置管理等挑战亦不容忽视。本研究聚焦于云原生技术栈如何赋能微服务治理,涵盖容器编排(如Kubernetes)、服务网格(如Istio/Envoy)、API网关、分布式追踪系统等关键技术组件的应用与优化,为读者提供一套系统性的解决方案框架,助力企业在云端构建更加健壮、可维护的服务生态。 ####
|
9天前
|
监控 安全 Cloud Native
云原生安全:Istio在微服务架构中的安全策略与实践
【10月更文挑战第26天】随着云计算的发展,云原生架构成为企业数字化转型的关键。微服务作为其核心组件,虽具备灵活性和可扩展性,但也带来安全挑战。Istio作为开源服务网格,通过双向TLS加密、细粒度访问控制和强大的审计监控功能,有效保障微服务间的通信安全,成为云原生安全的重要工具。
28 2
|
12天前
|
缓存 运维 监控
后端开发中的微服务架构实践与挑战#### 一、
【10月更文挑战第22天】 本文探讨了微服务架构在后端开发中的应用实践,深入剖析了其核心优势、常见挑战及应对策略。传统后端架构难以满足快速迭代与高可用性需求,而微服务通过服务拆分与独立部署,显著提升了系统的灵活性和可维护性。文章指出,实施微服务需关注服务划分的合理性、通信机制的选择及数据一致性等问题。以电商系统为例,详细阐述了微服务改造过程,包括用户、订单、商品等服务的拆分与交互。最终强调,微服务虽优势明显,但落地需谨慎规划,持续优化。 #### 二、
|
13天前
|
运维 Cloud Native API
云原生时代下的微服务架构实践
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术正以前所未有的速度重塑软件开发和运维的模式。微服务架构作为云原生的重要组成部分,其设计哲学、技术栈选择以及与传统单体应用的根本区别成为了现代软件工程讨论的焦点。本文将深入探讨微服务架构的核心概念,通过实际案例分析其在云平台下的应用,并分享在实施过程中的经验教训,旨在为读者提供一套清晰的微服务架构实践指南。
|
7天前
|
设计模式 人工智能 API
后端开发中的微服务架构实践与挑战#### 一、
本文将深入浅出地探讨微服务架构在后端开发中的应用实践,分析其带来的优势与面临的挑战。通过具体案例,展示如何有效地构建、部署和管理微服务,旨在为读者提供一份实用的微服务架构实施指南。 #### 二、