开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop框架搭建)第四阶段:数据预处理﹣系统监控 web 界面﹣各链路流量转发数据来源】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/672/detail/11681
数据预处理﹣系统监控 web 界面﹣各链路流量转发数据来源
内容介绍:
一、各链路流量转发数据来源代码详解
二、前端展示
一、各链路流量转发数据来源代码详解
接下来看各链路流量转发情况,回到 Monitor 里面看到第三个代码loadSystqmFunction
是爬虫加载情况,现在没有数据暂时先不看,然后接着看第四个,第四个就是各链路流量转发。同样也是每隔60秒刷新一次。
//初始化
init : function ({
systemMonitorIndex . loadSysteuF unctionInfo ();// systeaMonitorIndex .loadFlows();
systemMonitorIndex . LoadDiscernCondition ();
systemMonitorIndex . loadFlowTransmit ();
//refreshSystenlonitorFlag在comnonIndex . js 定义
1f( null mrefreshSystenMonitorFlag ){
setInterval( systemNonitorIndex .loadFloWs ,timeout:60000);
//定时60秒刷新一次
setInterval ( systemMonitorIndex .1oadFlowTransmit,
tineout :6000);//定时60秒刷新一次
refreshsystecMonitorFlag -" HAVE _ REFRESH ;
}
}
同样的这个程序也是一个 ext,往下我们看到 option 也是一个 ext,一直往下到结束,下面是一个 ajax 的请求:
请求调用的是 systemMonitoring 里面的 getRealTimeLinkTraffic 结构,然后来找:
找到后发现是在获取实时 各链路流量转发情况接下来看它是如何实现的,首先上面定义了一个 value 的 list 和一个key 的 list,
List < Object > valuelList = new ArrayList <~>);
List < String > keyList = new ArrayList <~>();
拆分一下一个是存储 value 的集合一个是 key 的集合,后面接了 maps 和 jsonVO,jsonVO 的结果如下:
public class Jsonvo implements comparable < JsonVo >, java . io . Serializable {
private string key ;// redis
系统内的 key
private String costTime ;//时间差任务运行时间( end - start )
private Map < String ,0bject> serversCountMap ;//链路统计中的结果 private String applicationId ;// appID
private String countPerMillis ;// speed
private string applicationUniqueName ;// appname private String endTime ;//任务运行结尾时间
private String sourceCount ;//一批次数据数据总量
返回来后接着往下看是 getTrafficInfoByMinute 方法,给了一个-20和一个前缀,进入方法里面:
public static List < JsonVo > trafficInfo ( String strFlage ){
JedisCluster jedisCluster = JedisConnectionUtil . getJedisCluster ();
Set < String > keySet = JedisConnectionUtil . keys ( jedisCluster , pattern : strFlage +"*");
List < JsonVo > jsonVOs = new ArrayList <~>();
try {
for ( String str : keySet ){
JsonVo jsonVO = new JsonVo ();
String value = jedisCluster . get ( str
jsonVO = JsonResolveUtil . resolveJson ( value );
if (nul1!= jsonVo ){
jsonVo . setKey ( str );
jsonVOs . add ( jsonvO );
}
}
}
catch ( Exception e ){
//ТOD0: handLe exception Logger . info ( e . getMessage ());
}
return jsonVOs ;
时间是-20,key是一个前缀。
拿取的是以 strFlage 作为前缀,有*,有 jedisCluster 集群,拿取所有的前缀,拿到所有的 key,然后去遍历每个key,获取所有的 value,所有的 value 转化成 jsonVO,然后设置 jsonVO 的 keys 然后添加到 jsonVOs 里面,这里面拿到的是所有以 DP 为前缀的 key 对应的数据转化成的 jsonVO,没有时间范围。
Set < String > keyset = JedisConnectionUtil . keys ( jedisCluster , patern : strFlage +"*");
里面就是所有的数据
接下来要做的就是 timeE 是-20,也就是20分钟前到当前,i和j要大于零,也就是说在这20分钟内如果有数据的话就把这20分钟内的数据拿过来,塞到我的 list 里面,塞过来以后返回,也就是说拿到了20分钟内的数据,再退回去:jsonVOs 就是20分钟内的数据,有了20分钟数据后,排序,排序后后面的内容就不一样了,先求了一下排完序后 list的大小,
假设 list 有五个数据,角标是零一二三四。size是5,如果5>0,命令一个 maps,jsonVO.get
这个 list get 的是4(以 size=5为例4=5-1),角标是零一二三四,四是最后一个,所以 get 的是最后一个,我们这个里面是获取出20分钟内的最后一个数据也就等于 size-1。
//取 List 集合最一条数据(即最新的一条数据)
// size =5个角标(01234)
int size = jsonVOs . size (); if ( size >0){
mapS = new HashMap ;
// jsonvo 20分钟内的最后一条数据
Jsonvo jsonVo = jsonVos . get (jsonV0s. size ()-1);
Map < String , object > serversCountMap = jsonVo . getServersCountMap ();
Set < String > keySet = serversCountMap . keySet ();
for ( String key : keySet ){
object value = serversCountMap · get ( key );
keyList . add ( key );
valuelList . add ( value );
}
mapS . put (" key ", keyList );
mapS . put (" value ", valuelList );
return mapS ;
最后一个拿到之后就 get seversCountMap,seversCountMap 数据里面有一个我们做的链路统计功能中的结果。在写的过程中 seversCountMap 是我们链路统计的结果:
标蓝的结果就是统计出来的,写到原来的程序里面,转化成 jsonVO,获取出来,这个 seversCountMap 就是它统计出来的 IP 和他对应的值。serversCountMap . keySet 就可以拿到所有的 key,因为我只有一个服务器所以现实的结果里面只有一个值,如果有多台服务器就是多个值。多个值 keySet 就会有多个,然后遍历每一个,serversCountMap.get,key是我的 IP192.168.100.160,serversCountMap 中 map 就是 value,key value get key,就是把9拿出来,也就是说这行 object value = serversCountMap . get ( key )
; 就是为了把9拿出来。把9拿出来后添加到value的list,就是存储 value 的集合,这个集合添加的就是我从数据 redys 里面读过来的每一个20分钟数据当中 serversCount 里面 IP 对应的 value。
再往后添加 key,key 就是我们数据库读过来解析的IP,把IP截取出来添加到 keylist 里面,key 里面存储的就是链路统计中的 IP,value 存储的就是 IP 对应的值,存进来以后初始化的 maps 存储了一个key,然后 value 是 key 的list,value 存储的是 valu 的 list,也就是说我把我计算出来的 key 的 list 和 value 的 list 这两个 list 塞到 map 里面,然后把 map 返回。返回 maps 的这个方法就结束了。
// jsonvo 20分钟内的最后一条数据
Jsonvo jsonVo = jsonVOs . get ( jsonVOs . size ()-1);
Map < String , object > serversCountMap = jsonVo . getServersCountMap ();
Set < String > keySet = serversCountMap . keySet ();
for ( String key : keySet ){
object value = serversCountMap · get ( key );
keyList . add ( key );
valuelList . add ( value );
mapS . put (" key ", keyList );
mapS . put (" value ", valuelList );
return mapS ;
返回的话是返回到url,也就返回到 data 里面,data.value 中的 value 存储的就是 valuelist
Series 里面给的是值,key 是 IP,IP 的 list,IP 作为x轴,然后写到 myChart 里面,就是在展示的画面中横坐标应该是一个 IP,纵坐标是一个值 value。var url = ctx +'/ systemMonitoringVgetRealTimeLinkTraffic '; kingpoint . postData ( url , data : null , handle : function ( data ){ /*
*mapS . put (" key ", keyList )
mapS . put (" value ", valuel 话 t );
*/
if ( data !=nul1){
option . series []. setData ( data . value );
option . xAxis []. setData ( data . key );
mychart . setoption ( option , true );
}
});
二、前端展示
如上图横坐标是 IP,纵坐标是流量转换情况12,以上全部就是链路流量转发情况从后端到前端的大致情况。数据监控的三个模块就全都完成了。