spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求

原创 2018年04月16日 14:26:07

spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求

有半年多没有更新了,按照常规剧本,应该会说项目很忙,工作很忙,没空更新,吧啦吧啦,相关的话吧,

但是细想想,是真的么?,忙到这几个字都没时间打么?毕竟大家都很忙的,所以忙并不是啥理由.

那是因为啥呢?感觉就只有一个理由能站得住脚了,就是因为”懒”. 哈哈….

尬聊了一段,活跃下气氛,下面进入正题

场景

在实际工作中,大家可能也都遇到过这样的情况 :

一个正在更新迭代过程中项目,会收到大量业务部门的需求,这些需求可能会来自于不同业务部门,或者不同的产品经理

而项目的onwer则需要接收到这些需求,对这些需求进行初步的分析和排期,但是在排期的过程中,会有这样一种尴尬的情况发生.

比如,有两个互不嗒噶的产品经理,针对同一功能点,提出了两个不同业务改造的需求点,两个需求点要求上线的时间很接近,但是又出于某种原因,不能同时上线,或者产品经理根本无法确定上线时间,而告诉你尽快完成开发/测试,他则根据实际情况确定业务需求的发布时间

那么,对于这种情况,通常会采用开分支的方式进行开发,即不同版本的并行需求的开发在不同分支上同时进行开发,那么,团队成员(开发/测试),则可以同时的开展工作,有的负责A需求,有的负责B需求,互不影响

起初开发阶段的时候,一切很顺利,但是等到开发完毕提测后,测试介入,系统要打入测试环境进行集成测试的时候,那么问题就来了.

A版本和B版本,目前所属在不同分支上,如果要同时进行集成测试,那系统应该如何部署呢?

方案

根据上述场景,其实核心问题是,在不添加多套集成测试的环境下,也能针对同一个服务的不同版本,同时进行测试.

我们项目是基于spring cloud构建的,那么解决的思路就是,在网关层根据不同的版本号进行判断,重新指派网关路由的serviceId,那么下面看相关的实现:

架构图

输入图片说明

相关实现

首先,在不同的分支上定义不同的版本号,然后将应用名称拼接上版本号,这样应用在注册到eureka的时候,由于版本号不同,那么就会被认定为是不同的服务

info.app.version=v1 # 其他分支上定义其他版本号
spring.application.name=service-a-${info.app.version}

其次,在zuul层添加路由拦截器,主要是抓取版本号(当然,这个版本号不一定要放在header里面),获得zuul预先根据url根匹配的serviceId,然后拼接上版本号,让其路由到正确的服务中,达到改变代理行为的目的

@Component
public class VersionChangeFilter extends ZuulFilter {

    @Autowired
    private DiscoveryClient discoveryClient;


    @Override
    public String filterType() {
        return ROUTE_TYPE;
    }

    @Override
    public int filterOrder() {
        return 9;
    }

    @Override
    public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        return ctx.sendZuulResponse();
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String version=request.getHeader("version");
        if(StringUtils.isNotBlank(version)){
            String serviceId=String.valueOf(ctx.get("serviceId")).concat(version).toLowerCase();
            List<String> services = discoveryClient.getServices();
            if(services.contains(serviceId)){
                ctx.set("serviceId",serviceId);
            }
        }
        return null;
    }
}

结束

这样一来,在不增加任何环境资源的前提下,可以实现不同版本服务的服务同时发布.满足了并行集成测试的需求

当然,还是那句话,解决同样问题的方法有多种,我上述的方法也不一定是最好的,如果有更好经验的同学,欢迎大家踊跃讨论.

关于本文内容 , 欢迎大家的意见跟建议

代码仓库 (博客配套代码)


想获得最快更新,请关注公众号

输入图片说明

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangkang80/article/details/79960161

Springboot + Springcloud 配置一个服务多实例 负载均衡实现(fegin)

转载请注明出处,谢谢,如有描述不准,请各位大牛指教。。。。。。。。
  • xieliaowa9231
  • xieliaowa9231
  • 2017-12-27 15:37:00
  • 707

基于Spring Boot和Cloud Foundry实现微服务架构学习(2017227更新)

年前入手Spring boot in action一书,因之前读过craig walls 的 Spring in action,所以Spring boot上手容易些,其实这些framework万变不离...
  • linfujian1999
  • linfujian1999
  • 2017-02-25 12:36:35
  • 1064

Hessian探究(一)Hessian与Spring结合

上一篇博客Hessian探究(一)Hessian入门示例我们初步简单的介绍了一下Hessian的使用入门示例,由于Spring现在使用的实在是太广泛了,接下来我们介绍一下Hessian和Spring一...
  • qq924862077
  • qq924862077
  • 2016-10-12 13:41:59
  • 1468

Spring cloud 多版本控制及灰度发布

在我们使用spring mvc单体架构时, 我们可以通过uri,或者请求头做多版本路由,虽然同一个功能需要维护多个版本的接口,但是对于系统而言,不会因为新增一个接口版本而影响到老用户。当我们使用spr...
  • longdan3105
  • longdan3105
  • 2018-01-28 15:43:33
  • 749

基于Spring Boot、Spring Cloud、Docker的微服务系统架构实践

原文/项目 地址:https://github.com/sqshq/PiggyMetrics由于最近公司业务需要,需要基于Spring Cloud的微服务系统。遍访各大搜索引擎,发现国内资料少之又少,...
  • rickiyeat
  • rickiyeat
  • 2017-03-07 23:39:02
  • 35696

spring cloud-将spring boot服务注册到Eureka Server上

开篇: 我们将前面的 springboot整合H2内存数据库,实现单元测试与数据库无关性 提供的Restful服务注册到spring cloud的Eureka Server上。 一、引入Eurek...
  • liuchuanhong1
  • liuchuanhong1
  • 2017-01-22 10:26:55
  • 6378

springcloud微服务二:Eureka服务治理之服务注册中心

当初步的学习了spring boot,了解了spring boot的基本实现过程后,我就正式开始学习spring cloud,首先就从Eureka服务治理开始。服务治理包含三个核心的角色:服务注册中心...
  • tuzongxun
  • tuzongxun
  • 2017-05-23 16:33:54
  • 4332

Spring Framework灰度发布

今天简单介绍下SpringFramework微服务中几种服务发布策略以及实现方式。我接触过的有蓝绿、滚筒和灰度发布。...
  • yejingtao703
  • yejingtao703
  • 2017-11-17 16:47:35
  • 948

基于Spring Boot和Spring Cloud实现微服务架构学习(六)-Docker应用

基于Spring Boot和Spring Cloud框架开发的微服务架构学习(六)-Docker应用 下面就介绍如何将之前的Spring Boot项目部署在Docker上,首先,在应用根目录下建立 D...
  • zeb_perfect
  • zeb_perfect
  • 2016-07-24 23:11:19
  • 9700

spring-cloud中eureka进行服务治理

eureka进行服务治理实现以及架构解析。
  • BuquTianya
  • BuquTianya
  • 2017-11-13 22:04:28
  • 805
收藏助手
不良信息举报
您举报文章:spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求
举报原因:
原因补充:

(最多只允许输入30个字)