<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          某生鮮電商平臺的監(jiān)控模塊設(shè)計

          共 4750字,需瀏覽 10分鐘

           ·

          2020-10-28 10:04

          點擊上方藍(lán)色“程序猿DD”,選擇“設(shè)為星標(biāo)”

          回復(fù)“資源”獲取獨家整理的學(xué)習(xí)資料!

          作者 | 巨人大哥

          來源 |?https://www.cnblogs.com/jurendage/p/9070442.html

          我們談到監(jiān)控,一般設(shè)計到兩個方面的內(nèi)容:

          1. 服務(wù)器本身的監(jiān)控。(比如:linux服務(wù)器的CPU,內(nèi)存,磁盤IO等監(jiān)控)

          2. 業(yè)務(wù)系統(tǒng)的監(jiān)控. ?(比如:業(yè)務(wù)系統(tǒng)性能的監(jiān)控,SQL語句的監(jiān)控,請求超時 的監(jiān)控,用戶輸入的監(jiān)控,整個請求過程時間的監(jiān)控,優(yōu)化等等)

          ?

          # 服務(wù)器本身的監(jiān)控


          說明:由于Java開源生鮮電商平臺采用的是阿里云的linux CentOS服務(wù)器,由于阿里云本身是有監(jiān)控預(yù)警的,但是我們不可能時刻去看,最好有集成自己的系統(tǒng)監(jiān)控,最終在各種系統(tǒng)對比的過程中,選擇了netdata這個工具,當(dāng)然有一些軟件比如:zabbix,negios等等都是可以的,但是我們服務(wù)器壓力不算大,最終采用了更加輕量級的解決方案。


          相關(guān)的安裝與使用,大家自行百度處理,我這邊就不列舉出來了。


          以下是相關(guān)的實際運營截圖:

          ?


          ?

          ?

          # 業(yè)務(wù)監(jiān)控


          說明:任何一個業(yè)務(wù)系統(tǒng)都需要采用業(yè)務(wù)監(jiān)控,拋異常,有error日志,短信預(yù)警,推送等等


          • Java內(nèi)存

          • JavaCPU使用情況

          • ?用戶Session數(shù)量

          • JDBC連接數(shù)

          • http請求、sql請求、jsp頁面與業(yè)務(wù)接口方法(EJB3、Spring、 Guice)的執(zhí)行數(shù)量,平均執(zhí)行時間,錯誤百分比等

          ?

          最終,業(yè)務(wù)代碼中采用了Spring AOP進(jìn)行日志攔截,把請求方法超過了1500秒的方法進(jìn)行了error日志的輸出:

          ?

          業(yè)務(wù)代碼如下:

          import org.apache.commons.lang.time.StopWatch;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;

          import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;/** * 聲明一個切面,記錄每個Action的執(zhí)行時間 */@Aspect@Componentpublic class LogAspect {
          private static final Logger logger=LoggerFactory.getLogger(LogAspect.class);
          /** * 切入點:表示在哪個類的哪個方法進(jìn)行切入。配置有切入點表達(dá)式 */ @Pointcut("execution(* com.netcai.admin.controller.*.*.*(..))") public void pointcutExpression() { logger.debug("配置切入點"); }
          /** * 1 前置通知 * @param joinPoint */ @Before("pointcutExpression()") public void beforeMethod(JoinPoint joinPoint) { logger.debug("前置通知執(zhí)行了"); }
          /** * 2 后置通知 * 在方法執(zhí)行之后執(zhí)行的代碼. 無論該方法是否出現(xiàn)異常 */ @After("pointcutExpression()") public void afterMethod(JoinPoint joinPoint) { logger.debug("后置通知執(zhí)行了,有異常也會執(zhí)行"); }
          /** * 3 返回通知 * 在方法法正常結(jié)束受執(zhí)行的代碼 * 返回通知是可以訪問到方法的返回值的! * @param joinPoint * @param returnValue */ @AfterReturning(value = "pointcutExpression()", returning = "returnValue") public void afterRunningMethod(JoinPoint joinPoint, Object returnValue) { logger.debug("返回通知執(zhí)行,執(zhí)行結(jié)果:" + returnValue); } /** * 4 異常通知 * 在目標(biāo)方法出現(xiàn)異常時會執(zhí)行的代碼. * 可以訪問到異常對象; 且可以指定在出現(xiàn)特定異常時在執(zhí)行通知代碼 * @param joinPoint * @param e */ @AfterThrowing(value = "pointcutExpression()", throwing = "e") public void afterThrowingMethod(JoinPoint joinPoint, Exception e) { logger.debug("異常通知, 出現(xiàn)異常 " + e); }
          /** * 環(huán)繞通知需要攜帶 ProceedingJoinPoint 類型的參數(shù). * 環(huán)繞通知類似于動態(tài)代理的全過程: ProceedingJoinPoint 類型的參數(shù)可以決定是否執(zhí)行目標(biāo)方法. * 且環(huán)繞通知必須有返回值, 返回值即為目標(biāo)方法的返回值 */ @Around("pointcutExpression()") public Object aroundMethod(ProceedingJoinPoint pjd) { StopWatch clock = new StopWatch(); //返回的結(jié)果 Object result = null; //方法名稱 String className=pjd.getTarget().getClass().getName();
          String methodName = pjd.getSignature().getName();
          try { // 計時開始 clock.start(); //前置通知 //執(zhí)行目標(biāo)方法 result = pjd.proceed(); //返回通知 clock.stop(); } catch (Throwable e) { //異常通知 e.printStackTrace(); } //后置通知 if(!methodName.equalsIgnoreCase("initBinder")) { long constTime=clock.getTime();
          logger.info("["+className+"]"+"-" +"["+methodName+"]"+" 花費時間:" +constTime+"ms");
          if(constTime>500) { logger.error("["+className+"]"+"-" +"["+methodName+"]"+" 花費時間過長,請檢查: " +constTime+"ms"); } } return result; }}


          補充說明:這個方法記錄那個類,那個方法執(zhí)行的時間多少,超過設(shè)置的閥值,那么就打印error日志,需要我們每天進(jìn)行查看與針對性的優(yōu)化。

          ?

          # javamelody


          對于整個業(yè)務(wù)線的監(jiān)控,我們采用了另外一種開源的監(jiān)控:javamelody。


          相關(guān)的配置與處理如下:


          POM文件中設(shè)置:


            net.bull.javamelody  javamelody-core  1.68.1

          org.jrobin jrobin 1.5.9

          ?

          web.xml文件中處理


            contextConfigLocation      classpath*:config/applicationContext.xml    classpath*:net/bull/javamelody/monitoring-spring.xml    classpath*:net/bull/javamelody/monitoring-spring-datasource.xml    classpath*:net/bull/javamelody/monitoring-spring-aspectj.xml  


            monitoring  net.bull.javamelody.MonitoringFilter  true       logEnabled     true  
          monitoring /*
          net.bull.javamelody.SessionListener

          ?

          最終運營效果如下:


          ?

          ?


          ?

          # 總結(jié)


          最終可以形成一套基于自己的監(jiān)控系統(tǒng),當(dāng)然還有類似的更加強大的監(jiān)控系統(tǒng),比如:連接池方面druid,系統(tǒng)方面zabbix,業(yè)務(wù)方面可以用cat等等,甚至開發(fā)采用自己的監(jiān)控系統(tǒng)也是可以的。也是支持二次開發(fā)的。


          往期推薦

          色情版“微信”背后的秘密

          贈書:響應(yīng)式編程到底是什么?

          免費版的 IDEA 為啥不能使用 Tomcat ?

          一款 Java 開源的 Spring Boot 即時通訊 IM 聊天系統(tǒng)

          Docker 入門終極指南:邊學(xué)邊用

          成為最差開發(fā)者的10條建議


          掃一掃,關(guān)注我

          一起學(xué)習(xí),一起進(jìn)步

          每周贈書,福利不斷


          深度內(nèi)容

          推薦加入


          最近熱門內(nèi)容回顧? ?#技術(shù)人系列

          瀏覽 43
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩传媒中文字幕一区 | 韩国免费猫片 | 成人天美麻豆久久久久久 | 免费一级婬片AA片观看 | 国产视频久久久 |