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

相关推荐
一隅论数智5 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
XiHongShi20165 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
爱吃苹果的日记本5 天前
离散数学第六课
学习·离散数学
AI职业加油站5 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
深圳老胡5 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
旖旎夜光5 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
奇思妙想聪明勤奋的小羊5 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
Because_of_Her15 天前
并查集-听课笔记
笔记·算法·并查集
霍霍的袁5 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio