腾讯微服务平台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

相关推荐
Lhan.zzZ4 小时前
笔记_2026.4.28_004
c++·ide·笔记·qt
其实防守也摸鱼6 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
网络工程小王6 小时前
【LangChain 大模型6大调用指南】调用大模型篇
linux·运维·服务器·人工智能·学习
qq_571099356 小时前
学习周报四十三
学习
小郑加油7 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
phltxy7 小时前
Spring Cloud 分布式服务部署实战:从 0 到 1 实现微服务上线
spring·spring cloud·微服务
Yeh2020588 小时前
Filter与Listener笔记
笔记
九成宫8 小时前
Git 与远程仓库实操记录:克隆、配置、分支推送与问题排查
笔记·git·ssh
MegaDataFlowers9 小时前
英语六级我还在背单词:Unit 1(Lesson 2)
学习
东京老树根9 小时前
SAP学习笔记 - BTP SAP Build12 - SAP Build Content Package
笔记·学习