소스 검색

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

chenweida 6 년 전
부모
커밋
5670649a9c

+ 12 - 0
admin/admin-client-starter/pom.xml

@ -43,6 +43,18 @@
            <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>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
        </dependency>
    </dependencies>

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

@ -0,0 +1,61 @@
package com.yihu.admin.client.advice;
import com.yihu.admin.client.properties.AdminClientProperties;
import com.yihu.admin.client.websocket.event.SQLTimeEvent;
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
import org.hibernate.EmptyInterceptor;
import org.hibernate.Transaction;
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.cloud.sleuth.Tracer;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Iterator;
/**
 * Created by chenweida on 2018/5/31 0031.
 */
@Component
@Order(0)
public class HibernateFilter extends EmptyInterceptor {
    private Logger logger = LoggerFactory.getLogger(HibernateFilter.class);
    @Autowired
    private Tracer tracer;
    @Autowired
    private SimpleEventSender simpleEventSender;
    @Autowired
    private AdminClientProperties adminClientProperties;
    @Value("${spring.application.name}")
    private String spanrName;
    public HibernateFilter() {
        logger.info(" init HibernateFilter success!!!");
    }
    @Override
    public String onPrepareStatement(String sql) {
        if (adminClientProperties.getHibernateSql()) {
            Long endTime = new Date().getTime();
            SQLTimeEvent event = new SQLTimeEvent();
            //用改变后的参数执行目标方法
            event.setSql(sql);
            event.setEventStartTime(endTime);
            event.setEventEndTime(endTime);
            event.setEventName("system_sql_tracer");
            event.setExcuteTime(-1L);
            event.setSpanName(spanrName);
            event.setSpanId(tracer.getCurrentSpan().getSpanId() + "");
            event.setTraceId(tracer.getCurrentSpan().traceIdString());
            event.setSuccess(1);
            simpleEventSender.send(event);
        }
        return sql;
    }
}

+ 6 - 8
admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/HttpAdvice.java

@ -46,17 +46,16 @@ public class HttpAdvice {
    private String spanrName;
    private Logger logger = LoggerFactory.getLogger(HttpAdvice.class);
    private final String eventName = "sqlMonitor;";
    private List<RequestToMethodItem> getURL = new ArrayList<>();
    private List<RequestToMethodItem> postURL = new ArrayList<>();
    private List<RequestToMethodItem> putURL = new ArrayList<>();
    private List<RequestToMethodItem> deleteURL = new ArrayList<>();
    private static List<RequestToMethodItem> getURL = new ArrayList<>();
    private static List<RequestToMethodItem> postURL = new ArrayList<>();
    private static List<RequestToMethodItem> putURL = new ArrayList<>();
    private static List<RequestToMethodItem> deleteURL = new ArrayList<>();
    @Autowired
    private SpringUtil springUtill;
    private AntPathMatcher antPathMatcher = new AntPathMatcher();
    private static AntPathMatcher antPathMatcher = new AntPathMatcher();
    /**
     * 初始化路径
@ -112,7 +111,6 @@ public class HttpAdvice {
        }
        HttpEvent event = new HttpEvent();
        event.setSpanName(spanrName);
        event.setEventName(eventName);
        HttpServletRequest request = null;
        if (RequestContextHolder.getRequestAttributes() != null) {
            request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
@ -173,7 +171,7 @@ public class HttpAdvice {
    }
    private String matchURI(HttpServletRequest request) {
    public static String matchURI(HttpServletRequest request) {
        String requestURI = request.getRequestURI();
        String method = request.getMethod();
        List<RequestToMethodItem> urls = null;

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

@ -0,0 +1,93 @@
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;
/**
 * Created by chenweida on 2018/5/31 0031.
 */
@Component
public class ZuulPostFilter extends ZuulFilter {
    @Autowired
    private Tracer tracer;
    @Autowired
    private SimpleEventSender simpleEventSender;
    @Autowired
    private AdminClientProperties adminClientProperties;
    @Value("${spring.application.name}")
    private String spanrName;
    @Override
    public String filterType() {
        //filterType:返回过滤器的类型。有pre、route、post、error等几种取值
        return "post";
    }
    @Override
    public int filterOrder() {
        //回一个int值来指定过滤器的执行顺序,不同的过滤器允许返回相同的数字
        return 0;
    }
    @Override
    public boolean shouldFilter() {
        //返回一个boolean值来判断该过滤器是否要执行,true表示执行,false表示不执行。
        return adminClientProperties.getZuulPost();
    }
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        try {
            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();
                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_http_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);
        } catch (Exception e) {
        }
        HttpServletResponse response = ctx.getResponse();
        return response;
    }
}

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

@ -0,0 +1,93 @@
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;
/**
 * Created by chenweida on 2018/5/31 0031.
 */
@Component
public class ZuulPreFilter extends ZuulFilter {
    @Autowired
    private Tracer tracer;
    @Autowired
    private SimpleEventSender simpleEventSender;
    @Autowired
    private AdminClientProperties adminClientProperties;
    @Value("${spring.application.name}")
    private String spanrName;
    @Override
    public String filterType() {
        //filterType:返回过滤器的类型。有pre、route、post、error等几种取值
        return "pre";
    }
    @Override
    public int filterOrder() {
        //回一个int值来指定过滤器的执行顺序,不同的过滤器允许返回相同的数字
        return 0;
    }
    @Override
    public boolean shouldFilter() {
        //返回一个boolean值来判断该过滤器是否要执行,true表示执行,false表示不执行。
        return adminClientProperties.getZuulPre();
    }
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        try {
            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();
                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_http_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);
        } catch (Exception e) {
        }
        HttpServletResponse response = ctx.getResponse();
        return response;
    }
}

+ 48 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/config/HibernateAutoConfig.java

@ -0,0 +1,48 @@
package com.yihu.admin.client.config;
import com.yihu.admin.client.advice.HibernateFilter;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.jta.JtaTransactionManager;
import javax.sql.DataSource;
import java.util.Map;
/**
 * Created by chenweida on 2018/5/31 0031.
 */
@Configuration
//@ConditionalOnClass(
//        value = {
//                javax.sql.DataSource.class,
//                org.springframework.boot.autoconfigure.orm.jpa.JpaProperties.class,
//                org.springframework.transaction.jta.JtaTransactionManager.class,
//                org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers.class
//        }
//)
@ConditionalOnProperty(name = "yihu.admin.client.advice.hibernateSql", havingValue = "true")
public class HibernateAutoConfig extends HibernateJpaAutoConfiguration {
    public HibernateAutoConfig(
            DataSource dataSource,
            JpaProperties jpaProperties,
            ObjectProvider<JtaTransactionManager> jtaTransactionManager,
            ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
        super(dataSource, jpaProperties, jtaTransactionManager, transactionManagerCustomizers);
    }
    @Autowired
    private HibernateFilter hibernateFilter;
    @Override
    protected void customizeVendorProperties(Map<String, Object> vendorProperties) {
        vendorProperties.put("hibernate.ejb.interceptor", hibernateFilter);
        super.customizeVendorProperties(vendorProperties);
    }
}

+ 15 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/config/WebsocketConfig.java

@ -1,11 +1,23 @@
package com.yihu.admin.client.config;
import com.yihu.admin.client.advice.HibernateFilter;
import com.yihu.admin.client.properties.AdminClientProperties;
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.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import javax.sql.DataSource;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
 * Created by chenweida on 2018/5/22 0022.1
@ -20,9 +32,12 @@ import org.springframework.context.annotation.Configuration;
public class WebsocketConfig {
    @Autowired
    SocketClient socketClient;
    @Autowired
    private HibernateFilter hibernateFilter;
    @Bean
    public SimpleEventSender simpleEventSender() {
        return new SimpleEventSender(socketClient.getCurrentClient());
    }
}

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

@ -14,6 +14,12 @@ public class AdminClientProperties {
    private Integer port;//port
    @Value("${yihu.admin.client.advice.sql:false}")
    private Boolean sql;//port
    @Value("${yihu.admin.client.advice.hibernateSql:false}")
    private Boolean hibernateSql;//port
    @Value("${yihu.admin.client.advice.zuul.pre:false}")
    private Boolean zuulPre;//port
    @Value("${yihu.admin.client.advice.zuul.post:false}")
    private Boolean zuulPost;//port
    @Value("${yihu.admin.client.advice.http:true}")
    private Boolean http;//port
@ -48,4 +54,28 @@ public class AdminClientProperties {
    public void setHttp(Boolean http) {
        this.http = http;
    }
    public Boolean getZuulPre() {
        return zuulPre;
    }
    public void setZuulPre(Boolean zuulPre) {
        this.zuulPre = zuulPre;
    }
    public Boolean getZuulPost() {
        return zuulPost;
    }
    public void setZuulPost(Boolean zuulPost) {
        this.zuulPost = zuulPost;
    }
    public Boolean getHibernateSql() {
        return hibernateSql;
    }
    public void setHibernateSql(Boolean hibernateSql) {
        this.hibernateSql = hibernateSql;
    }
}

+ 1 - 0
admin/admin-client-starter/src/main/resources/META-INF/spring.factories

@ -1,3 +1,4 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.yihu.admin.client.config.WebsocketConfig,\
  com.yihu.admin.client.config.HibernateAutoConfig,\
  com.yihu.admin.client.config.ScheduledConfig

+ 43 - 32
admin/admin-server-starter/src/main/java/com/yihu/admin/server/config/AdminServerAutoConfig.java

@ -55,43 +55,54 @@ public class AdminServerAutoConfig {
    @PostConstruct
    public void createIndex() throws Exception {
        Client client = elastricSearchHelper.getElasticsearchUtil().getElasticFactory();
        try {
            Client client = elastricSearchHelper.getElasticsearchUtil().getElasticFactory();
            //判断index是否存在
            if (!client.prepareExists(adminServerProperties.getDefaultIndexName()).get().exists()) {
                CreateIndexRequestBuilder cib = client.admin()
                        .indices().prepareCreate(adminServerProperties.getDefaultIndexName());
                XContentBuilder mapping = XContentFactory.jsonBuilder()
                        .startObject()
                        .startObject("properties") //设置之定义字段
                        .startObject("uri")
                        .field("type", "string") //设置数据类型
                        .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                        .endObject()
                        .startObject("spanname")
                        .field("type", "string")
                        .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                        .endObject()
                        .startObject("ip")
                        .field("type", "string")
                        .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                        .endObject()
                        .startObject("eventname")
                        .field("type", "string")
                        .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                        .endObject()
                        .startObject("method")
                        .field("type", "string")
                        .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                        .endObject()
                        .endObject()
                        .endObject();
                cib.addMapping(adminServerProperties.getDefaultTypeName(), mapping);
                CreateIndexResponse indexResponse = cib.execute().actionGet();
                logger.info("自动创建索引");
            Boolean flag = client.prepareExists(adminServerProperties.getDefaultIndexName()).get().exists();
            if (!flag) {
                createIndex(client);
            }
        } catch (org.elasticsearch.index.IndexNotFoundException e) {
            createIndex(client);
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
    }
    private void createIndex(Client client) {
        try {
            CreateIndexRequestBuilder cib = client.admin()
                    .indices().prepareCreate(adminServerProperties.getDefaultIndexName());
            XContentBuilder mapping = XContentFactory.jsonBuilder()
                    .startObject()
                    .startObject("properties") //设置之定义字段
                    .startObject("uri")
                    .field("type", "string") //设置数据类型
                    .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                    .endObject()
                    .startObject("spanname")
                    .field("type", "string")
                    .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                    .endObject()
                    .startObject("ip")
                    .field("type", "string")
                    .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                    .endObject()
                    .startObject("eventname")
                    .field("type", "string")
                    .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                    .endObject()
                    .startObject("method")
                    .field("type", "string")
                    .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                    .endObject()
                    .endObject()
                    .endObject();
            cib.addMapping(adminServerProperties.getDefaultTypeName(), mapping);
            CreateIndexResponse indexResponse = cib.execute().actionGet();
            logger.info("自动创建索引");
        }catch (Exception e){
            logger.error(e.getMessage());
        }
    }
}

+ 13 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/manage/ServerHeart.java

@ -17,6 +17,7 @@ import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -48,6 +49,18 @@ public class ServerHeart implements Runnable {
                    MicroService microService = null;
                    if (microServices.containsKey(key)) {
                        microService = microServices.get(key);
                        List<InstanceInfo> instanceInfos = application.getInstancesAsIsFromEureka();
                        List<Server> servers=new ArrayList<>();
                        for (InstanceInfo instanceInfo : instanceInfos) {
                            Server server = new Server();
                            BeanUtils.copyProperties(instanceInfo, server);
                            server.setStatus(instanceInfo.getStatus().toString());
                            server.setIp(instanceInfo.getIPAddr());
                            server.setUuid(MD5.GetMD5Code(microService.getName() + "-" + instanceInfo.getInstanceId()));
                            logger.debug(server.toString());
                            servers.add(server);
                        }
                        microService.setServers(servers);
                    } else {
                        microService = new MicroService(application.getName());
                        List<InstanceInfo> instanceInfos = application.getInstancesAsIsFromEureka();

+ 4 - 4
common-data-es-starter/pom.xml

@ -14,10 +14,6 @@
    <version>1.1.2</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.nlpcn</groupId>
            <artifactId>elasticsearch-sql</artifactId>
@ -53,5 +49,9 @@
            <artifactId>druid</artifactId>
            <version>1.0.15</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
    </dependencies>
</project>

+ 12 - 2
common-data-es-starter/src/main/java/com/yihu/base/es/config/ElasticFactory.java

@ -14,10 +14,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.util.StringUtils;
import javax.annotation.PostConstruct;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
@ -50,6 +50,16 @@ public class ElasticFactory {
     * 初始化链接
     * 9200
     */
    @PostConstruct
    public void initAll() {
        try {
            init();
            initTranClient();
        } catch (UnknownHostException e) {
        }
    }
    public synchronized void init() {
        String[] hostArray = elasticSearchPorperties.getClusterNodesJest().split(",");
        // Construct a new Jest client according to configuration via factory
@ -91,7 +101,7 @@ public class ElasticFactory {
        if (transportClient == null) {
            String[] hosts = elasticSearchPorperties.getClusterNodes().split(",");
            Settings settings = Settings.settingsBuilder()
                     .put("client.transport.sniff", elasticSearchPorperties.getJestDiscoveryEnabled())//开启嗅探功能
                    .put("client.transport.sniff", elasticSearchPorperties.getJestDiscoveryEnabled())//开启嗅探功能
                    .put("cluster.name", StringUtils.isEmpty(elasticSearchPorperties.getClusterName()) ? "jkzl" : elasticSearchPorperties.getClusterName())//默认集群名字是jkzl
                    .build();

+ 0 - 6
common-data-es-starter/src/main/resources/template.yml

@ -4,12 +4,6 @@ spring:
      cluster-name: jkzl #es集群的名字
      cluster-nodes: 172.19.103.68:9300  #多个逗号分割
      cluster-nodes-jest: http://172.19.103.68:9200  #多个逗号分割
      repositories:
        enabled: true
      properties:
        client:
          transport:
            sniff: true  #开启嗅探集群  用nginx代理一层过后会出现ip解析失败问题
      jest:
        discovery-enabled: true #开启嗅探
        conn-timeout: 60 # 连接时间单位是秒

+ 6 - 2
demo/demo-socket-client/src/main/resources/application.yml

@ -15,8 +15,12 @@ yihu:
  admin:
    client:
      advice:
        sql: true
        http: true
        sql: true #默认false
        http: true #默认true
        hibernateSql: true #默认false
        zuul:
          pre: true #默认false
          post: true #默认false
      server:
        ip: 192.168.131.102
        port: 8082