首页 文章 精选 留言 我的

精选列表

搜索[Compose模式],共10000篇文章
优秀的个人博客,低调大师

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

本文源码: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" ; /** * 处理请求头参数携带问题 */ @Override public 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 { @Bean public GrayReqInterceptor grayReqInterceptor(){ return new GrayReqInterceptor(); } private static final String VERSION_KEY = "versionId" ; @Override public 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

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册