需求提了n遍了,好好好,那這個需求就由我測試來做
1.在zuul端配置:
●假設provider-mirror是provider-demo的灰度應用
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();@Overridepublic String filterType() {return "pre";}@Overridepublic int filterOrder() {return 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();// 檢查請求是否是發送給服務A的if (request.getRequestURI().contains("/provider-demo")) {LOG.info("復制請求到mirror服務");// 將請求復制到服務BString 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;}
}
配置類
package com.tencent.tsf.msgw.zuul1.filter;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ZuulConfig {@Beanpublic TrafficCopyFilter trafficCopyFilter() {return new TrafficCopyFilter();}
}
最后,我們會發現,通過zuul請求provider時,流量會被復制到provider-mirror