فهرست منبع

Merge branch 'dev' of chenweida/jkzl-starter into dev

chenweida 6 سال پیش
والد
کامیت
9d07d02bdd

+ 10 - 4
admin/admin-client-starter/pom.xml

@ -29,11 +29,21 @@
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.java-websocket</groupId>
            <artifactId>Java-WebSocket</artifactId>
            <version>1.3.8</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.10.0</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
@ -43,10 +53,6 @@
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
        </dependency>
        <dependency>
            <groupId>com.netflix.zuul</groupId>
            <artifactId>zuul-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>

+ 2 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/HibernateFilter.java

@ -9,6 +9,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@ -21,6 +22,7 @@ import java.util.Iterator;
 */
@Component
@Order(0)
@ConditionalOnProperty(name = "yihu.admin.client.advice.sql.hibernate", havingValue = "true")
public class HibernateFilter extends EmptyInterceptor {
    private Logger logger = LoggerFactory.getLogger(HibernateFilter.class);

+ 2 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/HttpAdvice.java

@ -13,6 +13,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
@ -35,6 +36,7 @@ import java.util.*;
 */
@Aspect
@Component
@ConditionalOnProperty(name = "yihu.admin.client.advice.http", havingValue = "true")
public class HttpAdvice {
    @Autowired
    private Tracer tracer;

+ 2 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/SQLTimeAdvice.java

@ -11,6 +11,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.actuate.trace.Trace;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@ -27,6 +28,7 @@ import java.util.UUID;
 */
@Aspect
@Component
@ConditionalOnProperty(name = "yihu.admin.client.advice.sql.springJDBC", havingValue = "true")
public class SQLTimeAdvice {
    @Autowired
    private Tracer tracer;

+ 2 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/ZuulPostFilter.java

@ -9,6 +9,7 @@ import com.yihu.admin.client.websocket.sender.SimpleEventSender;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Component;
@ -20,6 +21,7 @@ import java.util.Enumeration;
 * Created by chenweida on 2018/5/31 0031.
 */
@Component
@ConditionalOnProperty(name = "yihu.admin.client.advice.zuul.post", havingValue = "true")
public class ZuulPostFilter extends ZuulFilter {
    @Autowired
    private Tracer tracer;

+ 93 - 26
admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/ZuulPreFilter.java

@ -7,20 +7,33 @@ import com.yihu.admin.client.util.NetworkUtil;
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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
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.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.StreamUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
/**
 * Created by chenweida on 2018/5/31 0031.
 */
@Component
@ConditionalOnProperty(name = "yihu.admin.client.advice.zuul.pre", havingValue = "true")
public class ZuulPreFilter extends ZuulFilter {
    private Logger logger= LoggerFactory.getLogger(ZuulPreFilter.class);
    @Autowired
    private Tracer tracer;
    @Autowired
@ -29,12 +42,13 @@ public class ZuulPreFilter extends ZuulFilter {
    private AdminClientProperties adminClientProperties;
    @Value("${spring.application.name}")
    private String spanrName;
    @Autowired
    private ProxyRequestHelper helper;
    @Override
    public String filterType() {
        //filterType:返回过滤器的类型。有pre、route、post、error等几种取值
        return "pre";
        return "route";
    }
    @Override
@ -51,43 +65,96 @@ public class ZuulPreFilter extends ZuulFilter {
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        try {
            RequestContext ctx = RequestContext.getCurrentContext();
            HttpServletRequest request = ctx.getRequest();
            OkHttpClient httpClient = new OkHttpClient.Builder()
                    // customize
                    .build();
        try {
            String method = request.getMethod();
            String uri = this.helper.buildZuulRequestURI(request);
            Headers.Builder headers = new Headers.Builder();
            Enumeration<String> headerNames = request.getHeaderNames();
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                Enumeration<String> values = request.getHeaders(name);
                while (values.hasMoreElements()) {
                    String value = values.nextElement();
                    headers.add(name, value);
                }
            }
            InputStream inputStream = request.getInputStream();
            RequestBody requestBody = null;
            if (inputStream != null && HttpMethod.permitsRequestBody(method)) {
                MediaType mediaType = null;
                if (headers.get("Content-Type") != null) {
                    mediaType = MediaType.parse(headers.get("Content-Type"));
                }
                requestBody = RequestBody.create(mediaType, StreamUtils.copyToByteArray(inputStream));
            }
            Request.Builder builder = new Request.Builder()
                    .headers(headers.build())
                    .url(uri)
                    .method(method, requestBody);
            //日志
            HttpEvent event = new HttpEvent();
            Long startTime = System.currentTimeMillis();
            String ip = NetworkUtil.getIpAddress(request);
            JSONObject headerObj = new JSONObject();
            Enumeration<String> headers = request.getHeaderNames();
            while (headers.hasMoreElements()) {
                String value = headers.nextElement();
            Enumeration<String> headersed = request.getHeaderNames();
            while (headersed.hasMoreElements()) {
                String value = headersed.nextElement();
                headerObj.put(value, request.getHeader(value));
            }
            event.setHeader(headerObj.toString());
            event.setEventStartTime(startTime);
            event.setEventEndTime(startTime);
            event.setExcuteTime(0L);
            event.setHeader(headerObj.toString());
            event.setEventName("system_zuul_tracer");
            event.setSpanName(spanrName);
            event.setSpanId(tracer.getCurrentSpan().getSpanId() + "");
            event.setTraceId(tracer.getCurrentSpan().traceIdString());
            event.setRequestParams(JSONObject.fromObject(request.getParameterMap()).toString());
            event.setSuccess(1);
            event.setUri(HttpAdvice.matchURI(request));
            event.setIp(ip);
            event.setMethod(request.getMethod());
            simpleEventSender.send(event);
            Response response = httpClient.newCall(builder.build()).execute();
            try{
                Long endTime = System.currentTimeMillis();
                event.setHeader(headerObj.toString());
                event.setEventStartTime(startTime);
                event.setEventEndTime(endTime);
                event.setExcuteTime(endTime-startTime);
                event.setHeader(headerObj.toString());
                event.setEventName("system_zuul_tracer");
                event.setResponseParams( response.body().string());
                event.setSpanName(spanrName);
                event.setSpanId(tracer.getCurrentSpan().getSpanId() + "");
                event.setTraceId(tracer.getCurrentSpan().traceIdString());
                event.setRequestParams(JSONObject.fromObject(request.getParameterMap()).toString());
                event.setSuccess(1);
                event.setUri(HttpAdvice.matchURI(request));
                event.setIp(ip);
                event.setMethod(request.getMethod());
                simpleEventSender.send(event);
            }catch (Exception e){
            }
            LinkedMultiValueMap<String, String> responseHeaders = new LinkedMultiValueMap<>();
            for (Map.Entry<String, List<String>> entry : response.headers().toMultimap().entrySet()) {
                responseHeaders.put(entry.getKey(), entry.getValue());
            }
            this.helper.setResponse(response.code(), response.body().byteStream(),responseHeaders);
            ctx.setRouteHost(null); // prevent SimpleHostRoutingFilter from running
        } catch (Exception e) {
        }
        HttpServletResponse response = ctx.getResponse();
        return response;
        return null;
    }
}

+ 160 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/ZuulRouteFilter.java

@ -0,0 +1,160 @@
package com.yihu.admin.client.advice;
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.event.HttpEvent;
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
import net.sf.json.JSONObject;
import okhttp3.*;
import okhttp3.internal.http.HttpMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
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 javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
/**
 * Created by chenweida on 2018/5/31 0031.
 */
@Component
@ConditionalOnProperty(name = "yihu.admin.client.advice.zuul.route", havingValue = "true")
public class ZuulRouteFilter extends ZuulFilter {
    private Logger logger= LoggerFactory.getLogger(ZuulRouteFilter.class);
    @Autowired
    private Tracer tracer;
    @Autowired
    private SimpleEventSender simpleEventSender;
    @Autowired
    private AdminClientProperties adminClientProperties;
    @Value("${spring.application.name}")
    private String spanrName;
    @Autowired
    private ProxyRequestHelper helper;
    @Override
    public String filterType() {
        //filterType:返回过滤器的类型。有pre、route、post、error等几种取值
        return "route";
    }
    @Override
    public int filterOrder() {
        //回一个int值来指定过滤器的执行顺序,不同的过滤器允许返回相同的数字
        return 0;
    }
    @Override
    public boolean shouldFilter() {
        //返回一个boolean值来判断该过滤器是否要执行,true表示执行,false表示不执行。
        return adminClientProperties.getZuulRoute();
    }
    @Override
    public Object run() {
        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()) {
                String name = headerNames.nextElement();
                Enumeration<String> values = request.getHeaders(name);
                while (values.hasMoreElements()) {
                    String value = values.nextElement();
                    headers.add(name, value);
                }
            }
            InputStream inputStream = request.getInputStream();
            RequestBody requestBody = null;
            if (inputStream != null && HttpMethod.permitsRequestBody(method)) {
                MediaType mediaType = null;
                if (headers.get("Content-Type") != null) {
                    mediaType = MediaType.parse(headers.get("Content-Type"));
                }
                requestBody = RequestBody.create(mediaType, StreamUtils.copyToByteArray(inputStream));
            }
            Request.Builder builder = new Request.Builder()
                    .headers(headers.build())
                    .url(idAddress+uri)
                    .method(method, requestBody);
            //日志
            HttpEvent event = new HttpEvent();
            Long startTime = System.currentTimeMillis();
            String ip = NetworkUtil.getIpAddress(request);
            JSONObject headerObj = new JSONObject();
            Enumeration<String> headersed = request.getHeaderNames();
            while (headersed.hasMoreElements()) {
                String value = headersed.nextElement();
                headerObj.put(value, request.getHeader(value));
            }
            Response response = httpClient.newCall(builder.build()).execute();
            try{
                Long endTime = System.currentTimeMillis();
                event.setHeader(headerObj.toString());
                event.setEventStartTime(startTime);
                event.setEventEndTime(endTime);
                event.setExcuteTime(endTime-startTime);
                event.setHeader(headerObj.toString());
                event.setEventName("system_zuul_tracer");
                event.setResponseParams( response.body().string());
                event.setSpanName(spanrName);
                event.setSpanId(tracer.getCurrentSpan().getSpanId() + "");
                event.setTraceId(tracer.getCurrentSpan().traceIdString());
                event.setRequestParams(JSONObject.fromObject(request.getParameterMap()).toString());
                event.setSuccess(1);
                event.setUri(HttpAdvice.matchURI(request));
                event.setIp(ip);
                event.setMethod(request.getMethod());
                simpleEventSender.send(event);
            }catch (Exception e){
                e.printStackTrace();
                logger.error(e.getMessage());
            }
            LinkedMultiValueMap<String, String> responseHeaders = new LinkedMultiValueMap<>();
            for (Map.Entry<String, List<String>> entry : response.headers().toMultimap().entrySet()) {
                responseHeaders.put(entry.getKey(), entry.getValue());
            }
            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());
        }
        return null;
    }
}

+ 1 - 2
admin/admin-client-starter/src/main/java/com/yihu/admin/client/config/WebsocketConfig.java

@ -6,6 +6,7 @@ import com.yihu.admin.client.websocket.SocketClient;
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
import org.hibernate.EmptyInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.cloud.sleuth.Tracer;
@ -32,8 +33,6 @@ import java.util.Map;
public class WebsocketConfig {
    @Autowired
    SocketClient socketClient;
    @Autowired
    private HibernateFilter hibernateFilter;
    @Bean
    public SimpleEventSender simpleEventSender() {

+ 10 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/properties/AdminClientProperties.java

@ -20,6 +20,8 @@ public class AdminClientProperties {
    private Boolean zuulPre;//port
    @Value("${yihu.admin.client.advice.zuul.post:false}")
    private Boolean zuulPost;//port
    @Value("${yihu.admin.client.advice.zuul.route:false}")
    private Boolean zuulRoute;//port
    @Value("${yihu.admin.client.advice.http:true}")
    private Boolean http;//port
@ -78,4 +80,12 @@ public class AdminClientProperties {
    public void setHibernateSql(Boolean hibernateSql) {
        this.hibernateSql = hibernateSql;
    }
    public Boolean getZuulRoute() {
        return zuulRoute;
    }
    public void setZuulRoute(Boolean zuulRoute) {
        this.zuulRoute = zuulRoute;
    }
}