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