|
@ -4,8 +4,8 @@ import com.netflix.zuul.ZuulFilter;
|
|
|
import com.netflix.zuul.context.RequestContext;
|
|
|
import com.yihu.admin.client.properties.AdminClientProperties;
|
|
|
import com.yihu.admin.client.util.NetworkUtil;
|
|
|
import com.yihu.admin.client.websocket.buffer.EventBuffer;
|
|
|
import com.yihu.admin.client.websocket.event.HttpEvent;
|
|
|
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
|
|
|
import net.sf.json.JSONObject;
|
|
|
import okhttp3.*;
|
|
|
import okhttp3.internal.http.HttpMethod;
|
|
@ -16,34 +16,39 @@ import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
|
import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper;
|
|
|
import org.springframework.cloud.sleuth.Tracer;
|
|
|
import org.springframework.context.annotation.Conditional;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import org.springframework.util.LinkedMultiValueMap;
|
|
|
import org.springframework.util.StreamUtils;
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import java.io.InputStream;
|
|
|
import java.net.URL;
|
|
|
import java.util.Enumeration;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
|
|
|
/**
|
|
|
* Created by chenweida on 2018/5/31 0031.
|
|
|
* 目前还有bug 要解决跳转之后的
|
|
|
*/
|
|
|
@Component
|
|
|
@ConditionalOnProperty(name = "yihu.admin.client.advice.zuul.route", havingValue = "true")
|
|
|
public class ZuulRouteFilter extends ZuulFilter {
|
|
|
private Logger logger= LoggerFactory.getLogger(ZuulRouteFilter.class);
|
|
|
private Logger logger = LoggerFactory.getLogger(ZuulRouteFilter.class);
|
|
|
@Autowired
|
|
|
private Tracer tracer;
|
|
|
@Autowired
|
|
|
private SimpleEventSender simpleEventSender;
|
|
|
private EventBuffer eventBuffer;
|
|
|
@Autowired
|
|
|
private AdminClientProperties adminClientProperties;
|
|
|
@Value("${spring.application.name}")
|
|
|
@Value("${spring.application.name:unknow}")
|
|
|
private String spanrName;
|
|
|
@Autowired
|
|
|
private ProxyRequestHelper helper;
|
|
|
@Autowired
|
|
|
private okhttp3.OkHttpClient httpClient;
|
|
|
|
|
|
@Override
|
|
|
public String filterType() {
|
|
|
//filterType:返回过滤器的类型。有pre、route、post、error等几种取值
|
|
@ -54,7 +59,7 @@ public class ZuulRouteFilter extends ZuulFilter {
|
|
|
@Override
|
|
|
public int filterOrder() {
|
|
|
//回一个int值来指定过滤器的执行顺序,不同的过滤器允许返回相同的数字
|
|
|
return 0;
|
|
|
return 600;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@ -68,13 +73,12 @@ public class ZuulRouteFilter extends ZuulFilter {
|
|
|
try {
|
|
|
RequestContext ctx = RequestContext.getCurrentContext();
|
|
|
HttpServletRequest request = ctx.getRequest();
|
|
|
OkHttpClient httpClient = new OkHttpClient.Builder() .build();
|
|
|
|
|
|
|
|
|
String method = request.getMethod();
|
|
|
|
|
|
String uri = this.helper.buildZuulRequestURI(request);
|
|
|
String idAddress= request.getRequestURL().toString().replace(request.getRequestURI(),"");
|
|
|
|
|
|
Headers.Builder headers = new Headers.Builder();
|
|
|
Enumeration<String> headerNames = request.getHeaderNames();
|
|
|
while (headerNames.hasMoreElements()) {
|
|
@ -86,7 +90,14 @@ public class ZuulRouteFilter extends ZuulFilter {
|
|
|
headers.add(name, value);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
String address="";
|
|
|
URL hostId = RequestContext.getCurrentContext().getRouteHost();
|
|
|
Object serviceId = RequestContext.getCurrentContext().get("serviceId");
|
|
|
if(hostId!=null){
|
|
|
address=hostId.toString();
|
|
|
}else if(!StringUtils.isEmpty(serviceId)){
|
|
|
address="http://"+serviceId.toString();
|
|
|
}
|
|
|
InputStream inputStream = request.getInputStream();
|
|
|
|
|
|
RequestBody requestBody = null;
|
|
@ -100,7 +111,7 @@ public class ZuulRouteFilter extends ZuulFilter {
|
|
|
|
|
|
Request.Builder builder = new Request.Builder()
|
|
|
.headers(headers.build())
|
|
|
.url(idAddress+uri)
|
|
|
.url(address+uri)
|
|
|
.method(method, requestBody);
|
|
|
//日志
|
|
|
HttpEvent event = new HttpEvent();
|
|
@ -114,15 +125,15 @@ public class ZuulRouteFilter extends ZuulFilter {
|
|
|
}
|
|
|
|
|
|
Response response = httpClient.newCall(builder.build()).execute();
|
|
|
try{
|
|
|
try {
|
|
|
Long endTime = System.currentTimeMillis();
|
|
|
event.setHeader(headerObj.toString());
|
|
|
event.setEventStartTime(startTime);
|
|
|
event.setEventEndTime(endTime);
|
|
|
event.setExcuteTime(endTime-startTime);
|
|
|
event.setExcuteTime(endTime - startTime);
|
|
|
event.setHeader(headerObj.toString());
|
|
|
event.setEventName("system_zuul_tracer");
|
|
|
event.setResponseParams( response.body().string());
|
|
|
event.setResponseParams(response.body().string());
|
|
|
event.setSpanName(spanrName);
|
|
|
event.setSpanId(tracer.getCurrentSpan().getSpanId() + "");
|
|
|
event.setTraceId(tracer.getCurrentSpan().traceIdString());
|
|
@ -131,8 +142,8 @@ public class ZuulRouteFilter extends ZuulFilter {
|
|
|
event.setUri(HttpAdvice.matchURI(request));
|
|
|
event.setIp(ip);
|
|
|
event.setMethod(request.getMethod());
|
|
|
simpleEventSender.send(event);
|
|
|
}catch (Exception e){
|
|
|
eventBuffer.addEvent(event);
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
logger.error(e.getMessage());
|
|
|
}
|
|
@ -143,12 +154,10 @@ public class ZuulRouteFilter extends ZuulFilter {
|
|
|
responseHeaders.put(entry.getKey(), entry.getValue());
|
|
|
}
|
|
|
|
|
|
this.helper.setResponse(response.code(), response.body().byteStream(),responseHeaders);
|
|
|
this.helper.setResponse(response.code(), response.body().byteStream(), responseHeaders);
|
|
|
ctx.setRouteHost(null); // prevent SimpleHostRoutingFilter from running
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
logger.error(e.getMessage());
|