传统微服务框架如何无缝过渡到服务网格 ASM

背景

软件技术的发展历史,从单体的应用,逐渐演进到分布式应用, 特别是微服务理念的兴起,让大规模、高并发、低延迟的分布式应用成为可能。云原生时代下,微服务框架本身也在不断地进化和迭代演进。

微服务框架一般会涉及到以下几个知识点:

本文我们着重探讨以下三大微服务框架:

  • SpringCloud
  • Dubbo
  • ServiceMesh (新生代)

这三款不同的框架对服务治理领域的功能点覆盖度弱有差异。本文不着重探讨这几个框架的谁优谁劣,主要来探讨下如何从传统的微服务框架 Dubbo 、SpringCloud 无缝过渡到 ServiceMesh 架构。当下 ServiceMesh 领域最火热的项目非 Istio 莫属。

阿里云服务网格 ASM 基于 Istio ,对 Istio 进行了云上托管和适配,并且新增了相关功能,以及大规模服务网格场景下的性能优化等。作为业内首个全托管 Istio 兼容的阿里云服务网格产品 ASM,一开始从架构上就保持了与社区、业界趋势的一致性,控制平面的组件托管在阿里云侧,与数据面侧的用户集群独立。ASM 产品是基于社区 Istio 定制实现的,在托管的控制面侧提供了用于支撑精细化的流量管理和安全管理的组件能力。通过托管模式,解耦了 Istio 组件与所管理的 K8s 集群的生命周期管理,使得架构更加灵活,提升了系统的可伸缩性。从 2022 年 4 月 1 日起,阿里云服务网格 ASM 正式推出商业化版本, 提供了更丰富的能力、更大的规模支持及更完善的技术保障,更好地满足客户的不同需求场景, 详情可见产品介绍:https://www.aliyun.com/product/servicemesh

下面我们一起来看下传统微服务迁移到服务网格技术栈会有哪些已知问题,以及阿里云服务网格 ASM 又是如何无缝支持 SpringCloud 、Dubbo 这些服务的。

传统微服务迁移到服务网格的一些已知问题和场景

常见的几个问题

  • 服务容器化后,服务 deployment 滚动更新,服务实例的 IP 是经常变化的,对应服务实例IP 同步到注册中心会有延迟,这个过程会导致部分业务请求出现 503。
  • Istio 社区版本对非 HTTP 、gRPC 的其他 rpc 协议支持有限,无法提供统一形态的路由管理,以及相关治理能力。
  • 因 Istio 本身设计的服务路由模型依赖服务间请求为 ServiceName 或 ClusterIp ,SpringCloud 服务没有办法直接 Mesh 化,Dubbo 服务因基于 interface 的服务调用设计,interace 在 Dubbo 协议请求的上下文有传递,虽然不受该模式的限制,但 Istio 社区版本对 Dubbo 路由的支持却没有对应的 RDS 支持,无法直接采用社区版本的 VirtualService 配置 Dubbo 路由。

除了以上一些常见问题,还有一些具体的业务场景在业务云原生化过程中经常遇到。

场景 1:容器集群内外服务如何互通

  • 部分业务容器化,迁移到 Kubernetes 集群
  • 仍旧有一些遗留服务需要在 ECS 云主机在部署

通过 ASM 对接注册中心,可以实现容器集群内外服务互通,并且保留服务治理能力。并且容器化业务服务通过 ASM 服务网格化托管,将服务治理能力下沉到 Sidecar ,方便业务快速获得 Istio 带来的声明式配置,进行流量管理、灰度发布等服务治理编排能力,同时天然获得了对接 Trace、Log、Metrics 可观察的三大件能力。

场景 2:多语言业务互通

随着云原生化浪潮的到来,业务一般更加复杂多样,很多客户因为业务发展需要,采用了多语言甚至多套开发框架,不同的语言服务之间如何进行互联互通,或者是否有一种统一的服务框架来管理这些多语言服务?

ASM 服务网格针对以上客户的相关场景,以及遇到常见问题,基于 Istio 社区版本进行了功能扩展,可以支持 SpringCloud 、Dubbo 服务无缝迁移服务网格,也就是业务不需要进行任何代码修改,即可天然享受服务网格提供的能力,以下我们对 SpringCloud 和 Dubbo 分别进行具体的解析说明。

管理 SpringCloud 服务

SpringCloud 服务通信是采用 HTTP 协议,Istio 对 HTTP 协议的支持非常友好,我们只需要解决 Istio 如何管理 SpringCloud 服务即可,也就是解决 SpringCloud 服务请求如何适配 Istio 依赖的 Servicename 或者 ClusterIp 问题。

简单地说,就是服务网格因为采用 Sidecar 模式,需要知晓请求发出的流量目标服务是谁,并且这个信息需要在 Http 请求的 Host 字段下进行声明。

方案 1:采用 EnvoyFilter + Lua 方式

核心实现是通过 EnvoyFilter 下配置了一段 Lua 逻辑修改了服务订阅请求的返回,将服务订阅返回的目标 IP 地址修改为对应的服务名。具体 Demo 例子可以参考 ASM Help 文档: https://help.aliyun.com/document_detail/383257.html

但该方案因为需要理解具体的服务订阅协议,目前仅支持 Nacos, 不支持其他非 Nacos 注册中心,虽然我们提供了一些服务注册中心迁移的方案, 因为各方面的原因,用户可能不太想修改代码适配注册中心。基于此,我们提供了方案2 可以适配支持任意注册中心。

方案 2:通过 Reverse DNS Filter 反向查找得出 ServiceName

方案 1 目前仅能支持 Nacos , 不少用户看到后纷纷反馈是否可以支持 Eureka、ZooKeeper 等服务注册中心,基于此,我们推出了如下通用解决方案:

btw, 因为 Istio 天然支持 gRPC 协议,而 Dubbo3 新版协议 triple 基于 gRPC , Dubbo3 服务可以比较优雅的上 Mesh,

如上方案也适用于 Dubbo3 服务。

小结:通过以上两个方案(推荐使用方案 2) 我们解决了 SpringCloud 服务适配 Istio 路由模型的问题,从此 SpringCloud 就可以享受 Istio 全量的能力了,而且无需进行任何代码修改。

当然,如果用户愿意修改代码,我们更推荐客户去除原有的 SpringCloud 下的类似负载均衡、熔断、限流等相关注解,因为在 Mesh 场景下,原有的能力已经没有必要了。

方案2 ReverseDNS Filter 方案已在ASM 1.13 版本内置,预计6月底发布上线

管理 Dubbo 服务

这里我们说到 Dubbo 服务指的是 Dubbo2,Dubbo3 采用如上类似方案即可,我们也在对接 Dubbo3 社区,支持 Dubbo3 的 Proxyless Mesh 模式。目前 Dubbo2 依然存在大量的用户,因此阿里云服务网格对 Dubbo2 也提供了深度支持,以下提到的 Dubbo 都是只 Dubbo2 版本。

Dubbo 用户大多数使用 Nacos 或者 ZooKeeper 注册中心,ASM 产品层面目前支持 MSE Nacos 注册中心。

只需要简单地在 ASM 设置菜单下关联 MSE Nacos 实例即可发现对应 Nacos 下的服务信息。

支持 Dubbo + Nacos 服务迁移到 ASM

整体架构图如下:

相关文档:

  • 托管 Dubbo 服务
  • 管理 Dubbo 服务流量
  • Dubbo 服务的虚拟服务参数说明
  • 集成自建 Prometheus 实现 Dubbo服务可观测性

ASM 在 Istio 社区版本的 VirtualService 基础上扩展支持了 Dubbo 路由,一个较为复杂的配置样例如下:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: demoservice0
spec:hosts:- providers:com.alibaba.edas.DemoService0dubbo:- routes:- match:- method:nameMatch:exact: "sayHello"argc: 1args:- index: 1strValue:patterns:- exact: "jack"type: java.lang.Stringroute:- destination:subset: v1weight: 100- match:- method:nameMatch:exact: "sayHello"argc: 1args:- index: 1strValue:patterns:- exact: "lily"type: java.lang.Stringheaders:app:patterns:- exact: "consumer1"route:- destination:subset: v2weight: 100services:- prefix: providers:com.alibaba.edas.DemoService0

Dubbo 路由的具体 Spec 定义和例子说明请参考如上 Dubbo 服务治理系列文档

支持 Dubbo + ZooKeeper

对于 Dubbo 开源用户,除了 Nacos 外,也有较多用户使用 ZooKeeper 注册中心,但 ZooKeeper 目前官方并未提供针对 Istio 服务发现能力,也就是 Istio 依赖的 MCP over XDS 协议的支持。

MCPBridge 组件解决了这个问题,在阿里云服务网格 ASM 场景下,具体实现方案如下:

因注册中心的多样性,后续MCPBridge 将会提交给开源社区,欢迎大家一起来维护。

用户可以通过下载 MCPBridge Helm 安装包,手动安装 MCPBridge 到业务部署所在的 ACK 集群。

安装方法很简单,下载完成后解压 Helm 安装包,然后在目录下执行:

helm install -f values.yaml mcp-bridge .
安装完成后,mcp-bridge 会通过 SLB 提供一个 VPC 内网地址,需要将 Istiod 对应的 ConfigSource 关联该地址。ASM 此功能目前白名单开放中,需要提工单或者加文章结尾的群联系产品运维人员。

安装完成后,接着我们就可以给它配置上游注册中心地址为 ZooKeeper ,若环境没有可用的 ZooKeeper 服务器,可以通过阿里云 mse ZooKeeper 快速创建一个,如下:

给 MCPBridge 组件配置它需要关联的注册中心很简单,只需要创建一个 MCPBridge CR 即可,具体配置格式如下:

文件:zk-mcpbridge.yaml

apiVersion: istio.aliyun.cloud.com/v1
kind: McpBridge
metadata:name: defaultnamespace: istio-system
spec:registries:- domain: mse-7e74ff00-zk.mse.aliyuncs.com   ### zookeeper 地址name: zookeeperport: 2181type: zookeeper

kubectl apply -f zk-mcpbridge.yaml 生效后,MCPBridge 组件就会自动同步 ZooKeeper 下dubbo 节点下的服务信息到 istiod 了。

若想体验 MCPBridge 支持 Dubbo + ZK 的具体示例,可以下载测试示例: dubbo-zk-demo.tar.gz

文件包下面包含了上面 McpBridge 这个 yaml 配置以及测试用的 dubbo demo 服务例子。

root@service-mesh-test011122063081:~/test/mcpbridge/dubbo-zk-demo# tree .
.
├── dubbo-services.yaml                    ## dubbo + zk注册中心测试服务例子
├── zk-mcpbridge.yaml                      ## mcpbridge zk 配置,需要对应修改zk地址
└── zk-registry-service-alias.yaml         ## zk地址的服务别名,需要对应修改zk地址

接下来我们简要说明下如何来使用这个 Demo 例子。

当把 dubbo-zk-demo.tar.gz下载并解压完成后,我们首先需要将 yaml 下 zk 地址 "http://mse-7e74ff00-zk.mse.aliyuncs.com" 修改为实际对应的 zk 服务地址(该地址需要确保 MCPBridge 组件可以访问),地址修改完成后,在 dubbo-zk-demo 文件目录下执行如下命令:

kubectl create ns dubbo 
kubectl label ns dubbo istio-injection=enabled
kubectl apply -f .

然后再通过命令 kubectl get pods -n dubbo 查看确认对应 dubbo 服务 consumer 、provider 是否启动成功,

root@service-mesh-test011122063081:~/test/mcpbridge# kubectl get pods -n dubbo
NAME                                    READY   STATUS    RESTARTS   AGE
dubbo-consumer-zk-5cd8f6c6bf-bscd2      2/2     Running   0          83m
dubbo-provider-zk-v1-54cd888957-k7bg4   2/2     Running   0          83m
dubbo-provider-zk-v2-cf58ccc79-sg94l    2/2     Running   0          83m

启动成功后,我们回到 Zookeeper 下,可以看到已经有服务注册信息报上来了:(dubbo 节点下)

接着,我们将 consumer 服务映射到 ASM 网关下进行测试访问,通过 ASM 控制台我们可以快速地创建一个 ASM 网关,若是采用 CICD 或者 GitOps 等方案,也可以直接通过创建 IstioGateway Yaml 的方式来创建。

网关实体创建成功后(gateway deployment、svc 等),我们还需要配置逻辑网关,只需要两步即可;

  • 创建一个网关规则(istio 下的 gateway CRD), 声明一个逻辑网关,以及这个逻辑网关(test-gateway) 绑定的具体域名和声明端口以及协议类型
  • 配置网关路由,将 /sayHello 请求转发给 dubbo-consumer-zk.dubbo.svc.cluster.local 目标服务

网关规则和网关路由可以参考如下 Yaml, 我们只需将这个 Yaml 保存为本地文件,然后在 asm 集群下 kubectl apply 即可。

---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: test-gateway
spec:selector:istio: ingressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- "*"---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: consumerhttp
spec:hosts:- "*"gateways:- test-gatewayhttp:- match:- uri:prefix: /sayHelloroute:- destination:host: dubbo-consumer-zk.dubbo.svc.cluster.local ##对应consumer服务的k8s service nameport:number: 17080

网关规则和路由配置生效后,我们可以通过浏览器或者终端命令方式:

curl http://$INGRESS_GATEWAY_IP/sayHello/world 来访问前面部署的 Dubbo demo 服务,执行如下命令,可以看到执行后输出的相关结果:前后请求两次负载均衡到了 Provider 的 v1 、v2 版本。

 #export INGRESS_GATEWAY_IP=YOUR_GATEWAY_IP#curl http://$INGRESS_GATEWAY_IP/sayHello/worldV2 Gray1: hello world - 172.22.32.143:20880#curl http://$INGRESS_GATEWAY_IP/sayHello/worldV1 Gray1: hello world - 172.22.32.39:20880

更多流量管理、灰度发布、可观测例子可以参考 Istio 以及 ASM 下 Dubbo 服务治理的相关文档来配置。

总结

针对传统微服务框架 SpringCloud 和 Dubbo, 阿里云服务网格 ASM 针对客户常用的场景需求以及遇到的问题,基于 Istio 进行扩展支持,可以无缝兼容管理 SpringCloud 、Dubbo 服务,并提供 Istio 原生的服务治理能力。

阿里云服务网格 ASM 作为托管服务网格的先行者,已经收获了大量的用户落地,这些用户更加坚定了我们做这个产品的信心。服务网格不再是成堆的 buzzword,而是真真实实应用到生产环境,处理服务治理领域一个又一个的技术问题。回归本质,服务网格还是要解决真真切切的业务问题。

作者:宇曾

原文链接

本文为阿里云原创内容,未经允许不得转载。

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

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

相关文章

基于 K8s 的交付难题退退退!

大家好,我是专注于交付的王小锤,看过交付铁三角系列故事(专注交付的我小锤,开发老哥铁子和售前大佬强哥)的同学想必都知道,我们三人服务于一家提供大数据分析服务的 ISV 企业,在应用交付过程中时…

小迈科技 X Hologres:高可用的百亿级广告实时数仓建设

通过本文,我们将会介绍小迈科技如何通过Hologres搭建高可用的实时数仓。 一、业务介绍 小迈科技成立于 2015 年 1 月,是一家致力以数字化领先为优势,实现业务高质量自增长的移动互联网科技公司。始终坚持以用户价值为中心,以数据…

移动云探索自主技术核心地带,拥抱开发者共筑全新技术生态

在数字经济向更多新领域渗透,5G、物联网等数字经济核心技术应用加速的助推下,云计算作为最主流的算力解决方案,需求增长迅速。随着国内云计算技术生态发展的不断成熟,各行各业上云的步伐也在不断加快。同时,由于企业的…

深度解读 RocketMQ 存储机制

RocketMQ 实现了灵活的多分区和多副本机制,有效的避免了集群内单点故障对于整体服务可用性的影响。存储机制和高可用策略是 RocketMQ 稳定性的核心,社区上关于 RocketMQ 目前存储实现的分析与讨论一直是一个热议的话题。本文想从一个不一样的视角&#x…

IOC-golang 的 AOP 原理与应用

AOP 与 IOC 的关系 AOP (面向切面编程)是一种编程设计思想,旨在通过拦截业务过程的切面,实现特定模块化的能力,降低业务逻辑之间的耦合度。这一思路在众多知名项目中都有实践。例如 Spring 的切点 PointCut 、 gRPC的…

达摩院技术创新全景|懂你的语音AI

过去十年,语音AI从实验室走向应用,语音搜索、交互早已融入日常。本文将带你一览达摩院语音AI技术创新全景,一起感受能听、会说、懂你的语音AI。 当你在家中与智能音箱进行交互对话,当你使用天猫超市或菜鸟裹裹,接到机器…

闲鱼对 Flutter-Native 混合工程解耦的探索

1. 闲鱼Flutter现状 闲鱼是第一个使用Flutter混合开发的大型应用,但闲鱼客户端开发最深入体会的痛点就是编译时长影响开发体验。在FlutterNative这种开发模式下,Native编译速度慢,模块开发无法突破。闲鱼集成了集团众多中间件,很…

算法通关第二十关-青铜挑战认识图结构

大家好我是苏麟 , 今天来聊聊图结构 . 我们平时在工作、学习中会大量使用图结构,不过呢在使用代码进行具体实现的时候极少使用图,主要是图里容易产生环,难以处理。 在算法里,考察图也不是很多,主要是图的表示非常复杂&…

我的前端成长之路:中医药大学毕业的业务女前端修炼之路

大家好,我是风月,2014年二进宫进入阿里,目前是业务平台体验技术数据服务前端团队负责人,负责 BizCharts 横向建设以及财鲸数据业务支撑。本次分享我将回顾作为业务前端从前端工程转型到数据可视化过程中的心路历程。 前端工程师的…

过去5年,PolarDB云原生数据库是如何进行性能优化的?

云数据库实现计算存储分离,支持计算与存储的独立扩展,其用户还可以享受按量付费等特性。这使得基于云数据库的系统更加高效、灵活。因此,构建并使用云原生数据库的势头愈演愈烈。另一方面,云化存储服务已经是云的标准能力&#xf…

ChatGPT 玩「脱」了,写了份毁灭人类计划书,还遭到了 Stack Overflow 的封杀.........

【CSDN 编者按】OpenAI 的新通用聊天机器人原型 ChatGPT 可谓是风靡一时,但却突遭 StackOverflow 封禁。整理 | 刘春霖 责编 | 张红月出品 | CSDN(ID:CSDNnews)在上周发布的《挑战 Google 搜索?OpenAI 发布最强 …

基于任务调度的企业级分布式批处理方案

背景 先来谈下什么是分布式批处理,从字面来理解就是有大批量的业务数据需要应用程序去批量计算处理,而通过单机模式去执行会耗费很长的处理时间,也不能充分发挥业务集群中每个应用节点处理能力。通过一些常见的分布式批处理方案,…

如何用一个插件解决 Serverless 灰度发布难题?

导读本文适合:想了解 Serverless 灰度发布的同学。认为当前 Serverless 灰度发布配置太复杂,寻求简洁版灰度发布流程的同学。想了解 Serverless Devs 组件和插件之间关系的同学。Serverless 灰度发布 什么是 Serverless ? Serverless 顾名思义就是无服…

阿里云云原生一体化数仓 — 分析服务一体化新能力解读

分析服务一体化一直都是阿里云离线实时一体化数仓的重要能力创新 分析服务一体化需求分析 业务在线化、运营精细化驱动数据实时化 随着互联网的信息,业务对于在线化、运营精细化的需求日益强烈,领导驾驶舱、实时大屏等,起到了越来越重要的…

一位 sealer maintainer 的心路历程

引言 在 2021 年四月左右,我有幸在 sealer 启动初期了解到其相关工作,并且不久后就作为初始的几位开发同学之一,加入到了 sealer 的开发工作中。 本文,我将回顾个人参与 sealer 开源项目的机缘巧合,参与过程中的挑战…

龙蜥社区开源 coolbpf,BPF 程序开发效率提升百倍

引言 BPF 是一个新的动态跟踪技术,目前这项技术正在深刻的影响着我们的生产和生活。BPF 在四大应用场景发挥着巨大作用: 系统故障诊断:它可以动态插桩透视内核。网络性能优化:它可以对接收和发送的网络包做修改和转发。系统安全…

线上故障突突突?如何紧急诊断、排查与恢复

概述 稳定性大于一切,因此我们需要有更有效的方式避免线上故障。在发生故障不可避免的假设下,我们需要能够快速修复,减少线上影响。基于以上这些想法,我们提出了 1-5-10 的快恢目标,所谓 1-5-10 的目标就是是要我们对…

巧用 API 网关构建大型应用体系架构

近期阿里云重磅发布了BizWorks一体化的云原生应用的开发和运营平台,内置阿里巴巴业务中台构建的最佳技术实践。BizWorks提供的产品能力,普遍适用于企业云原生应用高效开发以及企业业务能力沉淀和复用的场景。BizWorks提供业务架构师一整套的可视化业务建…

可观测|时序数据降采样在 Prometheus 实践复盘

基于 Prometheus 的监控实践中,尤其是在规模较大时,时序数据的存储与查询是其中非常关键,而且问题点较多的一环。如何应对大数据量下的长周期查询,原生的 Prometheus 体系并未能给出一个令人满意的答案。对此,ARMS Pro…

倒计时1天!中国移动算力网络创新成果即将发布!

数字时代,随着计算机技术的普及,电脑及相关电子产品日新月异,给人们日常生活带来了翻天覆地的变化。多样化的电脑功能提高了各项事务协同管理的便捷性,电脑游戏也极大地丰富了人们的娱乐生活。未来电脑又会使人们的办公模式、娱乐…