目录
Alibaba Cloud ACM一款在分布式架构环境中对应配置进行集中管理和推送的应用配置中心产品
Alibaba Cloud SchedulerX 分布式任务调度产品
Spring全家桶
框架优点
-
轻量:基本的版本只有2M
-
控制反转,实现了松耦合
-
AOP面向切面编程,可以把业务逻辑和系统服务分开
-
IOC容器:管理应用中对象的生命周期和配置
-
MVC框架式web框架替代品
-
事务管理:提供了一个事务管理接口,可扩展到上至本地事务下至全局事务(JTA)
-
异常处理:提供方便的API把具体技术相关异常(如JDBC、hibernate、JDO异常)转换为一致的unchecked异常
缺点:
Spring缺点 缺少一个公用控制器 没有SpringBoot好用,spring把好的框架都粘连在一起使用(hibernate、struts2、JPA)
IOC
概念
-
IOC即为控制反转,把对象的创建和对象之间的调用过程,交给Spring管理。
-
使用IOC的目的:为了降低耦合度。提高代码可维护性和易扩展性
-
原理是基于反射
-
Spring中常见的IOC容器有BeanFactory(负责管理bean)和其子接口ApplicationContext(提供AOP、事务管理、国际化等支持)
作用域
-
singleton
-
prototype
-
request
-
session
-
global session
容器的初始化过程
1.)Resource定位;指对BeanDefinition的资源定位过程。通俗地讲,就是找到定义Javabean信息的XML文件,并将其封装成Resource对象。
2.)BeanDefinition的载入;把用户定义好的Javabean表示为IoC容器内部的数据结构,这个容器内部的数据结构就是BeanDefinition。
3.)向IoC容器注册这些BeanDefinition。
注意:loC容器初始化过程,一般不包含Bean依赖注入的实现。在Spring loC的设计中,Bean定义的载入和依赖注入是两个独立的过程。依赖注入一般发生在应用第一次通过getBean向容器索取Bean的时候。
Bean加载过程
-
获取beanName:对传入的name进行解析,转化为可以从Map中获取到BeanDefinition的beanName
-
合并Bean定义:对父类进行定义,如果还有就递归合并。以获取完整的bean定义信息
-
实例化:使用构造或者工厂方法创建bean
-
属性填充:寻找并注入依赖,依赖的bean会递归调用getBean方法
-
初始化:调用定义的初始化方法
-
获取最终的bean
Bean的生命周期
1、实例化
@开始填充属性
@开始初始化
3.调用BeanNameAware的setBeanName方法
4.调用BeanFactoryAware的setBeanFactory方法
5.调用ApplicationContextAware的setApplicationContext方法
6、调用initiizingBean的afterPropertiesSet方法
7、调用定制的初始化方法
8、调用BeanPostProcess的postProcessAfterIiniiZation方法
删除正在创建的BeanName
返回Bean
9、Bean准备就绪,调用DispostbleBean的destory方法
10.调用定制化销毁方法
如何解决循环依赖
提前暴露
map缓存实例化对象,递归实例化参数
spring内部有三级缓存: singletonObjects 一级缓存,用于保存实例化、注入、初始化完成的bean实例
earlySingletonObjects 二级缓存,用于保存实例化完成的bean实例
singletonFactories 三级缓存,用于保存bean创建工厂,以便于后面扩展有机会创建代理对象
循环依赖
构造器方式无法解决,只能抛出异常 多例方式无法解决,只能抛出异常 因为Spring容器不缓存"prototype"作用域的bean,因此无法提前暴露一个创建中的bean。 单例模式可以解决 通过提前暴露一个单例工厂方法,从而使其他bean能够引用到该bean/提前暴露一个正在创建中的bean
AOP
AOP实现的关键就在于AOP框架自动创建的AOP代理,AOP代理则可分为静态代理(例如:原生AspectJ)和动态代理(例如:spring aop)两大类,其中静态代理是指使用AOP框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;而动态代理则在运行时借助于JDK动态代理、CGLIB等在内存中“临时”生成AOP动态代理类,因此也被称为运行时增强。 概念
-
面向切面编程,作为面向对象的一种补充,将公共逻辑(事务管理、日志、缓存等)封装成切面,跟业务代码进行分离,可以减少系统的重复代码和降低模块之间的耦合度。
-
Spring的AOP实现是通过动态代理实现的,分别是JDK的动态代理,以及CGLib的动态代理。
使用场景
-
权限
-
缓存
-
内容传递
-
错误处理
-
全局操作日志
-
懒加载
-
调试
-
事务
动态代理
两者的区别:
-
jdk动态代理使用jdk中的类Proxy来创建代理对象,它使用反射技术来实现,不需要导入其他依赖。cglib需要引入相关依赖:asm.jar,它使用字节码增强技术来实现。
-
当目标类实现了接口的时候Spring Aop默认使用jdk动态代理方式来增强方法,没有实现接口的时候使用cglib动态代理方式增强方法。
为什么jdk动态代理必须是接口?
jdk动态代理会生成一个字节码文件(class)反编译后看到,生成的代理对象默认继承了Proxy对象,因为java是单继承,所以代理对象必须是接口
事务
传播行为
PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION SUPPORTS支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATIONMANDATORY使用当前的事务,如果当前没有事务,就抛出异常
PROPAGATION REQUIRES NEW新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION NOT SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
PROPAGATION NEVER以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION NESTED如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与
PROPAGATION REQUIRED类似的操作。
默认使用PROPAGATION_REQUIRED 如果当前没有事务就新建一个,如果已经存在事务则加入
隔离级别
1SOLATION DEFAULT这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别
2.另外四个与JDBC的隔离级别相对应:
3.ISOLATIONREAD UNCOMMITTED这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻读。
4.ISOLATIONREAD COMMITTED保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻读。
5.ISOLATION REPEATABLE READ这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免不可重复读。
6SOLATION SERIALZABLE这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防上脏读,不可重复读外,还避免了幻读。
默认使用数据库默认的隔离级别
Spring Security安全框架
底层是Filter过滤器
spring ORM
提供了与第三方持久层框架的良好整合
Spring DAO
spring进一步简化dao开发步骤,能以一致的方式使用数据库访问技术,用统一的方法调用事务管理,避免具体实现渗入业务层
Spring Context
上下文,提供了框架式的对象访问方法。提供了国际化(i18n)、电子邮件、校验和调度功能
#BeanFactory 和 ApplicationContext 有什么区别ApplicationContext 在 BeanFactory基础上加了很多高级特性国际化、获取资源、获取环境信息(通过Application context获jdk、操作系统环境)以及发布事件(自定义事件、发布事件、监听事件。观察者模式)
类型:
FileSystemXmlApplicationContext
ClassPathXmlApplicationContext
WebXmlApplicationContext
SpringMVC
原理
-
Dispatcher调度员:客户端所有请求交给前端控制器DispatcherServlet处理,它负责调用系统其他模块处理用户请求
-
dispatcherServlet收到请求后,根据请求信息(URL、请求参数)以及HandlerMapping的配置,找到处理该请求的Handler
-
在这里spring会通过HandlerAdapter对该处理器进行封装
-
HandlerAdapter是一个适配器,他用统一的接口对各种handler中的方法进行调用
-
handler完成请求返回ModelAndViewer对象给dispatcherServlet
-
客户端得到响应,可能是html、xml、json、图片或pdf文件
Servlet容器和Spring容器关系
Tomcat&Jetty在启动时给每个Web应用创建一个全局的上下文环境,这个上下文就是ServletContext,其为后面的Spring容器提供宿主环境。 Tomcat&Jetty在启动过程中触发容器初始化事件,Spring的ContextLoaderListener会监听到这个事件,它的contextlnitialized方法会被调用,在这个方法中,Spring会初始化全局的Spring根容器,这个就是Spring的loC容器,o(容器初始化完毕后,Spring将其存储到ServletContext中,便于以后来获取。 Tomcat&Jetty在启动过程中还会扫描Servlet,一个Web应用中的Servlet可以有多个,以SpringMVC中的DispatcherServlet为例,这个Servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个Servlet请求. Servet一般会延迟加载,当第一个请求达到时,Tomcat&Jetty发现DispatcherServlet还没有被实例化,就调用DispatcherServet的init方法,DispatcherServet在初始化的时候会建立自己的容器,叫做SpringMVC 容器,用来持有Spring MVC相关的Bean,同时,Spring MVC还会通过ServetContext拿到Spring根容器,并将Spring根容器设为SpringMVC容器的父容器,请注意,Spring MVC容器可以访问父容器中的Bean,但是父容器不能访问子容器的Bean.也就是说Spring根容器不能访河SpringMVC容器里的Bean,说的通俗点就是,在Controller里可以访问Service对象,但是在Service里不可以访问Controller对象。
常用注解
@Controller
-
用于标注控制层组件
-
标注在类上,是他成为spring mvc的一个Controller对象
-
分发处理器将会扫描该类的方法,并检测是否使用了@RequestMapping注解
-
可以吧Request请求的Header部分的值绑定到方法的参数上
@RestController
相当于@Controller和@responseBody的结合
@RequestMapping
一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
@ResponseBody
-
异步请求
-
该注解用于将Controller的方法返回的对象,通过适当的HTTPMessageConverter转换为指定格式后,写入到Response对象的Body数据区
-
返回的数据不是html标签的页面,而是其他某种格式的数据时(JSON,XML)时使用
@RequestParam
主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter(name)
@PathVariable
用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数
@Component泛指组件,当组件不好归类就用这个
@Service
业务层组件
@Repository 用于注解dao层,在daoimpl类上
@Autowired
可以对类的成员变量、方法及构造函数进行标注,完成自动装配的工作后。通过@Autowired来消除set get方法的使用
SpringBoot
优点:
-
配置更简单,约定大于配置
-
直接使用性能指标。健康指标和接口应用信息
-
pom引入包更方便:无需spring、spring MVC、redis、mybaties、log4j、mysql-connect-java,只要start-web依赖即可
-
用jar运行
-
嵌入式的servlet容器,无需打war包,内嵌tomcat直接运行
-
无需xml配置即可实现spring配置
启动原理
1、初始化SpingApplication对象
1、设置应用类型,后面会根据类型初始化对应的环境,常用的一般都是servlet环境
2、加载系统中引导器Bootstrapper (从META-INF/spring.factories中加载)
3、初始化classpath下 META-NF/spring.factories 中已配置的ApplicationContextlnitalizer
4、初始化classpath下所以已配置的 ApplicationListener
5、根据调用栈,设置main 方法的类名
2、执行run()方法
1、获取并启动监听器 2、构造上下文环境 3始化应用上下文 4、刷新应用上下文前的准备阶段 5刷上下文 6、刷新应用上下文后的扩展接口
启动过程
1、通过springFactoriesLoader加载META-INFO/spring.factories文件,获取并创建SpringApplicationRunListener对象
2、然后由SpringApplictionRunListener来发出starting消息
3、创建参数、并配置当前SpringBoot应用要使用的Environment
4、完成之后、依然由SpringApplicationRunListeneer来发出environmentPrepared消息
5、创建ApplicitonContext
初始化ApplicationContext,并设置Environment加载相关配置
7、由SpringApplicationRunListener来发出contextPrepared消息,告知springBoot应用使用的ApplicationContext已准备完毕
8、将各种Beans装载如ApplicationContext,继续由SpringApplicationRunListener来发出contextLoanded的消息,告知Spring boot应用ApplicationContext已装填
refresh Application完成Ioc容器最后一步
10、由SprinApplicationRunListener发出started消息
完成最终的程序启动
12、由SpringApplicationRunlistnener发出running消息,告知程序已运行
常用注解
@Bean:默认使用方法名作为ID
@Scope作用域,默认单例Singleton
@Value 给变量赋值,可以是基本数字字符串或${}从环境变量里取值
@Autowired:自动装配,默认优先从容器中寻找组件
@Profile 环境标识:spring提供了根据当前环境动态激活和切换的一系列组件功能。只有指定的环境才能被注册到容器,默认default
@RestController: @ResponseBody和@Controller的合集
@EnableAutoConfiguration: 尝试根据你添加的jar依赖自动配置你的Spring应用。
@ComponentScan: 表示将该类自动发现(扫描)并注册为Bean,可以自动收集所有的Spring组件,包括@Configuration类
@ImportResource: 用来加载xml配置文件。
@Configuration: 相当于传统的xml配置文件,如果有些第三方库需要用到xml文件,建议仍然通过@Confiquration类作为项目的配置主类一可以使用@lmportResource注解加载xml配置文件。
@SpringBootApplication: 相当于@EnableAutoConfiguration、@ComponentScan和@Configuration的合集.
Spring Cloud Alibaba微服务
主要功能
服务限流降级:默认支持WebServlet、WebFlux,OpenFeign、RestTemplate、SpringCloudGateway,Zuul,Dubbo和RocketMQ限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级Metrics监控。
服务注册与发现: 适配Spring Cloud服务注册与发现标准,默认集成了Ribbon的支持.
分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
消息驱动能力:基于Spring Cloud Stream为微服务应用构建消息驱动能力。
分布式事务:使用@GlobalTransactional注解,高效并且对业务零侵入地解决分布式事务问题。
阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用任何时间、任何地点存储和访问任意类型的数据。
分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于Cron表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有Worker (schedulerx-client)上执行
阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
Ribbon
基于客户端的负载均衡,Feign已默认集成Ribbon
从注册中心服务器获取服务列表缓存到本地,轮询负载均衡策略
Sentinel
-
Sentinel是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。
-
其他容错组件:Hystrix、Resilience4j
-
Hystrix采用的是线程池隔离的方式,优点是做到了资源之间的隔离,缺点是增加了线程切换 的 成本。 Sentinel采用的是通过并发线程的数量和响应时间来对资源做限制
-
-
通过轻量级控制台实现单机资源实时监控、规则管理
nacos
-
易于构建云原生应用的动态服务发现、配置管理、服务管理平台
-
Discovery服务发现(治理)和Config服务配置
Config
命名空间(Namespace)命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间
配置分组(Group)配置分组用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组
配置集(Data ID)在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集
RocketMq
开源分布式消息系统,基于高可用的分布式集群技术,提供低延时,高可靠的消息发布与订阅服务
发送方式 :可靠同步发送、可靠异步发送和单向发送可靠同步发送
-
同步发送是指消息发送方发出数据后,会在收到接收方发回响应之后才发下一个数据包的通讯方式。 此种方式应用场景非常广泛,例如重要通知邮件、报名短信通知、营销短信系统等可靠异步发送
-
异步发送是指发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式发送方通过回调接口接收服务器响应,并对响应结果进行处理。异步发送一般用于链路耗时较长,对RT响应时间较为敏感的业务场景,例如用户视频上传后通知启动转码服务,转码完成后通知推送转码结果等。
-
单向发送单向发送是指发送方只负责发送消息,不等待服务器回应且没有回调函数触发,即只发送请求不等待应答。适用于某些耗时非常短,但对可靠性要求并不高的场景,例如日志收集
Dubbo
高性能RPC框架
Seata
阿里开源产品。易于使用的高性能微服务分布式事务解决方案
四种分布式事务模式,分别在不同的时间被提出,每种模式都有它的适用场景: 。AT 模式是无侵入的分布式事务解决方案,适用于不希望对业务进行改造的场景,几乎0学习成本。 。TCC 模式是高性能分布式事务解决方案,适用于核心系统等对性能有很高要求的场景 Saga 模式是长事务解决方案,适用于业务流程长且需要保证事务最终一致性的业务系统,Saga 模式一阶段就会提交本地事务,无锁,长流程情况下可以保证性能,多用于渠道层、集成层业务系统。事务参与者可能是其它公司的服务或者是遗留系统的服务,无法进行改造和提供 TCC 要求的接口,也可以使用 Saga 模式。 XA模式是分布式强一致性的解决方案,但性能低而使用较少。
XA协议-两阶段提交(2PC)
XA协议-三阶段提交(3PC)
3.AT(Auto Transaction)模式 AT 模式的一阶段、二阶段提交和回滚均由 Seata 架自动生成,用户只需编写“业务 SQL”,便能轻松接入分布式事务AT 模式是一种对业务无任何侵入的分布式事务解决方案。但AT模式存在的不足就是 当操作的数据 是共享型数据,会存在 脏写的问题,所以如果是 用户独有数据可以使用AT模式
4.TCC(Try、Confirm、Cancel)模式TCC方案其实是两阶段提交的一种改进。分成了Try、Cnfirm、Cancel三个操作。事务发起方在一阶段执行 Try 方式在二阶段提交执行 Confirm 方法,二阶段回滚执行 Cancel 方法
5 SAGA模式 Saga 模式适用于业务流程长且需要保证事务最终一致性的业务系统,Saga 模式一阶段就会提交本地事务,无锁、长流程情况下可以保证性能。 事务参与者可能是其它公司的服务或者是遗留系统的服务,无法进行改造和提供 TCC 要求的接口,可以使用 Saga 模式。
默认AT
三大模块
分别是 TM、RM 和 TC
TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
执行流程
Seata的执行流程如下:
1.A服务的TM向TC申请开启一个全局事务,TC就会创建一个全局事务并返回一个唯一的XID
2.A服务的RM向TC注册分支事务,并及其纳入XID对应全局事务的管辖
3.A服务执行分支事务,向数据库做操作
4.A服务开始远程调用B服务,此时XID会在微服务的调用链上传播
5.B服务的RM向TC注册分支事务,并将其纳入XID对应的全局事务的管辖
6.B服务执行分支事务,向数据库做操作
7.全局事务调用链处理完毕,TM根据有无异常向TC发起全局事务的提交或者回滚8.TC协调其管辖之下的所有分支事务,决定是否回滚
Alibaba Cloud ACM一款在分布式架构环境中对应配置进行集中管理和推送的应用配置中心产品
Alibaba Cloud OSS 阿里云对象存储服务
Alibaba Cloud SchedulerX 分布式任务调度产品
Alibaba Cloud SMS:覆盖全球的短信服务
gateway
-
性能强大,是第一代产品zuul的1.6倍
-
执行流程
-
1Gateway Client向Gateway Server发送请求
-
2请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文
-
3.然后网关的上下文会传递到DispatcherHandler,它负责将请求分发给RoutePredicateHandlerMapping
-
4.RoutePredicateHandlerMapping负责路由查找,并根据路由断言判断路由是否可用
-
5.如果过断言成功,由FilteringWebHandler创建过滤器链并调用
-
6请求会一次经过PreFilter--微服务-PostFilter的方法,最终返回响应
-
-
核心框架 基本概念
-
路由(Route)是gateway中最基本的组件之一,表示一个具体的路由信息载体。主要定义了下面的几个 信息:
-
id路由标识符,区别于其他Route。
-
uri,路由指向的目的地uri,即客户端请求最终被转发到的微服务。
-
order,用于多个Route之间的排序,数值越小排序越靠前,匹配优先级越高。
-
predicate,断言的作用是进行条件判断,只有断言都返回真,才会真正的执行路由。
-
fifilter,过滤器用于修改请求和响应信息。
-
-
网关限流
基于Sentinel的Gateway限流是通过其提供的Filter来完成的,使用时只需注入对应的SentinelGatewayFilter实例以及SentinelGatewayBlockExceptionHandler实例即可从1.6.0版本开始,Sentinel提供了SpringCloud Gateway的适配模块,可以提供两种资源维度的限流:route维度:即在Spring配置文件中配置的路由条目,资源名为对应的routeld自定义API维度:用户可以利用Sentinel提供的API来自定义一些API分组