美文网首页
spring cloud灰度发布

spring cloud灰度发布

作者: staconfree | 来源:发表于2017-11-15 17:44 被阅读1846次

    灰度发布、蓝绿发布、金丝雀发布各是什么意思,可以看这篇http://www.appadhoc.com/blog/product-release-strategy/

    新建三个项目:

    • demo-server 服务端
    • demo-client 客户端
    • demo-gateway 网关层
      现在希望可以根据用户请求调用不同版本的代码,如下所示

    gateway->client(v1版本)->server(v1版本)
    |
    -->client(v2版本)->server(v2版本)

    分析

    从图中可知,gateway项目和client项目,需要我们根据不同参数来干涉负载分发。spring cloud是使用ribbon作为负载均衡,这里我们引入如下pom依赖:

            <dependency>
                <groupId>io.jmnarloch</groupId>
                <artifactId>ribbon-discovery-filter-spring-cloud-starter</artifactId>
                <version>2.1.0</version>
            </dependency>
    

    他的原理是通过匹配 请求里面的路由参数与eureka注册中心上实例配置的metadata里面的参数值,如果都匹配上了,才选择该实例节点。

    代码修改

    1、gateway项目

    在AccessFilter extends ZuulFilter的run方法中增加如下代码:

            RequestContext ctx = RequestContext.getCurrentContext();
            HttpServletRequest request = ctx.getRequest();
            //灰度示例
            RibbonFilterContextHolder.clearCurrentContext();
            String version = request.getHeader("dispatch-version");
    
            if (version!=null&&!"".equals(version)) {
                RibbonFilterContextHolder.getCurrentContext().add("dispatch-version", version);
            }
    

    注意:gateway项目记得配置zuul.routes.client-api.sensitiveHeaders=Cookie,Set-Cookie,Authorization

    2、client项目

    新增WebMvcConfig类

    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    
    @Configuration
    public class WebMvcConfig extends WebMvcConfigurerAdapter {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            super.addInterceptors(registry);
            registry.addInterceptor(new VersionInterceptor());
        }
    
    }
    

    新增VersionInterceptor类

    import io.jmnarloch.spring.cloud.ribbon.support.RibbonFilterContextHolder;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class VersionInterceptor extends HandlerInterceptorAdapter {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            RibbonFilterContextHolder.clearCurrentContext();
            String version = request.getHeader("dispatch-version");
            if (version!=null&&!"".equals(version)) {
                RibbonFilterContextHolder.getCurrentContext().add("dispatch-version", version);
            }
    
            return true;
        }
    }
    

    在application.yml里增加:

    eureka:
      instance:
        metadata-map:
          dispatch-version: v1
    

    3、server项目
    在application.yml里增加:

    eureka:
      instance:
        metadata-map:
          dispatch-version: v1
    

    验证

    启动gateway,client,server项目,
    模拟请求在header里面设置dispatch-version=v1,发现访问正常,如果把dispatch-version改成v2,发现访问不了
    这时,修改client和server项目的端口,并且dispatch-version改成v2,再启动新实例,这时再模拟请求dispatch-version=v2,发现访问正常了。
    来回修改dispatch-version的值,发现v1的请求只会访问v1版本,v2的请求只会访问v2版本。至此,灰度发布的demo已验证成功。

    参考githup上的开源项目jmnarloch

    相关文章

      网友评论

          本文标题:spring cloud灰度发布

          本文链接:https://www.haomeiwen.com/subject/orkhvxtx.html