点击上方蓝色“方志朋”,选择“设为星标”

回复“666”获取独家整理的学习资料!

来源:https://www.cnblogs.com/jurendage/p/9070442.html

Java开源生鲜电商平台-监控模块的设计与架构,我们谈到监控,一般设计到两个方面的内容:

  1. 服务器本身的监控。(比如:linux服务器的CPU,内存,磁盘IO等监控)

  2. 业务系统的监控. (比如:业务系统性能的监控,SQL语句的监控,请求超时的监控,用户输入的监控,整个请求过程时间的监控,优化等等)

1. 服务器本身的监控

说明:由于Java开源生鲜电商平台采用的是阿里云的linux CentOS服务器,由于阿里云本身是有监控预警的,但是我们不可能时刻去看,最好有集成自己的系统监控,

最终在各种系统对比的过程中,选择了netdata这个工具,当然有一些软件比如:zabbix,negios等等都是可以的,但是我们服务器压力不算大,最终采用了更加轻量级的解决方案。

相关的安装与使用,大家自行百度处理,我这边就不列举出来了。

以下是相关的实际运营截图:

 

2. 业务监控

说明:任何一个业务系统都需要采用业务监控,抛异常,有error日志,短信预警,推送等等

  1. Java内存

  2. JavaCPU使用情况

  3. 用户Session数量

  4. JDBC连接数

  5. http请求、sql请求、jsp页面与业务接口方法(EJB3、Spring、 Guice)的执行数量,平均执行时间,错误百分比等

最终,业务代码中采用了Spring AOP进行日志拦截,把请求方法超过了1500秒的方法进行了error日志的输出:

业务代码如下:

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的执行时间*/
@Aspect
@Component
public class LogAspect {private static final Logger logger=LoggerFactory.getLogger(LogAspect.class);/*** 切入点:表示在哪个类的哪个方法进行切入。配置有切入点表达式*/@Pointcut("execution(* com.netcai.admin.controller.*.*.*(..))")public void pointcutExpression() {logger.debug("配置切入点");}/*** 1 前置通知* @param joinPoint*/@Before("pointcutExpression()")public void beforeMethod(JoinPoint joinPoint) {logger.debug("前置通知执行了");}/*** 2 后置通知* 在方法执行之后执行的代码. 无论该方法是否出现异常*/@After("pointcutExpression()") public void afterMethod(JoinPoint joinPoint) {logger.debug("后置通知执行了,有异常也会执行");}/*** 3 返回通知* 在方法法正常结束受执行的代码* 返回通知是可以访问到方法的返回值的!* @param joinPoint* @param returnValue*/@AfterReturning(value = "pointcutExpression()", returning = "returnValue")public void afterRunningMethod(JoinPoint joinPoint, Object returnValue) {logger.debug("返回通知执行,执行结果:" + returnValue);}/*** 4 异常通知* 在目标方法出现异常时会执行的代码.* 可以访问到异常对象; 且可以指定在出现特定异常时在执行通知代码* @param joinPoint* @param e*/@AfterThrowing(value = "pointcutExpression()", throwing = "e")public void afterThrowingMethod(JoinPoint joinPoint, Exception e){logger.debug("异常通知, 出现异常 " + e);}/*** 环绕通知需要携带 ProceedingJoinPoint 类型的参数. * 环绕通知类似于动态代理的全过程: ProceedingJoinPoint 类型的参数可以决定是否执行目标方法.* 且环绕通知必须有返回值, 返回值即为目标方法的返回值*/@Around("pointcutExpression()")public Object aroundMethod(ProceedingJoinPoint pjd){StopWatch clock = new StopWatch();//返回的结果Object result = null;//方法名称String className=pjd.getTarget().getClass().getName();String methodName = pjd.getSignature().getName();try {// 计时开始clock.start(); //前置通知//执行目标方法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;}
}

补充说明:这个方法记录那个类,那个方法执行的时间多少,超过设置的阀值,那么就打印error日志,需要我们每天进行查看与针对性的优化。

3. 对于整个业务线的监控,我们采用了另外一种开源的监控:javamelody

相关的配置与处理如下:

POM文件中设置:

<!-- 系统监控 -->
<dependency><groupId>net.bull.javamelody</groupId><artifactId>javamelody-core</artifactId><version>1.68.1</version>
</dependency><dependency><groupId>org.jrobin</groupId><artifactId>jrobin</artifactId><version>1.5.9</version>
</dependency>

web.xml文件中处理

<context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:config/applicationContext.xmlclasspath*:net/bull/javamelody/monitoring-spring.xmlclasspath*:net/bull/javamelody/monitoring-spring-datasource.xmlclasspath*:net/bull/javamelody/monitoring-spring-aspectj.xml</param-value>
</context-param>
<!--javamelody -->
<filter><filter-name>monitoring</filter-name><filter-class>net.bull.javamelody.MonitoringFilter</filter-class><async-supported>true</async-supported><init-param><param-name>logEnabled</param-name><param-value>true</param-value></init-param>
</filter><filter-mapping><filter-name>monitoring</filter-name><url-pattern>/*</url-pattern>
</filter-mapping><listener><listener-class>net.bull.javamelody.SessionListener</listener-class>
</listener>

最终运营效果如下:

总结:最终可以形成一套基于自己的监控系统,当然还有类似的更加强大的监控系统,比如:连接池方面druid,系统方面zabbix,业务方面可以用cat等等,甚至开发采用自己的监控系统也是可以的。也是支持二次开发的。

热门内容:
  • 通用的底层埋点都是怎么做的?

  • Java身份证号码识别系统

  • 看看人家那后端API接口写得,那叫一个优雅!

  • 给IDEA换个酷炫的主题,这个有点哇塞啊!

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

Java生鲜电商平台-监控模块的设计与架构相关推荐

  1. java大型wms架构设计_Java生鲜电商平台-库存管理设计与架构

    Java生鲜电商平台-库存管理设计与架构 WMS的功能: 1.业务批次管理 该功能提供完善的物料批次信息.批次管理设置.批号编码规则设置.日常业务处理.报表查询,以及库存管理等综合批次管理功能,使企业 ...

  2. Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战

    Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战 Java生鲜电商平台-  什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定 ...

  3. Java生鲜电商平台-订单配送模块的架构与设计

    Java生鲜电商平台-订单配送模块的架构与设计 生鲜电商系统最终的目的还是用户下单支付购买, 所以订单管理系统是电商系统中最为复杂的系统,其作为中枢决定着整个商城的运转, 本文将对于生鲜类电商平台的订 ...

  4. Java实现对货物抽检_Java开源生鲜电商平台-库存管理设计与架构(源码可下载)...

    Java开源生鲜电商平台-库存管理设计与架构(源码可下载) 说明:Java开源生鲜电商平台-库存管理设计与架构有以下几个功能 WMS的功能: 1.业务批次管理 该功能提供完善的物料批次信息.批次管理设 ...

  5. Java生鲜电商平台-深入订单拆单架构与实战

    Java生鲜电商平台-深入订单拆单架构与实战 Java生鲜电商中在做拆单的需求,细思极恐,思考越深入,就会发现里面涉及的东西越来越多,要想做好订单拆单的功能,还是相当有难度, 因此总结了一下拆单功能细 ...

  6. Java 生鲜电商平台 - API 接口设计之 token、timestamp、sign 具体架构与实现

    作者:巨人大哥 , 链接 : www.cnblogs.com/jurendage/p/12653865.html 一:token 简介 Token:访问令牌access token, 用于接口中, 用 ...

  7. 电商平台-商品价格的设计与架构

    说明:Java开源生鲜电商平台-商品价格的设计与架构,主要是对商品的价格进行研究与系统架构. 一.常见的电商价格 市场价(List Price):这个价格仅是用于显示,用于衬托网站销售价格的优惠程度: ...

  8. 电商平台-库存管理设计与架构

    说明:Java开源生鲜电商平台-库存管理设计与架构有以下几个功能 WMS的功能: 1.业务批次管理 该功能提供完善的物料批次信息.批次管理设置.批号编码规则设置.日常业务处理.报表查询,以及库存管理等 ...

  9. Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析

    Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...

最新文章

  1. 性能媲美BERT,但参数量仅为1/300,这是谷歌最新的NLP模型
  2. 人工智能数学基础----导数
  3. 基于用户投票的排名算法(四):牛顿冷却定律
  4. [转] log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析
  5. 泰坦尼克号 数据分析_第1部分:泰坦尼克号-数据分析基础
  6. (Java)Integer类的其他常用方法
  7. Nmap Cheat Sheet Part 1
  8. 告诉你三个实用的换性别特效软件
  9. 转自子龙山人 Objective-c的@property 详解
  10. 关于瑞昱8763bfr的学习总结(1)
  11. 家用无线漫游组网设置-亲测可用
  12. 2022基金定投数字货币理财程序源码
  13. 打开office word 2003 时出现了“出现问题需要关闭,是否发送错误报告”
  14. 智慧运维平台之全息监控
  15. strut2框架搭建
  16. 程序员如何增加收入?
  17. 券商也“网红”,证券行业IT服务运维发展按下“快进键”
  18. 游戏团队,各职位人员离职所带来的影响和不同
  19. 空间数据挖掘中的Skyline查询
  20. 如何查看本机Mac地址

热门文章

  1. 2018-4-5 丘成桐---现代几何学与计算机科学---自我总结
  2. 2018-3-10论文(网络评论中非结构化信息表示与研究)笔记-----网评评定等级,网评分类,网评信度函数,Dempster法则
  3. 用Python深入理解跳跃表原理及实现
  4. NOIP2012-摆花
  5. 前端基础之JQuery
  6. 数据库分库分表(sharding)系列
  7. 关系数据理论中的范式
  8. Winform窗体应用程序的自动更新功能
  9. 技术图文:双指针在链表问题中的应用
  10. LeetCode实战:2的幂