nacos+ribbon+feign+gateway设计实现灰度方案 一. 架构设计 二. 具体操作及规划 三. 各组件功能原理 四. 重点代码实现

nacos+ribbon+feign+gateway设计实现灰度方案
一. 架构设计
二. 具体操作及规划
三. 各组件功能原理
四. 重点代码实现

 步骤:

1. 全局配置灰度是否启用--在nacos中配置, 动态更新 
2. 配置灰度规则, version=2.0, class="1234567" maxClassId="010-1234567"
3. 设置灰度服务器, 哪些服务器是灰度服务器。 为其打标签
4. 启动所有服务, 服务在nacos上进行注册
5. 客户端发起请求, 带着header参数
6. zuul进行过滤,判断是否符合灰度条件, 如果符合,打上灰度标签
7. 通过feign将灰度标签进行透传
8. 通过ribbon选择跳转的服务器, 可以指定负载均衡策略
9. 下一个服务器继续跳转,带上feign的灰度标签,继续请求。

以上是这个灰度方案实现的整体逻辑和思路

二. 具体操作及规划

2.1 灰度模型

不同的流量过来, 走不同的微服务

nacos+ribbon+feign+gateway设计实现灰度方案
一. 架构设计
二. 具体操作及规划
三. 各组件功能原理
四. 重点代码实现

 根据条件进行匹配, 看是否符合灰度规则. 

1. 没有匹配的灰度规则, 则走无灰度服务

2. 有匹配灰度规则, 则走对应的灰度服务

3. 可以同时存在多个灰度服务.

2.2 设置灰度规则

 1. 在nacos中配置一个全局的开关, 用来控制是否开启灰度.

2. 配置一个管理后台, 管理后台主要有两大块内容.

  1)  配置灰度规则

  2) 设置灰度服务器

nacos+ribbon+feign+gateway设计实现灰度方案
一. 架构设计
二. 具体操作及规划
三. 各组件功能原理
四. 重点代码实现

  

 2.3. 网关设置--拦截请求, 为其打灰度标签

给网关添加一个过滤器, 用来过滤用户的请求

 nacos+ribbon+feign+gateway设计实现灰度方案
一. 架构设计
二. 具体操作及规划
三. 各组件功能原理
四. 重点代码实现

 4. ribbon设置 -- 根据灰度规则, 选择灰度服务器

nacos+ribbon+feign+gateway设计实现灰度方案
一. 架构设计
二. 具体操作及规划
三. 各组件功能原理
四. 重点代码实现

5. 自定义Feign拦截器, 实现参数(灰度标签)的透传

nacos+ribbon+feign+gateway设计实现灰度方案
一. 架构设计
二. 具体操作及规划
三. 各组件功能原理
四. 重点代码实现

三. 各组件功能原理

 1. zuul网关

在这里定义级别,我们首先需要知道现在的过滤器已经有哪些? 他们的过滤顺序是什么样的? 执行的是什么样的功能?

2. ribbon

3. feign

4. nacos

四. 重点代码实现

3.1 网关代码

1. 引入jar包

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

2. 在启动类加入注解

@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
@EnableZuulProxy
public class StockApplication {

    public static void main(String[] args) {
        SpringApplication.run(StockApplication.class, args);
    }

}

3. 定义一个灰度过滤器

灰度过滤器继承自ZuulFilter

public class GrayZuulFilter extends ZuulFilter {

灰度要求所有链接都要进行灰度判断, 所以,设置其为前置过滤器

    /**
     * 这是一个前置过滤器
     * @return
     */
    @Override
    public String filterType() {
        return PRE_TYPE;
    }

并且所有的连接都要进行过滤, 设置过滤级别为1. 

在这里定义级别,我们首先需要知道现在的过滤器已经有哪些? 他们的过滤顺序是什么样的? 执行的是什么样的功能? 这在上面已经梳理过了.

经过考虑, 我们将自定义过滤器的顺序设置为1

/**
 * 过滤的顺序是1
 * @return
 */
@Override
public int filterOrder() {
    return 1;
}

过滤器执行的条件是: 所有链接都需要执行

    /**
     * 过滤器执行的条件
     * 所有url链接全部需要走这个过滤器
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

下面来看看过滤器的执行逻辑























as