本文源码:GitHub·点这里 || GitEE·点这里

一、基本逻辑

请求通过8001服务,在灰度规则中,会读取下次请求的服务列表,根据版本号参数规则,选中路由的服务。

配置版本号,区分灰度版本和默认正常版本;
自定义拦截器,管理版本号或其他标识参数在请求中传递;
自定义服务选中策略,基于版本标识路由服务;
如果灰度服务不存在,则基于规则选中默认服务;

二、版本配置

在node12-server集群配置两个服务:在8002端口配置版本v7.0.0,在8003端口配置版本v7.0.1,用来测试灰度版本选择。

8002服务

eureka:metadata-map:version: v7.0.0

8003服务

eureka:metadata-map:version: v7.0.1

Eureka注册中心,服务列表:

三、参数传递

微服务下通过实现RequestInterceptor接口,管理服务之间的Feign请求拦截器,在请求路由到服务前,可以对请求执行一些处理操作,常见操作例如传递版本号,用户Token等请求头等属性。

/*** 请求拦截器*/
@Component
public class GrayReqInterceptor implements RequestInterceptor {private static final String VERSION_KEY = "versionId" ;/*** 处理请求头参数携带问题*/@Overridepublic void apply(RequestTemplate requestTemplate) {HttpServletRequest request =((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();String versionId = request.getHeader(VERSION_KEY);if (StringUtils.isNotEmpty(versionId)){requestTemplate.header(VERSION_KEY,versionId);}}
}

这里就传递一个versionId参数,作为下次请求路由服务的核心标识。

四、灰度规则

在请求头的Header中添加要访问的版本号,如果有匹配的服务,则路由所有请求的灰度服务,如果没有则返回默认服务。

@Configuration
public class GrayRule extends ZoneAvoidanceRule {@Beanpublic GrayReqInterceptor grayReqInterceptor(){return new GrayReqInterceptor();}private static final String VERSION_KEY = "versionId" ;@Overridepublic Server choose(Object key) {HttpServletRequest request =((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();String versionId = request.getHeader(VERSION_KEY);// 服务匹配List<Server> serverList = this.getPredicate().getEligibleServers(this.getLoadBalancer().getAllServers(), key);Server toServer = getServer(serverList,versionId);if (toServer != null){return toServer ;} else {return getServer(serverList,GrayConstant.VERSION_DEF);}}private Server getServer (List<Server> serverList,String version){Server toServer = null ;for (Server server : serverList) {Map<String, String> metadata = ((DiscoveryEnabledServer) server).getInstanceInfo().getMetadata();String metaVersion = metadata.get("version");if (!StringUtils.isEmpty(metaVersion)) {if (metaVersion.equals(version)) {toServer = server;}}}return toServer ;}
}

在实际的过程中,服务的选择是十分复杂的,如果没有灰度服务,需要根据实际情况制定服务匹配的规则,例如根据响应时间,或者默认轮询等。

更需要注意的一点是,一旦使用底层API的二次封装,项目的整体就会受到框架版本升级的影响,需要持续关注框架的环境。

五、测试流程

1.启动相关服务,观察注册中心服务列表;

2.请求8001服务的接口,并带上版本号;

3.观察不同版本号的路由服务;

4.不携带版本号,观察默认服务选择;

六、源代码地址

GitHub地址:知了一笑
https://github.com/cicadasmile/spring-cloud-base
GitEE地址:知了一笑
https://gitee.com/cicadasmile/spring-cloud-base

推荐阅读:编程体系整理

序号 项目名称 GitHub地址 GitEE地址 推荐指数
01 Java描述设计模式,算法,数据结构 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
02 Java基础、并发、面向对象、Web开发 GitHub·点这里 GitEE·点这里 ☆☆☆☆
03 SpringCloud微服务基础组件案例详解 GitHub·点这里 GitEE·点这里 ☆☆☆
04 SpringCloud微服务架构实战综合案例 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
05 SpringBoot框架基础应用入门到进阶 GitHub·点这里 GitEE·点这里 ☆☆☆☆
06 SpringBoot框架整合开发常用中间件 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
07 数据管理、分布式、架构设计基础案例 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
08 大数据系列、存储、组件、计算等框架 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆

架构设计:微服务模式下,实现灰度发布模式相关推荐

  1. 架构设计:分布式结构下,服务部署发布

    本文源码:GitHub·点这里 || GitEE·点这里 一.服务发布简介 分布式系统架构下,服务发布是一件很麻烦的事情,特别是在构建自动发布流程和灰度测试的策略两个核心方面.通常情况下如果不涉及数据 ...

  2. 当中台遇上DDD,我们该如何设计微服务?

    微服务架构有哪些模型?中台.领域驱动设计及微服务之间有着什么样的关系?微服务的边界设计怎么做?怎么做设计和拆分?且看作者为你娓娓道来. 借用当下最流行的段子做个开场白. "设计原则千万条,高 ...

  3. 单体架构-->SOA架构-->微服务架构

    上诉架构图采用了分层架构,按照调用顺序,从上到下为表示层.业务层.数据访问(DAO)层.DB层.表示层负责用户体验,业务层负责业务逻辑,包括电影.订单和用户三个模块.数据访问层负责DB层的数据存取,实 ...

  4. 微服务场景下的数据一致性解决方案

    数据一致性是构建业务系统需要考虑的重要问题 , 以往我们是依靠数据库来保证数据的一致性.但是在微服务架构以及分布式环境下实现数据一致性是一个很有挑战的的问题.ServiceComb作为开源的微服务框架 ...

  5. 漫谈单体架构与微服务架构(上):单体架构

    最近微服务架构特别火爆,就跟人工智能.区块链一样,软件架构设计如果不提微服务,感觉就像是与世界先进的架构风格和开发技术脱了节似的,各方各面都无法彰显高大上的气质. 本来再打算使用一套系列文章来讨论微服 ...

  6. 微服务框架下的思维变化-OSS.Core基础思路

    如今框架两字已经烂大街了,xx公司架构设计随处可见,不过大多看个热闹,这些框架如何来的,细节又是如何思考的,相互之间的隔离依据又是什么...相信很多朋友应该依然存在自己的疑惑,特别是越来越火热的微服务 ...

  7. 为什么DDD是设计微服务的最佳实践

    在本人的前一篇文章<不要把微服务做成小单体>中,现在很多的微服务开发团队在设计和实现微服务的时候觉得只要把原来的单体拆小,就是微服务了.但是这不一定是正确的微服务,可能只是一个拆小的小单体 ...

  8. 分布式与微服务——Iaas,Paas和Saas、单体应用和缺点、微服务概念、传统 分布式 SOA 架构与微服务架构的区别、微服务实战、什么是RPC、CAP定理和BASE理论、唯一ID生成、实现分布式

    文章目录 1-什么是Iaas,Paas和Saas 一 IaaS基础设施服务 二 paas平台即服务 三saas软件即服务 四 总结 2-单体应用和缺点 一 单体应用 二 单体应用的缺陷 3-微服务概念 ...

  9. 【架构】分布式服务架构与微服务架构

    文章目录 0)服务相关架构的演变 *关于面向对象.面向组件.面向服务 1)面向服务架构(SOA) 1.1 什么是面向服务架构(SOA)? 1.2 为什么需要SOA? 1.3 SOA 的特征 1.4 S ...

  10. SOA架构和微服务架构的区别(转载)

    文章目录 1.SOA架构和微服务架构的区别 2.ESB和微服务API网关 1.ESB(企业服务总线) 2.API网关: 3.SOA架构特点: 4.微服务架构特点: 1.通过服务实现组件化 2.按业务能 ...

最新文章

  1. xp 安装mysql数据库_Windows XP系统中安装MySQL5.5.28数据库图文教程
  2. c语言关键字_C语言初学者必须掌握的关键字!
  3. 通过日志恢复MSSQL数据案例
  4. 如何把a1的图纸变成a0_如何安装家用空开配电
  5. 泰坦尼克数据集预测分析_探索性数据分析—以泰坦尼克号数据集为例(第1部分)
  6. 如何查看数据文件或者Log文件是否增长过?
  7. SQL Server 2000详细安装过程及配置
  8. 【爬虫剑谱】一卷1章 软件篇-Mongodb的安装及配置
  9. CCF201312试题
  10. springboot的多数据源配置(多库/主从等等场景)
  11. 全民战“疫”,ZStack ZCCT在线认证疫情期间免费开放!
  12. DXGI抓屏优化扩展:鼠标功能+数据获取+多显示器捕获(屏幕共享源码)
  13. node.js 在 Express4.0 框架使用 Connect-Busboy 实现文件上传
  14. Don't Starve:饥荒
  15. 基于黑寡妇优化算法的函数优化算法
  16. Android Tv wifi网络登录认证
  17. 判断ssh远程命令是否执行结束
  18. 利用freemarker实现word导出
  19. win10远程连接服务器出现“这可能是由于credssp加密……”的原因及解决办法,win10家庭版无法找到gpedit.msc或者组策略或安全组策略
  20. 运维管理:极简运维系统设计

热门文章

  1. 前端基础-html-换行标签
  2. 计组之概述:计算机系统
  3. (王道408考研操作系统)第四章文件管理-第一节7:文件共享
  4. 推动Windows的限制:句柄
  5. 64bit centos如何编译 32bit的程序
  6. 1365. 有多少小于当前数字的数字
  7. linux 查找某目录下包含关键字内容的文件(文件内容、grep)
  8. masscan安装、研究、测试之旅、扫描结果处理
  9. jqgrid表格下拉搜索多选框优化—使用select下拉多选插件
  10. sklearn.metrics.mean_absolute_error