一、需解决的问题
部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法。
第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如:
boolean isValid = accountService.validSignature(appid, signature, client_signature); if (!isValid) return ErrorUtil.buildError(ErrorUtil.ERR_CODE_COM_SING);
第二种实现方式(Spring Interception):利用spring的拦截器功能,对指定的接口进行拦截,拦截器实现签名校验算法,例如:
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/connect/share/**" /> <mvc:mapping path="/friend/**" /> <mvc:mapping path="/account/get_bind" /> <mvc:mapping path="/account/get_associate" /> <bean class="com.sogou.upd.passport.web.inteceptor.IdentityAndSecureInteceptor" /> </mvc:interceptor> </mvc:interceptors>
第三种实现方式(spring AOP):自定义注解,对需要进行签名验证的方法添加注解,例如:
@SecureValid @ResponseBody @RequestMapping(value = "/share/add", method = RequestMethod.POST) public Object addShare(HttpServletRequest req, HttpServletResponse res,InfoAPIRequestParams requestParams) { ... }
2. 日志记录功能,例如:某些接口需要记录请求和响应,执行时间,类名,方法名等日志信息。也可采用以上三种方式实现。
3. 代码性能监控问题,例如方法调用时间、次数、线程和堆栈信息等。这类问题在后一个专题提出解决方案,采用以上三种方式实现缺点太多。
以下是三种实现方式比较:
实现方式 | 优点 | 缺点 |
Origin |
不采用反射机制,性能最佳 |
逻辑复杂时,代码复用不好 需要在每个接口里写入相同代码(我太懒,就想写几个字母) |
Spring Inter |
非常适合对所有方法进行拦截,例如调试时打印所有方法执行时间 类似过滤器的功能,如日志处理、编码转换、权限检查 是AOP的子功能 |
不采用反射机制,性能有所影响 需要在xml文件里配置对哪些接口进行拦截,比较麻烦 |
Spring AOP |
使用方便,增加一个注解 非常灵活,可@Before,@After,@Around等 |
不采用反射机制,性能有所影响(性能对比后面详细展示) |
二、Spring AOP 自定义注解的实现
在Maven中加入以下以依赖:
<!-- Spring AOP + AspectJ by shipengzhi -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1_3</version>
</dependency>
<!-- end -->
在spring-***.xml中加入spring支持,打开aop功能
头文件声明 :
<xmlns:aop="http://www.springframework.org/schema/aop" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd <!-- 自定义AOP --> <aop:aspectj-autoproxy proxy-target-class="true"> <aop:include name="controllerAspect" /> </aop:aspectj-autoproxy> <bean id="controllerAspect" class="com.sogou.upd.passport.common.aspect.ControllerAspect"></bean> <!-- 或: --> <aop:aspectj-autoproxy>
自定义注解实现在Controller层面
/** * 对Controller进行安全和身份校验 */ @Around("within(@org.springframework.stereotype.Controller *) && @annotation(is)") public Object validIdentityAndSecure(ProceedingJoinPoint pjp, SecureValid is) throws Exception { Object[] args = pjp.getArgs(); //Controller中所有方法的参数,前两个分别为:Request,Response HttpServletRequest request = (HttpServletRequest) args[0]; String appid = request.getParameter("appid"); int app_id = Integer.valueOf(appid); String signature = request.getParameter("signature"); String clientSignature = request.getParameter("client_signature"); String uri = request.getRequestURI(); String provider = request.getParameter("provider"); if (StringUtils.isEmpty(provider)) { provider = "passport"; } // 对appid和signature进行校验 try { appService.validateAppid(app_id); boolean isValid = accountService.validSignature(app_id, signature, clientSignature); if (!isValid) throw new ProblemException(ErrorUtil.ERR_CODE_COM_SING); } catch (Exception e) { return handleException(e, provider, uri); } // 继续执行接下来的代码 Object retVal = null; try { retVal = pjp.proceed(); } catch (Throwable e) { if (e instanceof Exception) { return handleException((Exception) e, provider, uri); } } // 目前的接口走不到这里 return retVal; }
三、Spring拦截器的实现
在spring-***.xml中加入拦截器的配置
编写拦截器实现类
public class CostTimeInteceptor extends HandlerInterceptorAdapter { private static final Logger log = LoggerFactory.getLogger(CostTimeInteceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { long startTime = System.currentTimeMillis(); request.setAttribute("startTime", startTime); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { long startTime = (Long) request.getAttribute("startTime"); long endTime = System.currentTimeMillis(); long executeTime = endTime - startTime; if (log.isInfoEnabled()) { log.info("[" + request.getRequestURI() + "] executeTime : " + executeTime + "ms"); } } }
四、性能对比
实验环境:对/account/get_associate接口,并发500,压测10分钟
指标 | Origin | Spring Inter | Spring AOP |
CPU |
user%:26.57
sys%:10.97 cpu%:37.541 |
user%:26.246
sys%:10.805 cpu%:37.051 |
user%:24.123 sys%:9.938 cpu%:34.062 |
Load | 13.85 | 13.92 | 12.21 |
QPS | 6169 | 6093.2 | 5813.27 |
RT |
0.242ms |
0.242ms |
0.235ms |
采用AOP对响应时间无明显影响
采用AOP对Load无明显影响
采用AOP对CPU无明显影响
结论:使用AOP性能方面影响可忽略
相关推荐
性能监控:除了监控桌面画面,还支持监控目标计算机的性能指标,如CPU、内存、网络等。 通过以上设计与实现,基于Java的CS远程监控系统软件能够帮助管理员实现对大量计算机设备的实时监控和远程管理,提高管理效率...
3.实现每小时检查nmon是否启动,确保异常中断后忘记启动nmon服务,导致无性能监控日志生成; 4.时间监控启动、中断或异常日志,记录在/usr/local/nmon/目录中,以确认nmon服务运行状态; 已使用centos 7.0为例...
Perf4j则是通过对自定义监控范围进行日志记录,再经统计分析生成所需性能数据,Perf4j提供了对常用日志工具的扩展以方便与产品集成,它产生的数据可用于生成可视化的性能图表。在实际部署的生产环境能够以较低的风险...
服务器系统健康监控体系 软件信息 监控服务 汇总 阀值判定 各类报警 记录日志 健康监控体系报警,然后呢? ---分析 各种开源工具、内嵌API、心跳等多种检测方式 硬件信息 服务器监控及性能优化全文共27页,当前为第...
第9章 性能监控 278 第10章 服务监控 283 10.1 nagios搭建与维护 283 10.2 mysql数据库的监控脚本 288 第五部分 项目案例 第11章 项目案例讲解 292 11.1 数据碎片整理方案 292 11.2 用户信息表水平拆表方案 ...
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的中统一处理业务逻辑的一种技术,比较常见的场景是:日志记录,错误捕获、性能监控等 AOP的本质是通过...
如果你公司有多台服务器多个站点,是不是因为经常被上传木马而烦恼,本软件实时监控系统站点目录文件的变化,对可疑的文件进行记录,并隔离。 绿色软件 无需安装 解压即可使用 支持:Win2000/Win2003 监控的...
文件操作监控是一款文件夹监控软件,可记录指定目录下的文件操作及改动情况,支持日志导出。 文件操作监控使用方法: 第一步:选择指定监控的路径,点击如下图的按钮选择,选择完毕后,点击开始按钮 2、以下为...
状态和性能信息:日志文件可以记录应用程序的状态和性能信息,如请求响应时间、数据库查询耗时、资源使用情况等。这些日志对于分析系统性能和优化应用程序非常有帮助。 安全审计:日志文件可以记录用户的操作行为、...
管理系统是一种通过计算机技术实现的用于组织、监控和控制各种活动的软件系统。这些系统通常被设计用来提高效率、减少错误、加强安全性,同时提供数据和信息支持。以下是一些常见类型的管理系统: 学校管理系统: ...
简介 动态代理是一种设计...通过代理对象,我们可以在方法调用前后插入附加逻辑,实现一些横切关注点的功能,如日志记录、权限验证、性能监控等。动态代理可以提供一种灵活的方式来修改对象的行为,并将关注点解耦。
PumpedUp 每秒收集系统性能数据并创建实时或静态图形网页。 它可以快速指出系统上的最大化资源。 它还具有将数据发送到 Redis / Logstash 进行分析或 Nagios 进行警报的选项。 PumpedUp 默认在端口 8080 上运行不...
g rollup2、开发模式 (监听代码变化,生成xbossdebug.js)npm run watch3、编译(生成xbossdebug.min.js)npm run build方案设计思想TODO服务端记录数据数据并可视化资源加载监控页面性能监控typescript版本✅...
FDBus是一个易于使用、轻量级和高性能的IPC框架。它类似于 或 ,但有自己的特点:DBusSOME/IP.分布式:与 不同,它没有中心...日志记录和调试:可以过滤和记录所有FDBus消息;服务可以被监控;可以列出连接的客户端...
直放站及室内覆盖统一监控系统 告警管理 安全管理 日志管理 系统管理 系统帮助 拓朴管理 性能管理 轮询管理 地图工具 设备管理 工单管理 代维管理 工程管理 直放站资产管理模块 监控中心培训资料全文共57页,当前为...
日志直观详细,可对文件篡改保护及网络攻击防护两种不同日志的统一查询审计能; 技术先进,安全、稳定、可靠; 采取先进的多重防护技术,杜绝篡改; 完全基于内核级事件触发机制,对服务器资源占用极少...
自动创建日志文件(用户操作日志、系统日志、远程控制日志),便于查询操作记录。 系统可任意设置定时关机,定时重启功能,保证系统运行的高稳定性。 可设定开机自动运行监控软件,断电自动关闭程序,来电自动...