作者:宇曾
布景
软件技能的开展前史,从单体的使用,逐渐演进到分布式使用, 特别是微服务理念的鼓起,让大规划、高并发、低延迟的分布式使用成为或许。云原生年代下,微服务结构自身也在不断地进化和迭代演进。
微服务结构一般会涉及到以下几个知识点:
本文咱们侧重讨论以下三大微服务结构:
- SpringCloud
- Dubbo
- ServiceMesh (新生代)
这三款不同的结构对服务办理领域的功用点掩盖度弱有差异。本文不侧重讨论这几个结构的谁优谁劣,主要来讨论下怎么从传统的微服务结构 Dubbo 、SpringCloud 无缝过渡到 ServiceMesh 架构。当下 ServiceMesh 领域最火热的项目非 Istio 莫属。
阿里云服务网格 ASM根据 Istio ,对 Istio 进行了云上保管和适配,并且新增了相关功用,以及大规划服务网格场景下的性能优化等。作为业界首个全保管 Istio 兼容的阿里云服务网格产品 ASM,一开始从架构上就坚持了与社区、业界趋势的一致性,控制平面的组件保管在阿里云侧,与数据面侧的用户集群独立。ASM 产品是根据社区 Istio 定制实现的,在保管的控制面侧供给了用于支撑精细化的流量办理和安全办理的组件才能。经过保管形式,解耦了 Istio 组件与所办理的 K8s 集群的生命周期办理,使得架构愈加灵活,提升了体系的可伸缩性。从 2022 年 4 月 1 日起,阿里云服务网格 ASM 正式推出商业化版别, 供给了更丰富的才能、更大的规划支撑及更完善的技能保证,更好地满足客户的不同需求场景, 概况可见产品介绍:
www.aliyun.com/product/ser…
下面咱们一起来看下传统微服务搬迁到服务网格技能栈会有哪些已知问题,以及阿里云服务网格 ASM 又是怎么无缝支撑 SpringCloud 、Dubbo 这些服务的。
关注【阿里云云原生】公众号,回复关键词【0621】获取文中代码压缩包下载地址!
传统微服务搬迁到服务网格的一些已知问题和场景
常见的几个问题
-
服务容器化后,服务 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 文档:
help.aliyun.com/document_de…
但该计划由于需求了解详细的服务订阅协议,现在仅支撑 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.DemoService0
dubbo:
- routes:
- match:
- method:
nameMatch:
exact: "sayHello"
argc: 1
args:
- index: 1
strValue:
patterns:
- exact: "jack"
type: java.lang.String
route:
- destination:
subset: v1
weight: 100
- match:
- method:
nameMatch:
exact: "sayHello"
argc: 1
args:
- index: 1
strValue:
patterns:
- exact: "lily"
type: java.lang.String
headers:
app:
patterns:
- exact: "consumer1"
route:
- destination:
subset: v2
weight: 100
services:
- prefix: providers:com.alibaba.edas.DemoService0
Dubbo 路由的详细 Spec 定义和比如阐明请参阅如上 Dubbo 服务办理系列文档
支撑 Dubbo + ZooKeeper
关于 Dubbo 开源用户,除了 Nacos 外,也有较多用户使用 ZooKeeper 注册中心,但ZooKeeper现在官方并未供给针对 Istio 服务发现才能,也便是 Istio 依靠的 MCP over XDS 协议的支撑。
MCPBridge 组件处理了这个问题,在阿里云服务网格 ASM 场景下,详细实现计划如下:
因注册中心的多样性,后续MCPBridge 将会提交给开源社区,欢迎咱们一起来保护。
用户能够经过下载 MCPBridgeHelm 装置包,手动装置 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: default
namespace: istio-system
spec:
registries:
- domain: mse-7e74ff00-zk.mse.aliyuncs.com ### zookeeper 地址
name: zookeeper
port: 2181
type: 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 地址 “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: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: consumerhttp
spec:
hosts:
- "*"
gateways:
- test-gateway
http:
- match:
- uri:
prefix: /sayHello
route:
- destination:
host: dubbo-consumer-zk.dubbo.svc.cluster.local ##对应consumer服务的k8s service name
port:
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/world
V2 Gray1: hello world - 172.22.32.143:20880
#curl http://$INGRESS_GATEWAY_IP/sayHello/world
V1 Gray1: hello world - 172.22.32.39:20880
更多流量办理、灰度发布、可观测比如能够参阅 Istio 以及 ASM 下Dubbo 服务办理的相关文档来装备。
总结
针对传统微服务结构 SpringCloud 和 Dubbo, 阿里云服务网格 ASM 针对客户常用的场景需求以及遇到的问题,根据 Istio 进行扩展支撑,能够无缝兼容办理 SpringCloud 、Dubbo 服务,并供给 Istio 原生的服务办理才能。
阿里云服务网格 ASM 作为保管服务网格的先行者,现已收成了很多的用户落地,这些用户愈加坚定了咱们做这个产品的决心。服务网格不再是成堆的 buzzword,而是真真实实使用到出产环境,处理服务办理领域一个又一个的技能问题。回归本质,服务网格还是要处理真真切切的事务问题。
服务网格社区在蓬勃开展,ASM 产品仍有需求完善的地方,但它现已在商场验证中获得了前行的力气。服务网格的史诗故事才刚刚开始,欢迎参加钉钉群交流讨论~