转自地址:什么是蓝绿部署、滚动发布和灰度发布? - 知乎

1、springcloud 微服务灰度发布策略

现有Spring Cloud微服务痛点

  1. 如果你是运维负责人,是否会经常发现,你掌管的测试环境中的服务注册中心,被一些不负责的开发人员把他本地开发环境注册上来,造成测试人员测试失败。你希望可以把本地开发环境注册给屏蔽掉,不让注册。
  2. 如果你是运维负责人,生产环境的某个微服务集群下的某个实例,暂时出了问题,但又不希望它下线。你希望可以把该实例给屏蔽掉,暂时不让它被调用。
  3. 如果你是业务负责人,鉴于业务服务的快速迭代性,微服务集群下的实例发布不同的版本。你希望根据版本管理策略进行路由,提供给下游微服务区别调用,例如访问控制快速基于版本的不同而切换,例如在不同的版本之间进行流量调拨。
  4. 如果你是测试负责人,希望对微服务做A/B测试,那么通过动态改变版本达到该目的。

Spring Cloud微服务痛点场景表现

(1)、基于网关(Zuul)发布策略
Nepxion Discovery是一款对Spring Cloud的服务注册发现的增强中间件,其功能包括多版本灰度发布,黑/白名单的IP地址过滤,限制注册等,支持Eureka、Consul和Zookeeper。现有的Spring Cloud微服务可以方便引入该插件,代码零侵入,使用者只需要做如下简单的事情:

  • 引入相关Plugin Starter依赖到pom.xml

  • 必须为微服务定义一个版本号(version),在application.properties或者yaml的metadata里

  • 必须为微服务自定义一个便于为微服务归类的Key,例如组名(group)或者应用名(application),在application.properties或者yaml的metadata里,便于远程配置中心推送和灰度界面分析

  • 使用者只需要关注相关规则推送。可以采用如下方式之一

    • 通过远程配置中心推送规则

    • 通过控制台界面推送规则

    • 通过客户端工具(例如Postman)推送推测

简单描述一下,本系统的核心模块“基于版本控制的灰度发布”,从网关(Zuul)开始的灰度发布操作过程

  • 灰度发布前

    • 假设当前生产环境,调用路径为网关(V1.0)->服务A(V1.0)->服务B(V1.0)

    • 运维将发布新的生产环境,部署新服务集群,服务A(V1.1),服务B(V1.1)

    • 由于网关(1.0)并未指向服务A(V1.1),服务B(V1.1),所以它们是不能被调用的

  • 灰度发布中

    • 新增用作灰度发布的网关(V1.1),指向服务A(V1.1)->服务B(V1.1)

    • 灰度网关(V1.1)发布到服务注册发现中心,但禁止被服务发现,网关外的调用进来无法负载均衡到网关(V1.1)上

    • 在灰度网关(V1.1)->服务A(V1.1)->服务B(V1.1)这条调用路径做灰度测试

    • 灰度测试成功后,把网关(V1.0)指向服务A(V1.1)->服务B(V1.1)

  • 灰度发布后

    • 下线服务A(V1.0),服务B(V1.0),灰度成功

    • 灰度网关(V1.1)可以不用下线,留作下次版本上线再次灰度发布

可以看出微服务灰度发布大致思想

(2)、灰度发布--spring-cloud-gateway动态路由实现
网关的大致实现原理如下图:

问题

当某一天,服务1扩展了一个新功能, 但这一部分功能只针对某一部分用户开发,抽象来说就是:请求方直接圈定了具体的服务节点,该如何实现呢?

基于 LoadBalancerClientFilter +Ribbon 实现
springcloud-gateway+nacos 实现灰度发布_dark-CSDN博客_nacos 灰度发布
灰度发布--spring-cloud-gateway动态路由实现 - 简书

2、微服务如何优雅关闭服务

向eureka 注册中心发送delete 请求,只是取消注册服务, 当发送心跳时还是会注册到eureka

格式为   eureka地址/eureka/apps/服务名称/实例名称

请求方式为delete

下面是取消注册一个服务的例子。

下图是用postman 发送delete请求

3.通过eureka变更服务状态的方式实现服务上下线,不会再发送心跳注册到eureka server

4. 客户端主动通知注册中心下线,下线后不会再注册到eureka了

如果你的eureka客户端是是一个spring boot应用,可以通过调用以下代码通知注册中心下线。

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
 
import com.netflix.discovery.DiscoveryManager;
import com.shm.common.model.RespVO;
import com.shm.common.util.RespUtil;
 
@RestController
public class OfflineController {
 
 
    @RequestMapping(value = "/offline", method = RequestMethod.GET)
    public RespVO<Object> offLine(){
        DiscoveryManager.getInstance().shutdownComponent();
        return RespUtil.success();
    }
    
    
}
5、设置服务的状态,可通过状态变更来实现再eureka的上下线

pom中加入

actuator的包
       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

以上的方式都能实现服务的下线,但是有的时候只想要下线某个服务,却不需要发布,等待事情处理完成后上线此服务,则以上方式就做不到了。这时可以通过设置微服务的状态来完成此功能。项目中整合了actuator的话就非常简单了,在项目启动的时候可以看到控制台的输出:

/actuator/service-registry 可以已Get的方式获取当前服务的状态,以Post的方式修改当前服务状态,如将服务设置为Down状态,这样其他微服务接收到此状态后将不调用此服务。将order服务状态设置为Down:

看下执行后的效果:

等到流量都没有进来后,需要发布的话直接发布接口,不需要发布可以直接上线当前服务:

这样一个服务的上线和下线就优雅的完成了,如果项目中没有使用Actuator框架,可以模仿Actuator框架的实现方式,详见类:ServiceRegistryEndpoint

如果要再上线:

总结
以上几种方式都可以实现微服的下线,3和5的方式最为优雅,可以主动下线和上线,在没有新流量进来后可以随时发布,这样在也不用等到半夜12点发布了。

springcloud中微服务的优雅停机(已验证)_梦想起飞的地方.........-CSDN博客_discoverymanager

蓝绿部署、滚动发布和灰度发布相关推荐

  1. 蓝绿部署滚动部署金丝雀发布(灰度发布)A/B测试

    在一般情况下,升级服务器端应用,需要将应用源码或程序包上传到服务器,然后停止掉老版本服务,再启动新版本.但是这种简单的发布方式存在两个问题,一方面,在新版本升级过程中,服务是暂时中断的,另一方面,如果 ...

  2. 14.每日一读-到底什么是蓝绿、红黑、灰度发布

    1.科学部署的意义 尽可能减少服务停机时间 控制新版本带来的质量风险 2.全量发布与增量发布 3.蓝绿发布 1.我有两个应用集群,应用集群A与应用集群B,这两个集群的版本都是v1.0,现在使用蓝绿部署 ...

  3. 蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别...

    蓝绿部署.红黑部署.AB测试.灰度发布.金丝雀发布.滚动发布的概念与区别 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wangyinghong_2 ...

  4. 线上发版如何做到分批发的?详解蓝绿部署,滚动升级,A/B 测试,灰度发布/金丝雀发布

    过去的 10 年里,很多大公司都在使用蓝绿部署,安全.可靠是这种部署方式的特点.蓝绿部署虽然算不上" Sliver Bullet ",但确实很实用.在有关于"微服务&qu ...

  5. 蓝绿部署、A/B测试以及灰度发布

    过去的10年里,很多大公司都在使用蓝绿部署,安全.可靠是这种部署方式的特点.蓝绿部署虽然算不上"Sliver Bullet",但确实很实用.在有关于"微服务". ...

  6. 首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布

    首富带你畅谈:蓝绿部署.滚动发布.灰度发布/金丝雀发布 笔者: 张首富 时间: 2019-01-24晚 QQ群: 895291458 博客地址: www.zhangshoufu.com 根据2018年 ...

  7. 【项目实战】正确辨析蓝绿部署、金丝雀发布(灰度发布)、滚动发布、A/B测试

    一.背景 蓝绿部署.A/B测试.金丝雀发布,以及灰度发布.流量切分等,经常被混为一谈,影响沟通效率. 根本原因是这些名词经常出现,人们耳熟能详能够熟练地谈起,对这些术语的理解却没有达成一致. 下面是从 ...

  8. 蓝绿发布、滚动发布、灰度发布,有什么区别?这下明白了

    欢迎关注方志朋的博客,回复"666"获面试宝典 在项目迭代的过程中,不可避免需要"上线".上线对应着部署,或者重新部署:部署对应着修改:修改则意味着风险.目前有 ...

  9. 蓝绿发布、滚动发布、灰度发布,有什么区别?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 在项目迭代的过程 ...

  10. CI/CD发布方式-蓝绿发布、灰度发布和滚动发布

    发布方式 应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境,同时要保证系统不间断提供服务.长期以来,业务升级渐渐形成了几个发布策略:蓝绿发布.灰度发布和滚动发布,目的是尽可能 ...

最新文章

  1. 爨底下-双龙峡,凑合的一日游
  2. java 文件下载漏洞,文件上传和下载漏洞
  3. [乱弹琴]关于2的讨论
  4. python导入data数据_python实现从wind导入数据
  5. 左右两个列表框项之间的添加、移除、上下移动
  6. Klevgrand R0Verb for mac(音频效果滤波器)
  7. 西安高铁“洋班组” 助力新春运
  8. 3 超链接_excel函数应用技巧:超链接函数HYPERLINK
  9. SSH框架搭建和整合(struts2、spring4、hibernate5)
  10. cad插入块_CAD 自定义图块插入图块时图形离插入点很远怎么办?【AutoCAD教程】...
  11. 一个线程OOM,进程里其他线程还能运行么
  12. NB-IoT、LoRa逐渐商用 连接物联网长尾效应凸显
  13. k8s教程(pod篇)-污点与容忍
  14. php按钮如何加显示不出来,javascript - 点击按钮 显示更多,自定义变量显示不出来?...
  15. 解读小米模式:颠覆式创新者的背后
  16. java发送会议邀请邮件模板_使用java发送每封电子邮件的日历邀请
  17. 云呐|医院医疗的IT设备信息化资产盘点管理系统
  18. 默认连接电脑的模式为MTP
  19. 循环结构的数据流分析方法
  20. andorid开发关键技术

热门文章

  1. Mysql基础语法-建库-建表(增、删、改、查、表关联及子查询)
  2. 惠普打印机恢复出厂设置大全
  3. 5G辐射大吗?关于基站和手机辐射,这篇文章彻底讲明白了
  4. IDL学习:语法基础-指针、链表
  5. 5G、折叠屏之外,努比亚α的新探索
  6. TechEd上的51CTO
  7. nuxt 引入富文本编辑器wangEditor,刷新就会报错?试试这个
  8. Generic patch v2.6 for TabsStudio and DevArt Entity Developer -屈指可数的更新版
  9. 免费的防病毒公司可以监控您的点击的费用
  10. 华为手机pc模式机型_华为PC模式是什么?华为EMUI 8.0的PC模式机型有哪些