乐趣区

关于java:Zuul除了做网关还能干什么

首先,网关能为咱们做什么?

它能为咱们做路由转发,黑、白名单、过滤申请等等等等

网关的实质,其实就是一系列的过滤器,记得咱们最开始学习过滤器的时候,servlet 的 doFilter,有没有小伙伴的 DNA 动了,哈哈

咱们明天要说的就是利用网关的实质,过滤器,来做灰度公布

说之前,先讲讲什么是灰度公布,常常听到这个名词,就是不晓得是干嘛的

明天,必须得给他整的明明白白的

灰度公布,也叫金丝雀公布,说的就是可能平滑过渡的一种公布版本的一种形式,在其上能够进行 A /B testing,即让一部分用户持续用产品个性 A,一部分用户开始用产品个性 B,如果用户对 B 没有什么拥护意见,那么逐渐扩大范围,把所有用户都迁徙到 B 下面来。

有啥益处呢?

它能够保障整体零碎的稳固,在初始灰度的时候就能够发现、调整问题,以保障其影响度。

除了灰度公布还有那种公布形式呢?

蓝绿公布、滚动公布等等

简略说说蓝绿公布的原理:

须要另外在开启三台服务器 (承载新的服务)

滚动公布:

就是将新服务代替其中一个服务,被代替的闲暇进去持续装载另一个新服务,一个一个替换

灰度公布:

启动雷同的服务设置配置文件的版本,例如:启动 3 个雷同服务,一个版本是 V2,剩下两个是 V1(版本能够利用 Eureka 注册核心的 API 来动静批改)

eureka:
 instance:
  metadata-map:
  #自定义属性  版本 V1、V2
   version: v2

所有准备就绪,回到 Zuul 网关,Zuul 网关的过滤器,分那么几种类型,pre、route、post、error

执行程序是:pre —> route —> post

想要自定义网关过滤器,继承 ZuulFilter,实现其的办法

应用 @Component 注解,交由 Spring 容器治理

实现办法是有 4 个办法,fileType、filterOrder、shouldFilter、run

  • fileType 办法,指定这个过滤器是什么类型的,pre、route、post、error
  • filterOrder 办法,决定执行程序,数越小,越先执行
  • shouldFilter 办法,决定这个过滤器是否执行,true 执行,false 不执行
  • run 办法,过滤器的执行逻辑

自定义网关过滤器,相似这种灰度公布,就尽量应用 pre 类型的过滤器

在发动申请,申请头携带 userId(依据用户 ID 来辨别是否是来拜访新的的服务)

@Override
public Object run() throws ZuulException {
    // 获取申请上下文
    RequestContext currentContext = RequestContext.getCurrentContext();
    // 获取到 HttpServletRequest
    HttpServletRequest request = currentContext.getRequest();
    // 获取申请头携带的 userId
    Integer userId = Integer.parseInt(request.getHeader("userId"));
    // 查问本地缓存 /DB/Redis,来确定这个用户是否须要拜访新服务,还是持续拜访旧服务
    if (userId >= 5000) {
        // 伪代码,假如这个用户是 ID 属于比 5000 要大,就让他拜访 / 体验新服务
        RibbonFilterContextHolder.getCurrentContext().add("version", "v2");
    } else {
        // 否则,持续让用户体验旧的服务
        // 因为 V1 咱们启动了两个所以负载平衡也能够持续应用
        RibbonFilterContextHolder.getCurrentContext().add("version", "v1");
    }
    return null;
}

这里用到了 RibbonFilter 相干的依赖,也给大家筹备好了

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

还有一点要留神的是,网关在过滤申请的时候,有可能会使你申请头数据失落,没错,的确是网关给你吃了

它不是过意的哈,它是想保障平安,一些比拟特地的 key,他就会给你抹掉,如 Authorization、Cookie 等

// 网关配置好这个,什么都不必填,就能够不让网管把携带的申请头参数抹掉
zuul:
 sensitive-header: 

嘿嘿,大家喜爱的能够关注我的微信公众号哦,据说当初关注的,当前都是尊贵的老粉了

退出移动版