Skip to main content

    浅谈AOP以及AspectJ和Spring AOP

    AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如日志收集、事务管理、安全检查、缓存、对象池管理等。AOP实现的关键就在于AOP框架自动创建的AOP代理,AOP代理则可分为静态代理和动态代理两大类,其中静态代理是指使用AOP框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;而动态代理则在运行时借助于`JDK动态代理`、`CGLIB`等在内存中“临时”生成AOP动态代理类,因此也被称为运行时增强。

    面向切面的编程(AOP) 是一种编程范式,旨在通过允许横切关注点的分离,提高模块化。AOP提供切面来将跨越对象关注点模块化。虽然现在可以获得许多AOP框架,但在这里我们要区分的只有两个流行的框架:Spring AOP和AspectJ。

    继续阅读

    通过反编译破解Charles

    APP开发或者后端接口开发,经常需要联调或者模拟请求API,甚至抓包定位问题,都会用到一款超强的工具,当然,它也是爬虫同学的最爱。这款让人欢喜的工具就是Charles。该软件不是免费的,需要购买才可使用,鉴于此,逆向破解,使其无需购买可用。当然,如果不是拮据,我也愿意掏钱购买,毕竟他们开发也不容易。

    继续阅读

    Java日志Log4j或者Logback的NDC和MDC功能

    Java中使用的日志的实现框架有很多种,常用的log4j和logback以及java.util.logging,而log4j是apache实现的一个开源日志组件(Wrapped implementations),logback是slf4j的原生实现(Native implementations)。需要说明的slf4j是Java简单日志的门面(The Simple Logging Facade for Java),如果使用slf4j日志门面,必须要用到slf4j-api,而logback是直接实现的,所以不需要其他额外的转换以及转换带来的消耗,而slf4j要调用log4j的实现,就需要一个适配层,将log4j的实现适配到slf4j-api可调用的模式。

    说完基本的日志框架的区别之后,我们再看看NDC和MDC。

    不管是log4j还是logback,打印的日志要能体现出问题的所在,能够快速的定位到问题的症结,就必须携带上下文信息(context information),那么其存储该信息的两个重要的类就是NDC(Nested Diagnostic Context)和MDC(Mapped Diagnositc Context)。

    继续阅读

    计算单元Docker

    Docker容器属于虚拟化技术,类似于一个轻量级的虚拟机,专注于Linux平台,使用Linux的诸多内核特性,比如namespace、cgroups等,让进城运行在一个隔离的环境中(隔离性)。

    Docker和虚拟机的区别:虚拟机技术相对于容器来说要“重”很多,虚拟机采用Hypervisor技术,是虚拟机与物理服务器中间的一层,为每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统,这种虚拟化意味着很大部分的计算、存储资源被使用在荣誉的客户操作系统上,启动过程要远远慢于容器。Docker采用了一种截然不同的方法,它直接采用Linux的容器技术来隔离进程,让其认为自己运行在一个单独的操作系统中,而实际上仍然运行在同一个操作系统中,共享同一个内核,资源利用率远高于Hypervisor。Docker在文件系统上使用了分层结构的AUFS(Another Unionfs)文件系统,将存储资源的共享也实现了最大化,进一步保证了资源的使用率。

    继续阅读

    Nginx截断response的body

    在前后端分离实践中,借助于nginx的反向代理,既能解决负载问题,也能解决跨域问题,是一个完美的实现方案。最近解决写了一个多级菜单列表的接口,数据大小有200k。通过ip访问,返回数据是完整的,但是通过代理域名访问,返回只有60-80k之间的数据。

    查询Nginx的error.log日志,发现下面的错误:

    2017/04/26 18:27:46 [crit] 19851#0: *867217 open() “/var/lib/nginx/proxy/6/68/0000001686” failed (13: Permission denied) while reading upstream, client: 10.71.253.194, server: admin-develop.xxx.cc, request: “GET /v2/menu/list HTTP/1.1”, upstream: “http://127.0.1.1:40212/router/menu/list”, host: “admin-develop.xxx.cc”

    继续阅读