1、评价:服务器的性能还算不错,但clinet端代码规范来看,不敢恭维,感受是大佬带着校招实习生作的,用户体验有点差html
简单的列举一下:java
首先,提供的client端jar包中的代码,代码风格层次不齐,方法名有大写的状况。还有提供的getter和setter方法,但属性定义成为public的状况服务器
其次,关于官方文档,关于Java SDK的代码示例,太过于敷衍,问题仍是比较大的,代码也只是“能用”这一个优势性能
最后,官方文档错误百出,有些注释与功能彻底不一致,甚至两个做用相反的注释都弄错了,例如:from_unixtime与to_unixtime优化
2、简介unix
刚接触的时候我也是一脸懵逼,因此这里我简单的介绍一下,能够方便理解,在服务器中存放的数据类型都是QueriedLog类型,有一些固定的字段,是官方定义的,通常能够不用管;还有就是须要的字段,是以key-value的方式存储,因此当你拿出来的时候(拿取方法在“使用”中),拿出后要根据本身的须要,进行数据转换。Log Service是一个生产者/消费者模式的,有点像Kafka日志
3、字段理解代码规范
一、endpoint(服务入口):是指数据是经过哪一个服务入口,这个根据本身的状况从官网找,是XXXX.com的那些code
网址:https://help.aliyun.com/document_detail/29008.html?spm=a2c4g.11186623.6.917.4aeb20casTRvebhtm
二、accessKeyId(访问密钥Id):这个是到阿里注册才能拿到的
三、accessKeySecret(访问密钥):同上
四、project(项目):相似MySQL的库的概念
五、store(存储):相似MySQL的表的概念
六、topic(主题):相似Kafka的主题概念,当生产者在发送数据的时候指定了topic,消费者在消费时也要指定topic才能消费
4、使用,我对官网的代码作了修改,由于个别地方确实是问题太多
// 这里经过传值的方式,将client从上一层建立出来,这样能够不会频繁建立,request是我本身定义的 Client client = request.getClient(); // 项目名称 String project = request.getProject(); // 项目的库 String logStore = request.getLogStore(); // 这里是我自定义的字段,实际上是存放query的代码 String query = request.getAliSql(); int startTime = request.getStartTime(); int endTime = request.getEndTime(); String topic = request.getTopic(); GetHistogramsResponse res3 = null; histogramsRun = true; // 查询日志分布状况 while (histogramsRun) { GetHistogramsRequest req3 = new GetHistogramsRequest(project, logStore, topic, query, startTime, endTime); try { res3 = client.GetHistograms(req3); } catch (LogException e) { LOG.error(e.getMessage(), e); break; } if (res3 != null && res3.IsCompleted()) { //这里自己使用break是能够的,我这里作了代码保护,经过histogramsRun的boolean值来判断while是否运行 histogramsRun = false; break; } } // 获取相关记录的记录数 long totalLogLines = res3.GetTotalCount(); // 查询日志数据 List<QueriedLog> queriedLogList = new LinkedList<>(); // 上面的操做是不会查询出想要的数据的,下方的操做才是查询数据的 // 目的是当需求只是须要查询记录数,而且上面操做的记录与下方查出的记录数相同时,能够避免过多的操做,经过selected进行控制 if (request.isSelected()) { int logOffset = 0; logRun =true; while (logRun) { GetLogsResponse res4 = null; GetLogsRequest req4 = null; // 这里须要格外注意,当有query条件时,是不能经过offset的值进行分片查询的 if (!"".equalsIgnoreCase(query) && query != null) { // 经过条件进行查询,这里能够待优化,经过limit作分片查询 query += (" limit " + totalLogLines); req4 = new GetLogsRequest(project, logStore, startTime, endTime, topic, query); logRun = false; } else { // 经过offset进行分片查询,但当query有条件的时候,不能使用offset进行分片 req4 = new GetLogsRequest(project, logStore, startTime, endTime, topic, query, logOffset, logLine, false); } try { res4 = client.GetLogs(req4); } catch (LogException e) { LOG.error(e.getMessage(), e); } logOffset += logLine; // 当查询不出值的时候要终止查询 if (res4 == null || (res4 != null && res4.GetLogs().isEmpty())) { logRun = false; } // 将查询出来的值进行存储 if (res4 != null) { queriedLogList.addAll(res4.GetLogs()); } } }