6. 框架工具
6.1 spring
Spring是一个开源框架,主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring的核心是控制反转(IoC)和面向切面(AOP),用这两种技术完成了事务管理,对象配置等工作,而且对一些其他开源框架提供了很好的支持。
简单的说,springBoot和springMVC是利用Spring的多种特性,整合而成,专门为了适应特定环境下的开发的框架工具。
6.2 spring IoC
BeanFactory 是一个接口,提供了获取容器中Bean的相关方法。 BeanDefinitionRegistry 它才是IoC的容器,用于存储、管理所有的Bean对象。 DefaultListableBeanFactory,ApplicationContext它是IoC容器的一个具体实现,实现了BeanFactory和BeanDefinitionRegistry接口,因此既拥有管理Bean的容器,又拥有访问Bean的方法。 BeanDefinition 每一个Bean都有一个BeanDefinition与之对应,用于存储Bean的相关信息:对象的class类型、是否是抽象类、构造方法参数等。RootBeanDefinition和ChildBeanDefinition是BeanDefinition的两个主要的实现类。 BeanDefinitionReader 在Spring中,标注Bean的依赖关系有四中方式:直接在代码setter、构造器中声明;通过XML文件声明;通过Properties文件声明;通过注解声明。BeanDefinitionReader接口的作用就是读取配置文件中的bean信息,把它们解析成BeanDefinition对象,然后注册到BeanDefinitionRegistry中去。PropertiesBeanDefinitionReader和XmlBeanDefinitionReader是该接口的两个实现类,分别用于解析properties和xml格式的配置文件。
- 容器启动阶段 该阶段Spring会使用BeanDefinitionReader加载配置文件,并把所有的bean解析成BeanDefinition对象,并注册到BeanDefinitionRegistry。
- Bean实例化阶段 惰性加载,对于BeanFactory容器,当调用者主动调用getBean方法或者因存在依赖关系容器隐式调用getBean时,如果当前Bean尚未初始化,或者bean配置成prototype,就会触发Bean实例的初始化。
6.3 spring AOP
Spring AOP有两种方式,一种是java自带的动态代理(见7.7代理模式),另一种是CGlib。
6.3.1 CGLIB
Code Generation Library,是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。JDK代理要求被代理的类必须实现接口,有很强的局限性。而CGLIB动态代理则没有此类强制性要求。简单的说,CGLIB会让生成的代理类继承被代理类,并在代理类中对代理方法进行强化处理(前置处理、后置处理等)。在CGLIB底层,其实是借助了ASM这个非常强大的Java字节码生成框架。
6.4 spring事务
Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。使用Spring的事务管理功能后,我们可以不再开始和结束,而是由Spirng 自动完成。配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional标识。spring 在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成AOP代理,并根据@Transaction的事务传播相关参数进行相关配置注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务)。
6.4.1 事务传播属性
- PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,也是 Spring 默认的事务的传播。
- PROPAGATIONREQUIRESNEW 新建事务,如果当前存在事务,把当前事务挂起。新建的事务将和被挂起的事务没有任何关系,是两个独立的事务,外层事务失败回滚之后,不能回滚内层事务执行的结果,内层事务失败抛出异常,外层事务捕获,也可以不处理回滚操作
- PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
- PROPAGATIONNOTSUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
6.5 RPC
RPC是一种概念,用以让远程连接的多台服务器可以像调用本地方法一样互相调用。也可以理解成是一种现在的架构模式,类似SOA。
RPC的使用涉及到几个过程,首先服务在完成了逻辑之后,把自己的API暴露给其他的服务,这个时候需要一个注册的过程,注册之后其他的服务在注册平台上获取到信息,在实际的代码中就是使用spring进行需要使用的方法的配置。这样A就可以使用B提供的服务了,这其中可能还有一些监控的说法,比如在RPC实现的时候进行埋点,在监控平台上查看调用情况。如果这个底层的服务是一个很基础的服务,可能还需要一些限流操作,或者是上游业务方在进行处理的时候要有响应的熔断机制。
RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。 它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。 即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同。由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用,而RPC的概念就是让不同机器间方法调用变得简单。
6.6 MQ
-
消息 多个服务间需要方法进行信息传递。
-
解耦 消息发送上游只需要依赖MQ,逻辑上和物理上都不用依赖其他服务,很容易能实现上下游逻辑和物理的解耦。
-
顺序 多个任务间有先后顺序,任务2和3需要在任务1结束之后再执行。
6.6.1 MQ传递的顺序性
消息队列的生产者消费者中消费者没有收到消息怎么办,消息有顺序比如1.2.3但是收到的却是1.3.2怎么办?消息发过来的过程中损坏或者出错怎么办
有绝对时间参考的情况下,事件的发生时间的关系;
和没有时间参考下的,一种由因果关系推断出来的happening before的关系;
1、消费端处理消息的业务逻辑保持幂等性
2、保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现
6.6.2 MQ服务器实现
MQ消息由生产者发送到topic的MQ服务器,会先有一步exchange过程通过路由和一些负载机制,找到一个负载量不是很大的Queue队列中,MQ服务器中有很多queue队列,然后根据一些限流算法,或者一些幂等算法,通过网络的信道进行传输,发送给消费者。
6.7 CAT
APM —— Application Performance Management,应用性能管理。对企业应用进行即时的监控以实现对应用程序性能管理和故障管理的系统化的解决方案。CAT是点评开源的APM工具,分布式实时监控系统。
6.8 zebra
zebra是一种支持读写分离、分库分表、动态数据源、端到端监控的数据库中间件。代理数据源。数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。
6.9 bloom Filter
布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
6.10 JDBC
Java Database Connectivity。JDBC是Java应用程序访问数据库的里程碑式解决方案。Java研发者希望用相同的方式访问不同的数据库,以实现与具体数据库无关的Java操作界面。 JDBC定义了一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口。
6.11 Iaas与Paas与Saas
6.11.1 基础架构即服务——IaaS
IaaS通过虚拟化技术将服务器等计算平台同存储和网络资源打包,通过 API 接口的形式提供给用户。用户不用再租用机房,不用自己维护服务器和交换机,只需要购买 IaaS 服务就能够获得这些资源。
6.11.2 平台即服务——PaaS
PaaS 构建在 IaaS 之上,在基础架构之外还提供了业务软件的运行环境,个人网站常常用到的“虚拟主机”实际就属于 PaaS 的范畴,个人站长只需要将网站源代码上传到“虚拟主机”的地址,“虚拟主机”会自动运行这些代码生成对应的 Web 页面。除了形成软件本身运行的环境,PaaS 通常还具备相应的存储接口,这些资源可以直接通过 FTP 等方式调用,用户无需从头进行裸盘的初始化工作。
6.11.3 软件即服务——SaaS
SaaS 是最成熟、知名度最高的云计算服务类型,在云计算真正变得火热之前,软件即服务本身就已经是一个非常流行的概念了。SaaS 的目标是将一切业务运行的后台环境放入云端,通过一个瘦客户端——通常是 Web 浏览器——向最终用户直接提供服务。最终用户按需向云端请求服务,而本地无需维护任何基础架构或软件运行环境。 SaaS 同 PaaS 的区别在于,使用 SaaS 的不是软件的开发人员,而是软件的最终用户。