微服务治理之全链路灰度|学习笔记(三)

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 快速学习微服务治理之全链路灰度

开发者学堂课程【微服务治理之全链路灰度微服务治理之全链路灰度】学习笔记,与课程紧密联系,让用户快速学习知识。  

课程地址:https://developer.aliyun.com/learning/course/973/detail/14894


微服务治理之全链路灰度


sdk在客户体验方面因为业务代码需要感知到sdk的逻辑,并且需要开发人员去维护所以体验相对较差,稳定性也比较低。这相当于模改了开源的开发框架,重新写了一些新的路由逻辑,这导致会覆盖一些开发框架原生的逻辑稳定性需要由开发者自己保定。

支持成本比较低,因为以sdk的形式进行集成白盒由于sdk业务方自己实现,自主可控性能基于S P I的动态加载,性能比较高。

JavaAgent无感知的,是无侵入的方案。支持成本因为可能会去占用一些额外的计算逻辑是无信用的客户代码不透明,所以它是一个黑盒。但是性能比较高。多语言这方面目前只支持java。

Mesh是在每个服务旁额外部署了一个proxy,然后proxy去拦截服务的所有的出口流量,也是一个无侵入的方案,并且它是一个语言无关的方案。白盒程度低,因为用户不了解proxy的实现。性能方面相比于前有的方案比较低,因为在整个链路中,每经过服务链时流量都会被转移到这个proxy稳定性高:因为如果想要在真实业务场景去落地istio的话,需要对开源进行做改造成本

可以使用阿里MSE服务治理帮用户做这一切。Mesh也可以,如果不想去操作service mesh 的整体,不管是部署还是成本都很高可以试用一下阿里云服务网格ASM产品,它在产品化上用户友好都做了很大的提升。

 

五、流量入口:网关

图片18.png

流量入口对网关的要求比较高,因为在全链路灰度的场景中要求微服务网关具有丰富的量治理能力需要支持路由因为后端服务可能有v1v2版本希望网关能够去通过一些匹配规则路由到对应的版本上,需要对一些特定路由规则的请求进行动态达标。如果某些经过前端流量无法进行一些流量染色,那么经过网关可以由网关来进行自动染色,需要用到网关的一些头部控制能力。

接下来是入口服务可见性问题,因为在架构中采用的注册中心不同,所以要求网关能够支持多注册中心安全性是指网关能够对入口流量进行统一的认证健全保障业务系统不被非法流量入侵。

般情况下业务会采用流量网关加微服务网关两层架构,微服网关主要负责南北向流量调度和一些安全防护,在每个集群里会额外部署一个微服务网关做东西向流量以及一些治理。业务比较紧耦合在容器跟k8s主导的原生时代,ingress成为k8s生态的网关标准使得流量网关微服网关二合一成为可能。针对场景出于减少用户成本能力不打折支持流量治理服务发现认证健安全控制这些能力,将网关合并成一层,不仅可以节省50%的资源成本,而且可以降低运维及其实用成本。

更重要的是原生网关可以支持与后端微服务治理联动实现端到端全面的度,无论后端采用的是基于javaAgent的方式,还是采用服务网格网关都无缝支持。

阿里云MSE原生网关

1. 低成本

2. 高性能

3. 高可用

4. 高集成

5. 高扩展

 

六、从0到1实践全链路灰度

场景一:

如下图所示::

图片19.png

业务场景一现在三个服务ABC三个java服务,使用注册中心NACOS。每个服务都有一个灰度版本对于正式版本的正式环境的服务,通过base.example.com来访问对于灰度环境这些服务通过gray.example.com访问

那么如何通过原生网关和MSE服务治理来实现流量控制问题呢

首先需要确保已经有原生网关并且开启了MSE服务治理还要有一个ack集群,并且需要安装mse pilot

图片20.png

外需要NACOS注册中心,因为ABC三个后端服务使用NACOS中心。

图片21.png

并且需要一个关,端到端的去实全链路度。

图片22.png

图上是已买好的网关。之后关联已有的NACOS,通过网关通知服务来源

之后在集群test-yang-1上进行部署三个服务,此处演示kubectl的操作。截取一段代码演示如下:

strategy:

template:

metadata :

annotations :

alicloud.service.tag: gray

msePilotCreateAppName: spring-cloud-a

labels:

app: spring-cloud-a-new

spec :

containers :

env:

-name: LANG

value: C.UTF-8

-name: JAVA_HOME

value: /usr/lib/jvm/java-1.8-openjdk/jre

-name: profiler.micro.service.tag.trace.enable

value: "true"

-name: spring.cloud.nacos.discovery.server-addr

value: mse-455e0c20-nacos-ans.mse.aliyuncs.com: 8848

-name: spring.cloud.nacos.discovery.metadata.version    value: gray

代码mse.yaml中ABC三个服务都有base和gray版本,注册中心需要换成自己的注册中心。对于入口服务A,因为云原生网关对于路由需要版本标,在业务容器的环境变量中使用节点打标的技术为入口服务进行环境打标。同时需要开启mse的链路传递去传递灰度标。

代码所示的tag使用pod注解的形式来打。

现在需要apply资源。

输入k apply -f mse.yaml

结果如下

图片23.png

输入k get pod

结果如下

图片24.png

等到全部运行状态为running时,可以看到A有两个服务,B也有两个不同版本,C也有两个不同版本。

回到云原生网关将服务A导入

图片25.png

接下来创建两个域名,我们希望base.example.com流量访问到ABC的正式环境,gray.example.com流量访问到ABC的灰度环境。

创建域名:

图片26.png

图片27.png

然后在服务列表中关联版本,点击添加新版本,版本名称为base,标签名为version,标签值为base,保存成功后再创建gray版本:版本名称为gray,标签名为version,标签值为gray,保存。

创建成功后创建路由:

图片28.png

目标服务选择标签路由,添加目标服务sc-A,版本base,权重100,创建完成后点击发布。

发布成功后进行访问,在代码中输入

curl -v -H “host:base.example.com”118.31.118.69/a

图片29.png

可以看到请求是ABC,流量在正式环境中流转,再访问还是ABC。接下来访问灰度环境的域名:

创建灰度环境的路由,路由名称为gray,关联域名为gray.example.com,路径为精确匹配,匹配值为/a,添加目标服务为标签路由,服务为sc-A,版本为gray,创建完成后进行发布。

再在代码中输入:

curl -H “host:gray.example.com”118.31.118.69/a

显示结果ABC都在gray环境中。

场景二

图片30.png

场景二的业务只有一个域名,没有灰度域名,那么可以在前端访问流量时带上灰度标识x-mse-tag:gray,代理该流量标的请求路由到灰度环境并且在整个灰度环境中流转。

回到云原生网关,下线gray路由,再创建路由,路由名称为tag.gray,关联域名为base.example.com,匹配路径为精确匹配,值为/a,在请求头上添加一个匹配,Header Key为x-mse-tag,条件为精确匹配,值为gray,添加目标服务,服务为sc-A,版本为gray,创建成功后发布。

首先来访问正式环境不带tag标识:输入

curl -H “host:base.example.com”118.31.118.69/a

结果显示正常ABC流向,再输入

curl -H “host:base.example.com”-H “x-mse-tag:gray”118.31.118.69/a

结果如图在灰度环境中进行流转

图片31.png

场景三

图片32.png

第三个场景我们想要利用一些已有的请求信息来做灰度路由,对于x-user-id:100路由到灰度环境,其他在正式环境中流转。

在云原生网关上进行修改tag-gray,修改Header Key为x-user-id,值为100,创建成功后进行发布。

在代码上先访问正式环境,输入

curl -H “host:base.example.com”118.31.118.69/a

结果显示在正常环境中进行流转,再来用已有的用户标来做灰度路由,输入

curl -H “host:base.example.com”-H “x-user-id:100”118.31.118.69/a

结果显示在灰度环境中进行路由符合预期

场景四

图片33.png

在之前的场景中ABC都有灰度版本,现在只需要对AC进行灰度验证,B只有一个基建版本,我们期望流向带有x-user-id:100请求的链路经过云原生网关到A的灰度版本到B的基建版本再到C的灰度版本。其他链路请求在正常环境中进行流转。

因为之前已经部署过B的灰度版本,先来删掉,查看当前集群中的deployment,输入

k get deployment

结果显示如图

图片34.png

删掉B的灰度版本,输入

k delete deployment spring-cloud-b-new

删掉后查看状态,输入

k get pod

处于running状态,由于在之前的灰度版本中已经部署好所以不需要在云原生网关上再修改路由,只需要到终端上进行验证,输入

curl -H “host:base.example.com”-H “x-user-id:100”118.31.118.69/a

结果显示后端的正确流向是a的灰度,B的正式,然后C的灰度。a从灰度环境打向B的正式使用自动容灾,因为灰度环境中没有B的版本。

再来访问其他user-id,输入

curl-H“host:base.example.com”-H “x-user-id:101”118.31.118.69/a

结果显示全部在正式环境中

图片35.png

相关文章
|
4月前
|
Kubernetes 测试技术 数据库
详解微服务应用灰度发布最佳实践
相对于传统软件研发,微服务架构下典型的需求交付最大的区别在于有了能够小范围真实验证的机制,且交付单位较小,风险可控,灰度发布可以弥补线下测试的不足。本文从 DevOps 视角概述灰度发布实践,介绍如何将灰度发布与 DevOps 工作融合,快来了解吧~
31056 18
|
4月前
|
监控 Kubernetes Cloud Native
云原生架构下的微服务治理之道
【7月更文挑战第30天】在数字化转型的浪潮中,企业级应用正迅速向云原生架构迁移。本文将深入探讨云原生环境下微服务治理的最佳实践,包括服务发现、配置管理、流量控制等关键策略,并结合实例分析如何在保障系统弹性、可维护性的同时,优化资源利用效率和加快业务创新速度。
52 2
|
4月前
|
运维 Kubernetes Cloud Native
云原生架构下的微服务治理之道
【7月更文挑战第20天】在数字化转型的浪潮中,企业纷纷拥抱云原生,以期实现更高效的资源利用、更快的业务迭代和更强的系统稳定性。本文将深入探讨如何通过云原生架构优化微服务的治理,确保系统的高可用性和可维护性,同时提升开发效率和运维灵活性。我们将从微服务治理的核心原则出发,结合具体案例,分析在云环境中实施微服务治理的策略与挑战。
53 2
|
4月前
|
监控 Cloud Native 安全
云原生架构下的微服务治理实践
在数字化转型的浪潮中,云原生技术以其灵活性和可扩展性成为现代软件工程的基石。本文将深入探讨云原生架构下微服务治理的实践路径,从微服务的拆分、容器化部署、服务网格的应用到最终的监控与故障排除,提供一套全面的方法论。文章旨在为读者呈现一个清晰的云原生环境下,如何高效管理和维护微服务系统的全景图。
61 2
|
4月前
|
负载均衡 Cloud Native 云计算
云原生架构下的微服务治理与挑战
随着云计算技术的不断演进,云原生架构已成为现代应用开发的首选模式。本文将深入探讨在云原生环境下,微服务治理的重要性、实现方法及所面临的挑战。通过分析微服务治理的关键要素如服务发现、配置管理、负载均衡和故障转移等,揭示如何在高度动态的云环境中保持服务的高可用性和灵活性。同时,本文也将指出在实施微服务治理过程中可能遇到的技术难题和应对策略,为构建健壮的云原生应用提供指导。
|
4月前
|
监控 负载均衡 Java
Spring Boot与微服务治理框架的集成
Spring Boot与微服务治理框架的集成
|
5月前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【6月更文挑战第30天】Spring Cloud是Java微服务治理明星框架,整合Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(断路器)、Zuul(API网关)和Config Server(配置中心),提供完整服务治理解决方案。通过Eureka实现服务注册与发现,Ribbon进行负载均衡,Hystrix确保服务容错,Config Server集中管理配置,Zuul则作为API入口统一处理请求。理解和使用Spring Cloud是现代Java开发者的关键技能。
132 2
|
4月前
|
负载均衡 Java Nacos
Spring Boot与微服务治理框架的集成策略
Spring Boot与微服务治理框架的集成策略
|
5月前
|
Kubernetes 监控 Cloud Native
云原生架构下的微服务治理实践
【6月更文挑战第23天】在云计算的浪潮中,云原生架构以其弹性、可扩展性和高效性成为企业数字化转型的重要推手。本文将深入探讨如何利用云原生技术实现微服务的治理与优化,确保系统的稳定性和高可用性。我们将从微服务的基本概念出发,通过具体案例分析,揭示云原生环境下微服务治理的关键策略,并分享实践经验,旨在为读者提供一套完整的微服务治理解决方案。
|
5月前
|
运维 负载均衡 Cloud Native
云原生架构下的微服务治理实践
【6月更文挑战第24天】在云原生的浪潮下,微服务治理成为确保系统弹性、可维护性和可观测性的关键。本文通过深入分析微服务治理的核心要素与挑战,结合前沿技术和工具,提出一套实用的微服务治理策略,旨在帮助开发者和架构师构建更加稳定、高效且易于管理的分布式系统。