|  | @ -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());
 |