Spring源码解析之AOP设计与实现

前言

AOP即面向切面编程,底层通过策略模式选择JDK动态代理还是CGLIB动态代理的方式实现,通过AOP可以在不修改原代码的基础上完成对类的功能的增强。相较于继承这种纵向抽取机制,AOP采用的横向抽取机制更加符合高内聚低耦合的思想。

AOP相关概念

  • 连接点:类中哪些方法可以被增强,这些方法称为连接点
  • 切入点(Pointcut):类中有很多可以被增强的方法,而实际选用的被增强方法就是切入点
  • 通知(Advice):定义增强的逻辑,即在切入点做什么增强操作,有BeforeAdvice、AfterAdvice、ThrowsAdvice等
  • 通知器(Advisor):将目标方法的切面增强设计(Advice)和切入点(Pointcut)结合起来。通过Advisor,可以定义使用哪个通知并在哪个Pointcut使用它,也就是给指定的Pointcut指定对应的Advice

Read More

负载均衡那些事

在网站的架构设计中,应用服务器应该被设计成无状态的,也就是说应用服务器不存储请求上下文信息。这样子的话,如果将部署相同应用的服务器组成一个集群,每次用户请求都可以发送到集群中任何一台服务器上进行请求处理,任何一台服务器的处理结果都是相同的。通过使用这种方式,让网站的可用性、伸缩性更好,能够处理更大的流量,这种方式称为”负载均衡”。在这篇文章中,我们一起来学习负载均衡,主要分下面三个部分来将,会依次介绍常用的负载均衡技术,常用的负载均衡算法以及这些负载均衡层在实际案例中的使用方式。

Read More

Netty之EventLoop与线程模型

前言

首先,线程模型指定了操作系统、编程语言或者应用程序的上下文中的线程管理的关键方面。Netty的线程模型,强大而又易用,在简化代码的同时,最大限度的提高性能和可维护性。学习这部分可能需要有一定的多线程的知识的基础,可以看看《Java并发编程实战》或者《并发编程的艺术》这两本书。

Read More

Netty之组件与设计

一、Channel、EventLoop、ChannelFuture

这些类合在一起,可以被认为是Netty网络抽象的代表:

  • Channel——Socket
  • EventLoop——控制流、多线程处理、并发处理
  • ChannelFuture——异步通知

Read More

Netty之构建Netty应用程序

一、编写Netty服务器

所有的Netty服务器都需要以下两个部分:

  • 至少一个ChannelHandler——用于处理服务器从客户端接收的数据
  • 引导Bootstrap——这是配置服务器的启动代码,会将服务器绑定到它要监听连接请求的端口上

Read More

Netty剖析之核心组件

前言

在之前的博文《Java NIO原理解析》里面,主要讲了NIO的一些原理,几种IO模型的对比,NIO中三个重要的组件Channel,Selector以及Buffer,通过Selector单线程轮询状态实现了IO复用机制,这些在这就不重新讨论了。

然而,原生的NIO方法比较复杂,Netty进行了很好的封装,提供更易于使用的API,性能更好,健壮性、安全性也很好,在很多地方都能见到Netty的身影,比如阿里的Dubbo分布式框架,底层就使用Netty作为网络通信框架,接下来会用几篇博文来详细讲下Netty这个高性能的网络框架。

Read More

Spring源码解析之IOC容器(二)

前言

上一篇,我们主要分析了IOC容器初始化过程中,BeanDifinitions的定位、载入解析以及注册的流程。在这篇文章,我们会来谈一谈IOC容器的依赖注入及其他相关特性的分析。

IOC容器的依赖注入

依赖注入的过程是用户第一次向IOC容器索要Bean时出发的,即使用getBean()方法时。当然也有例外,当我们设置了lazy-init属性后,会让容器完成对Bean的预实例化,这个这个预实例化其实也是一个依赖注入的过程,只是时机和场景不同。(可见refresh方法中的注解)

Read More

Spring源码解析之IOC容器(一)

前言

一直想阅读下Spring的源码,但是翻翻书又感觉这个好复杂,不想去看,所以一直拖到现在,昨天定下心看了下书,觉得并没有那么晦涩难懂,还是要克服惧怕未接触的事物,敢于去克服自己的弱点。主要先看Spring的两大核心IOC和AOP,参考书籍是计文柯的《Spring技术内幕》。这篇文章主要先讲下IOC容器的内部实现。

IOC容器简介

IOC即控制反转,这里的反转指的是对象依赖关系的管理被反转了,转到IOC容器上了,对象之间的相互依赖关系由IOC容器进行管理,并由容器完成对象的注入。

Read More

谈谈分布式事务

什么是分布式事务

一个事务由多个不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要确保这些小的操作要么全部成功,要么全部失败。从本质上说,分布式事务是为了保证不同数据库之间的一致性。分布式事务的应用场景主要是在支付和在线下单,支付涉及到扣款和加钱,而在线下单则涉及到扣库存和更新账单,需要分布式事务来保证一致性。

Read More

浅谈分库分表

前言

什么是分库分表?

从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。

为什么要分库分表?

数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。

常用的分库分表中间件

简单易用的组件:

  • 当当sharding-jdbc
  • 蘑菇街TSharding

强悍重量级的中间件:

  • sharding
  • TDDL Smart Client的方式(淘宝)
  • Atlas(Qihoo 360)
  • alibaba.cobar(是阿里巴巴(B2B)部门开发)
  • MyCAT(基于阿里开源的Cobar产品而研发)
  • Oceanus(58同城数据库中间件)
  • OneProxy(支付宝首席架构师楼方鑫开发)
  • vitess(谷歌开发的数据库中间件)

Read More