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