某生鲜电商平台的监控模块设计
点击上方蓝色“程序猿DD”,选择“设为星标”
回复“资源”获取独家整理的学习资料!
作者 | 巨人大哥
来源 | https://www.cnblogs.com/jurendage/p/9070442.html
我们谈到监控,一般设计到两个方面的内容:
1. 服务器本身的监控。(比如:linux服务器的CPU,内存,磁盘IO等监控)
2. 业务系统的监控. (比如:业务系统性能的监控,SQL语句的监控,请求超时 的监控,用户输入的监控,整个请求过程时间的监控,优化等等)
# 服务器本身的监控
说明:由于Java开源生鲜电商平台采用的是阿里云的linux CentOS服务器,由于阿里云本身是有监控预警的,但是我们不可能时刻去看,最好有集成自己的系统监控,最终在各种系统对比的过程中,选择了netdata这个工具,当然有一些软件比如:zabbix,negios等等都是可以的,但是我们服务器压力不算大,最终采用了更加轻量级的解决方案。
相关的安装与使用,大家自行百度处理,我这边就不列举出来了。
以下是相关的实际运营截图:
# 业务监控
说明:任何一个业务系统都需要采用业务监控,抛异常,有error日志,短信预警,推送等等
Java内存
JavaCPU使用情况
用户Session数量
JDBC连接数
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日志,需要我们每天进行查看与针对性的优化。
# javamelody
对于整个业务线的监控,我们采用了另外一种开源的监控: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>
<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等等,甚至开发采用自己的监控系统也是可以的。也是支持二次开发的。
往期推荐
色情版“微信”背后的秘密
赠书:响应式编程到底是什么?
免费版的 IDEA 为啥不能使用 Tomcat ?
一款 Java 开源的 Spring Boot 即时通讯 IM 聊天系统
Docker 入门终极指南:边学边用
成为最差开发者的10条建议
扫一扫,关注我
一起学习,一起进步
每周赠书,福利不断
﹀
﹀
﹀
深度内容
推荐加入
最近热门内容回顾 #技术人系列
某生鲜电商平台的监控模块设计相关推荐
- java大型wms架构设计_Java生鲜电商平台-库存管理设计与架构
Java生鲜电商平台-库存管理设计与架构 WMS的功能: 1.业务批次管理 该功能提供完善的物料批次信息.批次管理设置.批号编码规则设置.日常业务处理.报表查询,以及库存管理等综合批次管理功能,使企业 ...
- Java实现对货物抽检_Java开源生鲜电商平台-库存管理设计与架构(源码可下载)...
Java开源生鲜电商平台-库存管理设计与架构(源码可下载) 说明:Java开源生鲜电商平台-库存管理设计与架构有以下几个功能 WMS的功能: 1.业务批次管理 该功能提供完善的物料批次信息.批次管理设 ...
- Java 生鲜电商平台 - API 接口设计之 token、timestamp、sign 具体架构与实现
作者:巨人大哥 , 链接 : www.cnblogs.com/jurendage/p/12653865.html 一:token 简介 Token:访问令牌access token, 用于接口中, 用 ...
- Java开源生鲜电商平台-Java分布式以及负载均衡架构与设计详解(源码可下载)
Java开源生鲜电商平台-Java分布式以及负载均衡架构与设计详解(源码可下载) 说明:主要是针对一些中大型的项目需要进行分布式以及负载均衡的架构提一些思路与建议. 面对大量用户访问.高并发请求,海量 ...
- Java生鲜电商平台-App系统架构开发与设计
Java生鲜电商平台-App系统架构开发与设计 说明:阅读此文,你可以学习到以下的技术分享 1.Java生鲜电商平台-App架构设计经验谈:接口的设计 2.Java生鲜电商平台-App架构设计经验谈: ...
- Java开源生鲜电商平台-深刻理解电商的库存架构与解决方案(源码可下载)
https://www.cnblogs.com/jurendage/p/9227283.html 说明:一般电商的库存都是跟SKU相关联的,那么怎么样才能进行SKU的库存管理呢?有以下几种方式与方法: ...
- Java生鲜电商平台-微服务生鲜电商用户中心的系统设计(小程序/APP)
Java生鲜电商平台-微服务生鲜电商用户中心的系统设计(小程序/APP) 说明:在微服务生鲜电商用户中心的系统设计中,我一直强调一个观点,就是你这个系统使用用户到底是TO B的还是TO C的呢?这个是 ...
- 电商平台-商品价格的设计与架构
说明:Java开源生鲜电商平台-商品价格的设计与架构,主要是对商品的价格进行研究与系统架构. 一.常见的电商价格 市场价(List Price):这个价格仅是用于显示,用于衬托网站销售价格的优惠程度: ...
- 拼团状态的时效性 java_Java生鲜电商平台-小程序或者APP拼团功能设计与架构实战...
Java生鲜电商平台拼团设计 拼团的类型 拼团可以分为以下三个类型: 新人团:主要限定新用户参加,老用户可以开团,但只有新用户可以参团,主要用来拉新引流,选取实用的商品以低价开团,拉新效果非常明显. ...
最新文章
- 【C++】34. gflags中的 --flagfile= 用法
- matlab逆变换法产生随机数_matlab 产生随机数的方法
- springmvc和servlet在上传和下载文件(保持文件夹和存储数据库Blob两种方式)
- linux挂载磁盘出问题,centos7 - 出现挂载磁盘,挂载出现问题
- css里的符号含义【串联选择器】和【后代选择器】
- SpringBoot连接Redis服务出现DENIED Redis is running in protected mode because protected mode is enabled
- JavaScript之Ajax-1 Ajax(Ajax原理、Ajax对象属性和方法)
- 公安部4号令中关于电子邮服务器
- Linux Server - NIS
- 萤石云开放平台java_萤石云控制代码
- 贵州省计算机职称考试时间2015年,关于2015年8月份贵州贵阳职称计算机考试安排通知...
- 更新应用程序安卓apk时出现解析程序包时出现问题
- photoshop快捷键大全
- pytest常用参数
- android实现异网双卡双待识别运营商网络
- 自建CA给内部网站颁发SSL证书
- BootStrap中文网站
- 佳能Canon PIXMA MG2550 打印机驱动
- OPC通讯开发简介——基于WTOPCSVR的OPC服务器端和基于WTCLIENT的OPC客户端开发
- LayoutInflater.from的含义
热门文章
- bootstrap modal使用方法
- http请求头状态码
- python flask 跨域问题 解决方法
- linux 系统运行状况 shell命令 watch 监控进程是否存在
- Rundll32.exe文件详解(显示我的电脑 取消自动登录)
- apt-get常用命令
- 错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
- Win7最高权限问题
- php session域名共享,实现多域名下共用一个SESSION
- mongodb数据库显示obj_MongoDB基础(三)—基本操作及管理 | leon的博客