今天简单介绍下SpringFramework微服务中几种服务发布策略以及实现方式。我接触过的有蓝绿、滚筒和灰度发布。

蓝绿发布:

简单说就像美帝选总统投票一样,非蓝即绿一刀切,这个其实也是传统软件架构最常使用的升级方式,只不过服务需要重启才能生效,而在微服务中这种部分节点的替换是热部署上去的。

微服务中的蓝绿部署依赖的是Spring Cloud Zuul + Spring Cloud Config + Spring Cloud Eureka,实现方式如下:

我准备了5个节点:

1 GreenBlue-Config-server:配置注册中心

配置文件application.yml如下:

server:
port: 8090

spring:
cloud:
config:
server:
git:
uri: https://github.com/yejingtao/forblog
search-paths: /config
username: username
password: username
application:
name: greenblue-config-server

eureka:
client:
serviceUrl:
defaultZone: http://peer1:1111/eureka/,http://peer2:1112/eureka/
2 GreenBlue-Zuul: API网关

配置文件bootstrap.properties如下:

spring.application.name=greenblue-zuul
spring.cloud.config.profile=dev
spring.cloud.config.label=master
server.port=7002

eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/

spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=greenblue-config-server

management.security.enabled=false
3 GreenBlue-Eureka:服务注册中心,peer1、peer2做了高可用性

4 GreenBlue-Service-green:绿营服务端,application-name=greenblue-service-green

5 GreenBlue-Service-blue:蓝营服务端,application-name=greenblue-service-blue

另外git仓库上文件名为greenblue-zuul-dev.properties的内容只有2行:

zuul.routes.user-service.path=/api-service/**
zuul.routes.user-service.serviceId=greenblue-service-blue
(PS:本案例只能演示蓝绿部署如何割接不能直接用于生产,因为生产上还需要做蓝绿服务节点的高可用性、Spring Cloud Bus的配置推动、每个节点环境参数的Config统一管理、Zuul鉴权过滤、config-server安全控制等)

节点部署与发布如下:

验证步骤:

1 git仓库中边缘服务网关/api-service配置成blue,green节点不需要部署和启动,此时通过zuul访问/api-service是blue提供的服务

2部署green并注册到eureka上,我们要用它替换blue

3 git仓库中的/api-service配置改成green,同时调用zuul服务的refresh方法使修改生效

蓝绿方式的优点是:一旦新服务green发现有bug或其它问题,我们可以重新切换回blue,由于blue没有被我们动过一丝一毫所以我可以认为这次服务的回滚是绝对安全的(数据回滚等除外),当我们将新服务green修复好后又可以最快的速度最小的代价发布上去!

蓝绿方式也有明显的缺陷,如果要发布的节点不是边缘服务、或者被其它节点以Eureka上注册的服务名的方式访问,如图:

如果我们要做Service-BlueB的升级就会很麻烦,但是路子还是有的:

需要多部署一套完整的拓扑才可以满足单独一个节点升级。

所以蓝绿方式的缺点也很明显:会造成硬件资源的浪费,极端情况下我们需要2套硬件资源(取决于系统的拓扑设计和服务拆分,2倍是上限)

滚筒发布:

滚筒发布与蓝绿发布一刀切的概念完全相反,像轮子一样一圈圈的往前滚,先替换一批节点,观察一段时间,确认没问题后再替换其他的节点。滚筒发布的先决条件是节点必须高可用性,也就是说在替换过程中要保留未被替换的节点继续提供旧服务。

我的节点拓扑如下:

滚筒发布完全依赖Eureka,所以为了避免混淆我这里将Zuul和config都去掉了,我现在的目的要将Roll-Service-V2版本发布上去。

1我先将Roll-Service-V1的部分节点下线

2将下线的这个节点进行线下升级,将补丁包、新版本之类的升级上去

3再将升级后的V2版本注册到Eureka上

4观察一段时间确定V2版本OK后,再将剩下的V1版本按批次用相同的方式部署发布。

滚筒发布有3个优点:1,机器利用率100%,没有硬件上的浪费;2,发布过程平滑,新老功能会并行一段时间;3,对节点服务做精确升级

滚筒发布也有3个缺点:1,发布步骤相对比较繁琐; 2,新版本出现问题不能及时回滚,回滚过程其实也是个滚筒发布的过程; 3节点达到一定数量后滚筒发布就会变得很无力,要滚好几次。

灰度发布:

灰色,黑白之间的颜色,如果旧版本为白新版本为黑,灰度发布就是由白变黑的渐进过程。寻龙诀电影里黄渤在下洞盗墓之前会弄个鸟笼里面关着个金丝雀,从洞口到墓底慢慢放下去,洞口为白墓底为黑,放到底金丝雀不死,发布成功。放到一半金丝雀不叫了,发布失败,放弃本次盗墓(扯多了)。

灰度发布的核心是Eureka+客户端负载均衡,发布过程直接上图:

将V2以相同的服务名注册到Eureka上利用Ribbon等客户端负责均衡技术就可以请求得到这个新版本,如图如果客户端使用的轮询策略那相当于对版本升级了25%,如果V2版本这25%的功能稳定没问题了可以按硬件条件继续添加新V2节点或者下线老V1版本直到100%。假如升级到50%我们发现V2版本有重大Bug,直接停掉所有V2服务,剩下50%V1版本短时间内仍可以提供稳定的服务。

如果说V2版本升级100%了需要回滚怎么办?黄渤发现金丝雀到了洞底后扔活蹦乱跳于是跳了下去结果自己被毒死了。这种情况一般要迅速部署几个V1版本的节点注册到Eureka上,同时下线V2节点,能不能抢救的回来看对业务影响多大了。

灰度发布的特点:1,发布过程平滑,进退自如 2,需要冗余的硬件,但不需要像蓝绿那么多。

这三种热部署发布方式没有好坏之分,完全根据自己的硬件条件和业务场景来选择,而且同一个大服务群中可以对不同的微服务模块使用不同的发布方式。个人比较推崇灰度发布,硬件要求不高,易操作,升级平滑。

最后了解下SpringFramework框架下服务节点如何下线:

大方向上分为Eureka注册端下线和节点服务自下线两种。

1 Eureka注册端下线:

$ curl -X PUT "http://peer2:1112/eureka/apps/HELLO-SERVICE/localhost:hello-service:8081/status?value=OUT_OF_SERVICE"
变量对应下图一看便知:

执行成功后服务会尝试设置为下线,下线成功后Eureka中服务状态会发生变化:

过15秒左右client客户端已经不会再分发到该OUT节点上了。此时可以把节点从Eureka上注销掉

$ curl -X DELETE "http://peer2:1112/eureka/apps/HELLO-SERVICE/localhost:hello-service:8081 "

此时微服务节点算是完全的隔离出来了,要杀要剐随你便了。

(PS:如果OUT_OF_SERVICE后没删除之前后悔了,可以将命令中Status改为UP执行下就好)

2 节点端服务下线

利用了Spring Boot Actuator的shutdown命令

Pom依赖添加actuator

配置添加endpoints.shutdown.enabled = true

对要下线的节点执行命令curl -X POST host:port/shutdown

个人推崇第一种方式,因为第二种方式很不安全,虽然可以进行权限控制,但是Eureka自带的功能那么好为啥还要另辟蹊径呢。
---------------------
作者:牛麦康纳
来源:CSDN
原文:https://blog.csdn.net/yejingtao703/article/details/78562895
版权声明:本文为博主原创文章,转载请附上博文链接!

【转】Spring Framework灰度发布的更多相关文章

  1. Spring Cloud灰度发布之Nepxion Discovery

    <蓝绿部署.红黑部署.AB测试.灰度发布.金丝雀发布.滚动发布的概念与区别> 最近公司项目在做架构升级,升级为 Spring Cloud,我们希望能够做到服务的灰度发布,根据访问量逐渐切换 ...

  2. Spring Framework(框架)整体架构 变迁

    Spring Framework(框架)整体架构 2018年04月24日 11:16:41 阅读数:1444 标签: Spring框架架构 更多 个人分类: Spring框架   版权声明:本文为博主 ...

  3. Spring Framework 4.0.0发布,首次支持Java 8

    Spring项目组今天发布了Spring 框架4.0.0版本.Spring是一个开源的轻量级Java SE和Java EE开发应用框架,其目的是用于简化企业级应用程序开发. Spring框架第一个版本 ...

  4. Spring cloud架构中利用zuul网关实现灰度发布功能

    蓝绿发布.金丝雀发布(灰度发布).AB测试 首先,了解下这几种发布方式的基础概念. 目前常见的发布策略有蓝绿发布.金丝雀发布(灰度发布).AB测试这几种,在国内的开发者中,对这几个概念有独立的理解.蓝 ...

  5. 将 Java Spring Framework 应用程序迁移到 Windows Azure

    我们刚刚发布了一个新教程和示例代码,以阐述如何在Windows Azure中使用 Java 相关技术.在该指南中,我们提供了分步教程,说明如何将 Java Spring Framework 应用程序( ...

  6. Spring Framework 5.0 新特性

    Spring Framework 5.0是在Spring Framework 4.0之后将近四年内一次重大的升级. 在这个时间框架内,主要的发展之一就是Spring Boot项目的演变. Spring ...

  7. Spring Framework 5 中的新特性

    https://www.ibm.com/developerworks/cn/java/j-whats-new-in-spring-framework-5-theedom/index.html Spri ...

  8. 1.Spring Framework 5.0 入门篇

    1.为什么学习Spring? 随着对Java EE的不断接触和理解,你会发现Spring  在各个企业和项目中发挥着越来越重要的作用.掌握Spring 已成为我们IT行业生存必学的本领之一. Spri ...

  9. Spring系列(零) Spring Framework 文档中文翻译

    Spring 框架文档(核心篇1和2) Version 5.1.3.RELEASE 最新的, 更新的笔记, 支持的版本和其他主题,独立的发布版本等, 是在Github Wiki 项目维护的. 总览 历 ...

随机推荐

  1. 浅谈CSS和JQuery实现鼠标悬浮图片放大效果

    对于刚刚学习网页前台设计的同学一定对图片的处理非常苦恼,那么这里简单的讲解一下几个图片处理的实例. 以.net为平台,微软的Visual Studio 2013为开发工具,当然前台技术还是采用CSS3 ...

  2. Chrome for Mac键盘快捷键!来自Google Chrome官网!

    ⌘-N 打开新窗口. ⌘-T 打开新标签页. ⌘-Shift-N 在隐身模式下打开新窗口. 按 ⌘-O,然后选择文件. 在 Google Chrome 浏览器中打开计算机中的文件. 按住 ⌘ 键,然后 ...

  3. mongodb.mongoose维护内嵌数组元素

    运行环境: - Nodejs - MongoDB 文档实例名: ProjectJob 文档格式如下: { "_id" : ObjectId("5bc69eb0b298b3 ...

  4. 树莓派.Qt.打包开发好的程序并运行的方法

    Qt开发的软件, 想要部署在树莓派上运行, 需要进行打包和发布 主要步骤如下: 1. 找1个树莓派用于开发与打包, 所以需要在它上面安装Qt开发环境 树莓派上安装Qt的方法, 可以看这里>> ...

  5. Hessian学习总结(一)——Hessian入门

    一.远程通讯协议的基本原理 网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络 IO 来实现,其中传输协议比较出名的有 http . tcp . udp 等等, http . ...

  6. springboot之启动原理解析及源码阅读

    前言 SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开SpringBoot的神秘面 ...

  7. 你真的会用Gson吗?Gson使用指南(3)

    原文出处: 怪盗kidou 注:此系列基于Gson 2.4. 本次的主要内容: 字段过滤的几种方法 基于@Expose注解 基于版本 基于访问修饰符 基于策略(作者最常用) POJO与JSON的字段映 ...

  8. autorelease' is unavailable

    ARC forbids explicit message send of'release' 'release' is unavailable: not available inautomatic re ...

  9. 基于php5.5使用PHPMailer-5.2发送邮件

    PHPMailer - A full-featured email creation and transfer class for PHP. 在PHP环境中可以使用PHPMailer来创建和发送邮件. ...

  10. DHCP服务原理与搭建(Linux系统+路由器,二选一方案)

    大家都知道上网的最基本前提是要在终端上设置IP.子网掩码.网关.DNS等地址信息,在家里或者在办公室很多时候打开电脑后发现就可以上网,并没有手动设置IP.掩码.DNS地址也能上网,这是什么原因呢?其实 ...