腾讯微服务平台TSF学习笔记(二)--如何使用spring cloud zuul实现线上流量复制

需求提了n遍了,好好好,那这个需求就由我测试来做

1.在zuul端配置:

●假设provider-mirror是provider-demo的灰度应用

java 复制代码
package com.tencent.tsf.msgw.zuul1.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.client.RestTemplate;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

import org.slf4j.Logger;

public class TrafficCopyFilter extends ZuulFilter {
    private static final Logger LOG = LoggerFactory.getLogger(TrafficCopyFilter.class);

    private RestTemplate restTemplate = new RestTemplate();

    @Override
    public String filterType() {
        return "pre";
    }

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

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        // 检查请求是否是发送给服务A的
        if (request.getRequestURI().contains("/provider-demo")) {
            LOG.info("复制请求到mirror服务");
            // 将请求复制到服务B

            String param = request.getRequestURI().substring(request.getRequestURI().lastIndexOf("/") + 1); // 提取参数
            String bServiceUrl = "http://svcb host ip:port/echo/" + param; //这里写mirror服务的镜像地址,后期可从配置文件中读入
            HttpMethod method = HttpMethod.valueOf(request.getMethod());
            HttpHeaders headers = new HttpHeaders();

            Enumeration<String> headerNames = request.getHeaderNames();
            while (headerNames.hasMoreElements()) {
                String headerName = headerNames.nextElement();
                headers.add(headerName, request.getHeader(headerName));
            }

            HttpEntity<String> entity = new HttpEntity<>(headers);
            try {
                restTemplate.exchange(bServiceUrl, method, entity, Void.class);
            } catch (Exception e) {
                // 捕获异常,避免影响客户端
                LOG.error("复制请求到mirror服务失败: {}", e.getMessage());
            }
        }

        return null;
    }
}

配置类

java 复制代码
package com.tencent.tsf.msgw.zuul1.filter;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ZuulConfig {

    @Bean
    public TrafficCopyFilter trafficCopyFilter() {
        return new TrafficCopyFilter();
    }
}

最后,我们会发现,通过zuul请求provider时,流量会被复制到provider-mirror

相关推荐
IMPYLH10 分钟前
Lua 的 IO (输入/输出)模块
开发语言·笔记·后端·lua
2301_7833601310 分钟前
【学习笔记】关于RNA_seq和Ribo_seq技术的对比和BAM生成
笔记·学习
qq_3977315112 分钟前
Objective-C 学习笔记(第9章)
笔记·学习·objective-c
ujainu40 分钟前
Python学习第一天:保留字和标识符
python·学习·标识符·保留字
sheji341641 分钟前
【开题答辩全过程】以 基于Java的应急安全学习平台的设计与实现为例,包含答辩的问题和答案
java·开发语言·学习
喵了meme1 小时前
Linux学习日记21:读写锁
linux·c语言·学习
二进制怪兽1 小时前
[总结] AI Agent工程师
笔记
好奇龙猫1 小时前
日语学习-日语知识点小记-构建基础-JLPT-N3阶段-二阶段(29):第八科文法
学习
张人玉1 小时前
图像处理函数与形态学操作笔记(含 Halcon 示例)
图像处理·人工智能·笔记·halcon
pingzhuyan1 小时前
微服务: springboot整合kafka实现消息的简单收发(上)
spring boot·微服务·kafka