微服务治理实践之金丝雀发布|学习笔记(一)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 快速学习微服务治理实践之金丝雀发布

开发者学堂课程【微服务治理实践之金丝雀发布微服务治理实践之金丝雀发布】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/972/detail/14893


微服务治理实践之金丝雀发布

 

内容介绍:

一. 微服务治理

二. 安全生产三板斧

三. 可灰度

四. 微服务动态路由

五. 金丝雀部署原理

六. 金丝雀下一步规划

七. EDAS 演示金丝雀资料

八. 无损下线

 

一.微服务治理

微服治理最近上线了些新功能,如 Spring Cloud ,可以 Spring Cloud 的服务的查询,调用链,离群摘除,还会上线服务健全,也会分享 Spring Cloud 无损下线以及金丝雀发布。

Dubbo 类似,如会介入 Dubbo Admin 。

HSF 会继续做支持。阿里云上有微服务治理各个的功能点,如金丝雀发布。进入后分 ecs 集群和 k8s 集群,根据自己的集群选择对应的集群,因为每种集群的部署策略是不一样的。

image.png

具体功能如下:

1.Spring Cloud

(1)查询 Spring Cloud 服务

(2)查询 Spring Cloud 服务调用链

(3)使用离群实例摘除保障Spring Cloud 应用的可用性

(4)使用服务鉴权实现Spring Cloud 应用的访问控制

(5)无损下线 Spring Cloud应用

(6)金丝雀发布 Spring Cloud 应用

2. Dubbo

(1)查询 Dubbo 服务

(2)查询 Dubbo 服务调用链

(3)使用离群实例摘除保障Dubbo 应用的可用性

(4)使用服务鉴权实现Dubbo 应用的访问控制

(5)无损下线 Dubbo 应用

(6)金丝雀发布 Dubbo 应用

(7)使用 Dubbo Admin 治理 Dubbo 服务

3.  HSF

(1)查询  HSF 服务

(2)查询 HSF 服务调用链

(3)使用离群实例摘除保障 HSF 应用的可用性

(4)无损上线  HSF 服务

(5)查看 HSF 服务报表

 

二.安全生产三板斧

1.可灰度

阿里内部有全生产三板斧的概念。第一个是可灰度,如下图,有两个版本,一个Old version 一个 New version ,New version 新版本可以灰度一批用户,如可以灰度5%的用户,先观察这个新版本上线是否有问题,即可灰度。

image.png

2.可观测

第二个是可观测,类似监控,新版本上线,需做监控,确定新版本是否有问题,如系统的负载,CPU使用率,内存使用率等就是可观测,发布前后可以做对比。

image.png

3.可回滚

可回滚很重要,当新版本发布后,如果出问题,第一件事是回滚这个新版本,因为排查问题需的时间是无法预估的,此时就需要将新版本新回滚到老版本,回滚确定为什么发生故障,继续进行排查,等待下一个时间点继续发布。以上为阿里集团安全生产三板斧的概念。

 

三.可灰度

灰度分很多种类型。

1. 蓝绿发布

image.png

蓝绿发布较简单,一套系统会在两个环节上做部署。用户开始访问的是老环境,当新环境准备好后,在统一入口将流量切到新版本。这种发布的问题如下:

(1)简单

只需多部署一套系统就可以,两套系统一起跑,非常简单。

(2)资源成本高

因为多部署了一套系统,底层的资源进行了一定的浪费,成本较高,多花一倍的资金去运行。

(3)切换快(回滚|升级)

当新版本出现问题或要升级时,过程非常快,在统一路口前做一个流量切换即可,所以切换的速度包括升级回滚非常快。

(4)影响广

如果发生了问题会影响所有用户,因为这个缺点是针对新老系统的切,全切到新的或全部是老的,影响范围非常广。

给大家演示什么是蓝绿部署。配了一个host,是本地的一个域名,认识到本地,后台配了一个NGX。如最开始,同一个域名,它是2.0版本。

package com.alibaba.cloud;

import…

@SpringBootApplication

public class BlueGreenDeploymentApplication {

public static void main(String[ ] args){SpringApplication.run(BlueGreenDeployment

@RestController

class MyController {

@GetMapping("/status")

public String status() { return "version3.@"; }

}

}

然后如在8080上面即另外一套资源,又部署了一套,如改到3.0,此时因为切流的动作还没做,所以还是2.0这个版本。

package com.alibaba.cloud;

import…

@SpringBootApplication

public class BlueGreenDeploymentApplication {

public static void main(String[ ] args){SpringApplication.run(BlueGreenDeployment

@RestController

class MyController {

@GetMapping("/status")

public String status() { return "version3.@"; }

}

}

然后改一下统一进入层的NGX。把端口改成9090。重启一下这个NGX。此时访问同样的域名,同样的入口,它的版本就升级为了3.0,这个就是蓝绿发布的概念,优缺点也做了简单的总结。

upstream my-upstream {

server 127.0.0.1:9090;

keepalive 64;

}

server {

listen 80;

server_name spring-cloud-alibaba.io;

location / {

proxy_pass http://my-upstream;

}

}

2. 金丝雀发布

image.png

第二种灰度发布策略是金丝雀发布。

(1) 灵活,规则多样化

金丝雀比较灵活,不单按照图上5%的用户访问的是新版本,95%的用户访问的是老版本。也可以做每次请求的参数,整个路由的规则是非常灵活的,具有多样化,不单可以按比例也可以按内容参数做一些灰度。

(2)搭建成本高

金丝雀分布搭建成本比较高,蓝绿分布只要简单的搭两条系统,统一记录做切流就可以。金丝雀搭建成本总体来较高的,如NGX 要做一些参数的解析或微服务里要对double 等做路由规则的解析。

(3)没有覆盖所以用户

金丝雀没有覆盖到所有用户,因为如按比例到了5%的用户,但是这5%的用户不一定会触发一些 bug ,可能90%的客户覆盖之后才会出一些 bug ,所以有一些缺点。

(4)影响范围小

虽然有缺点,没有覆盖到所有的用户,但如新的版本出现了问题,只会影响这5%的用户。

3. 滚动发布

image.png

滚动发布是金丝雀发布的一个变形,如图有九台实例,第一个步骤先在三台实例上做部署,后面每三台每三台的部署直到全部部署完,即部署三次,是一个按比例的灰度,按照1/3的比例去灰度。因此滚动发布其实是金丝雀发布的变奏。

滚动发布的一个缺点是发布/回滚周期长,如每次发三台,然后隔一两天或一个小时再后面的三台,但发布时间长每次回滚时间也会比较长,每次回滚三台。

以上就是三种灰度策略,蓝绿发布、金丝雀发布和滚动发布。

 

四. 微服务动态路由

image.png

对于微服务,如 Spring Cloud 底层是 rest 协议,所以其实是 hddp ,如一个 consumer 调 provider 的,根据parameter ,若 name = jim ,会路由到192.168.1.1的这个 provider 上,如果header 中有 test ,会路由到192.168.1.2 的provider 上,包括 cookie , Dubbo 也同样,可以根据 Attachment 里面有什么路由到对应的实例上,如果方法的参数 Arguments ,如第几个参数它的值等于什么会路由到对应的实例上,又或者 Dubbo  中某个接口中的某个方法,可以对其做灰度,也会精准的路由到对应的节点上。这是微服务的相关的动态路由,开软的微服务动态路由问题还是较大的。

1.Dubbo 动态路由

Dubbo 动态路由,下面是 Dubbo Admin ,是条件路由,可以配 jason ,如 house 不等于 IP 。

下面是 Dubbo 中,可以对 return 做扩展,如判断第零个参数是1,会返回 IP 。

public class CanacyRouter extends AbstractRouter {

private List<string> grayIps = new ArrayListe< >( );

public CanaryRouter( ) {

grayIps.add("192.168.0.1");

grayIps.add(“192.168.0.2");

}

@Override

public <T>List<Invoker<T>> route(List<Invoker<T>> invokers,URL url

Invacation invacation)throws RpcException{

if ("1"".equals(invocation.getArguments(()[0].toString())){

return invokers.stream(()

.filter(invoker => grayIps.contains(invoker.getUrl().getHost())

collect(Collectors.toList());

}

return invokers;

}

}

Dubbo 动态路由缺点如下

(1)Dubbo 不版本路由功能不一致

不同版本,它的路由功能是不一样,如2.7加了很多的新的特性,包括路由规则,这些特性在2.5 ,2.6是不支持的,所以不同的版本,路由功能是不一样的。

(2)Dubbo Admin 操作不友好

创建一个新的路由规则,体验不是特别好,理解成本也较高。

(3)固定IP,不够云原生

IP 是固定的,如 router ,写死了192.168.0.1和0.2,IP是固定的,不会云原生,在K8S环境下重启后IP会变,所以这个规则会失效。所以不够云原生。

(4)对技术人员要求较高

如 router ,对 Dubbo 要较熟悉,若不熟悉的 router 不会写。所以对技术人员要求非常高。

2.Spring Cloud 动态路由

public class SanacyRule extends AbstractLoadBalancerRule {

private List<String> grayIps=new ArrayList<>)

private Random random=new Random();

@Override

public void initwithNiwsConfig(IClientConfig clientConfig){

grayIps.add(“192.168.0.1");

grayIps.add(“192.168.0.2");

}

@Override

public Server choose(Object key){

List<Server> allServer=getLoadBalancer().getAllServers():         List<Server>grayServers=allServerstream()

.filter(server ->grayIps.contains(servergetHost()))

.collect(Collectors.toList());

grayServers.get(random.nextInt(grayServers.size()));

return null;

}

}

Spring Cloud 没有 Spring Cloud Admin的,因此 Spring Cloud 没有对应的 ops ,因此写代码,Spring Cloud 新出了一个客户端返回的组件,新出的组件也要做一些对应的规则的适配, server做一些过滤,判断是否为对应的 IP ,如果是返回 IP ,是灰度的一些实例,在灰度的实例里再根据一个算法去获取,代码稍有点问题。

Spring Cloud 动态路由有一下问题:

(1)Netflix Ribbon & SCL 两套客户端路由组件。

首先,它有两套路由组件,要实现两套,因为 Spring Cloud load balance 刚出来,未普及,所以要做两套规则的适配。

(2)没有 ops 界面。

Dubbo 有一个 Dubbo Admin ,Spring Cloud 没有 ops 界面,所以只能写代码。

(3)Netflix & SCL 规则类获取不到请求信息。

Rule 里面没有 request 信息,只能做一些路由。request 信息在 Spring Cloud 客户端链,所以参数的解析需要通过第三方做规则的透传,因此对技术人员的要求较高,即第4点。

(4)对技术人员的要求较高。

(5)破坏原有的负载均衡规则。

用了 rule 之后它会覆盖用户一开始给的rule ,因此会破坏代码程序上原有的负载规则。

(6)固定 IP ,不够云原生。

同样也是固定 IP 的,不够云原生。

(7)不同客户端获取参数方式不一样。

获取参数的代码是不一样的,因为是两套客户端的实现。

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
16天前
|
消息中间件 持续交付 数据库
构建高效可靠的微服务架构:策略与实践
【4月更文挑战第25天】 随着现代软件开发的复杂性日益增加,传统的单体应用已难以满足快速迭代和灵活部署的需求。本文深入探讨了如何构建一个高效且可靠的微服务架构,包括关键的设计原则、技术选型以及实践中的挑战和应对策略。通过分析多个成功案例,我们总结了一系列最佳实践,并提出了一套可量化的性能优化方法。文章不仅为开发者提供了具体的技术指导,同时也强调了团队协作和持续学习在微服务转型过程中的重要性。
|
11天前
|
监控 Java 测试技术
现代化软件开发中的微服务架构设计与实践
随着软件开发的发展,传统的单体应用架构已经无法满足现代化应用的需求。微服务架构作为一种新的设计理念,为软件开发提供了更灵活、可扩展的解决方案。本文将介绍微服务架构的设计原则、实践方法以及相关技术工具,并结合实例展示其在现代化软件开发中的应用。
|
1天前
|
存储 监控 API
构建高效微服务架构:后端开发的现代实践
【5月更文挑战第9天】 在本文中,我们将深入探讨如何在后端开发中构建一个高效的微服务架构。通过分析不同的设计模式和最佳实践,我们将展示如何提升系统的可扩展性、弹性和维护性。我们还将讨论微服务架构在处理复杂业务逻辑和高并发场景下的优势。最后,我们将分享一些实用的工具和技术,以帮助开发者实现这一目标。
|
2天前
|
负载均衡 算法 NoSQL
探索微服务架构下的服务发现与治理
【5月更文挑战第9天】 在当今的软件开发领域,微服务架构已成为构建可伸缩、灵活且容错的系统的首选模式。随着服务的增多,如何有效地进行服务发现与治理成为了关键的挑战。本文将深入探讨微服务环境中服务发现的机制和治理策略,分析不同服务发现工具的优缺点,并提出一种基于一致性哈希和健康检查相结合的服务治理方案,旨在提高系统的可用性和性能。
|
2天前
|
监控 API 持续交付
构建高效可靠的微服务架构:策略与实践
【5月更文挑战第8天】在当今快速演进的软件开发领域,微服务架构已经成为实现敏捷开发、持续交付和系统弹性的关键模式。本文将探讨构建一个高效且可靠的微服务系统所必须的策略和最佳实践。我们将从服务的划分与设计原则出发,讨论如何通过容器化、服务发现、API网关以及断路器模式来优化系统的可伸缩性和鲁棒性。此外,我们还将涉及监控、日志管理以及CI/CD流程在确保微服务架构稳定运行中的作用。
|
3天前
|
敏捷开发 持续交付 API
构建高效微服务架构:后端开发的现代实践
【5月更文挑战第8天】 在数字化转型的浪潮中,微服务架构已成为企业追求敏捷开发、持续交付和系统弹性的关键解决方案。本文将深入探讨微服务的核心概念,包括其设计原则、优缺点以及如何在后端开发中实现高效的微服务架构。我们将通过实际案例分析,展示微服务如何帮助企业快速适应市场变化,同时保持系统的可维护性和扩展性。
|
4天前
|
监控 负载均衡 数据安全/隐私保护
探索微服务架构下的服务网格(Service Mesh)实践
【5月更文挑战第6天】 在现代软件工程的复杂多变的开发环境中,微服务架构已成为构建、部署和扩展应用的一种流行方式。随着微服务架构的普及,服务网格(Service Mesh)作为一种新兴技术范式,旨在提供一种透明且高效的方式来管理微服务间的通讯。本文将深入探讨服务网格的核心概念、它在微服务架构中的作用以及如何在实际项目中落地实施服务网格。通过剖析服务网格的关键组件及其与现有系统的协同工作方式,我们揭示了服务网格提高系统可观察性、安全性和可操作性的内在机制。此外,文章还将分享一些实践中的挑战和应对策略,为开发者和企业决策者提供实用的参考。
|
5天前
|
API 持续交付 开发者
构建高效微服务架构:策略与实践
【5月更文挑战第6天】随着现代软件系统的复杂性增加,微服务架构逐渐成为企业开发的首选模式。本文深入分析了构建高效微服务架构的关键策略,并提供了一套实践指南,帮助开发者在保证系统可伸缩性、灵活性和稳定性的前提下,优化后端服务的性能和可维护性。通过具体案例分析,本文将展示如何利用容器化、服务网格、API网关等技术手段,实现微服务的高可用和敏捷部署。
|
6天前
|
缓存 NoSQL Java
构建高性能微服务架构:Java后端的实践之路
【5月更文挑战第5天】在当今快速迭代和高并发需求的软件开发领域,微服务架构因其灵活性、可扩展性而受到青睐。本文将深入探讨如何在Java后端环境中构建一个高性能的微服务系统,涵盖关键的设计原则、常用的框架选择以及性能优化技巧。我们将重点讨论如何通过合理的服务划分、高效的数据存储策略、智能的缓存机制以及有效的负载均衡技术来提升整体系统的响应速度和处理能力。
|
6天前
|
监控 持续交付 数据库
构建高效可靠的微服务架构:策略与实践
【5月更文挑战第5天】 在当今快速发展的软件开发领域,微服务架构已成为构建可扩展、灵活且容错的系统的首选模式。本文将探讨如何通过一系列经过验证的策略和最佳实践来构建一个高效且可靠的微服务系统。我们将深入分析微服务设计的核心原则,包括服务的细粒度划分、通信机制、数据一致性以及容错处理,并讨论如何利用现代技术栈来实现这些目标。文章将提供一套综合指南,旨在帮助开发者和架构师在保证系统性能的同时,确保系统的稳健性。
23 4