yf框架
2021-02-22 15:59:57 126 举报
AI智能生成
yf
作者其他创作
大纲/内容
spring
容器
IOC
Spring IOC负责创建对象、管理对象(通过依赖注入)、整合对象、配置对象以及管理这些对象的生命周期。
容器先行创建
aware
beanNameAware
applicationAware
ApplicationEventPublisherAware<br>
BeanPostProcessor<br>
SmartInstantiationAwareBeanPostProcessor
DestructionAwareBeanPostProcessor <br>
MergedBeanDefinitionPostProcessor
InstantiationAwareBeanPostProcessor
dubbo的referencebean实现了applicationContextAware接口,
dubbo的referencebean实现了自己的接口,并且在bean中完成属性注入,不需要依赖容器管理,自建缓存管理
容器创建过程
prepareRefresh<br>
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
prepareBeanFactory
postProcessBeanFactory<br>
invokeBeanFactoryPostProcessors
registerBeanPostProcessors
initMessageSource()
initApplicationEventMulticaster()
onRefresh();<br>
springboot中会创建web容器,tomcat或者jboss
registerListeners();
finishBeanFactoryInitialization(beanFactory);
完成剩余bean的创建过程
resolveBeforeInstantiation(beanName, mbdToUse)<br>
InstantiationAwareBeanPostProcessor提前执行特有的前置方法
this.populateBean(beanName, mbd, instanceWrapper);
InstantiationAwareBeanPostProcessor增强器的执行
exposedObject = this.initializeBean(beanName, exposedObject, mbd);<br>
增强前置方法
bean.init
initializatingBean
增强后置方法
this.finishRefresh();
会发布容器创建完成事件,dubbo的延迟暴露会在此时进行暴露
bean的消亡
实现接口
注解类
AOP
日志
邮件
javamail
spring的事务管理
事务传播机制
当前存在事务,则加入该事务,不存在,则创建事务, controller和service层
当前存在事务,则加入该事务,不存在,则以非事务方式运行
当前存在事务,则加入该事务,否则抛出异常
重新创建一个新的事务,如果当前存在事务,延缓当前的事务
以非事务的方式运行,如果当前存在事务,暂停当前的事务。
以非事务的方式运行,如果当前存在事务,则抛出异常。
如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。
aop的原理
编译时代理 load time weave
动态字节码技术
ClassFileTransformer接口
Instrumentation接口
运行时代理
动态代理
运行时创建代理类,进行方法增强
构造方法如何增强
spring aop
实现
@EnableAspectJAutoProxy
AspectJAutoProxyRegistrar
收集代理bean的bean定义
调用
methodinvocation
proceed
MethodInterceptor
invoke(methodinvocation)
代码复用
优点
解耦合
使系统容易扩展
Springmvc
MVC 经典三层架构模型,java代码实现
controller
handlerMapping
HandlerAdapter
handler<br>
ViewResolver
解析modelAndView对象,返回view
DispatcherServlet
ModelAndView
拦截器和过滤器
HandlerInterceptor
cors
MappedInterceptor,springmvc@requestMapping注解<br>
boot
自动配置--约定大于配置
注解
@configuration
声明一个配置类,配合@Bean在方法上使用,使方法的返回值成为一个bean
子主题
@import
参数是一个class文件数组,对数组的元素也在容器中创建一个bean
@Condition
条件化加载
@ImportResource
@SpringbootApplication
@SpringBootConfiguration
@configuration
声明是一个配置类
@componentScan
指定扫描包
@EnabledAutoConfiguration<br>
@Import({AutoConfigurationImportSelector.class})<br>
利用该组件去批量注册依赖配置类,这就是自动注册机制
原理是利用bean容器初始化时,创建beanfactorypoccessor
微服务的概念
传统服务
优点
开发简单直接,集中式管理<br>基本不会重复开发<br>功能都在本地,没有分布式的管理开销和调用开销<br>
缺点
开发效率低:所有的开发在一个项目改代码,递交代码相互等待, 代码冲突不断代码维护难:代码功能耦合在一起,新人不知道何从下手部署不灵活:构建时间长,任何小修改必须重新构建整个项目,这个过程往往很长稳定性不高:一个微不足道的小问题,可以导致整个应用挂掉扩展性不够:无法满足高并发情况下的业务需求<br>
微服务
优点
开发效率高,将单一模块划分为一组模块,更容易维护与管理
其次,这种体系结构使得每个服务都可以由专注于此服务的团队独立开发。只要符合服务API契约,开发人员可以自由选择开发技术。这就意味着开发人员可以采用新技术编写或重构服务,由于服务相对较小,所以这并不会对整体应用造成太大影响。<br>
微服务架构可以使每个微服务独立部署。开发人员无需协调对服务升级或更改的部署。这些更改可以在测试通过后立即部署。所以微服务架构也使得CI/CD成为可能。
缺点
服务划分问题,微服务的目标是充分分解应用程序,以促进敏捷开发和持续集成部署。
微服务的分布式特点带来的复杂性。开发人员需要基于RPC或者消息实现微服务之间的调用和通信,而这就使得服务之间的发现、服务调用链的跟踪和质量问题变得的相当棘手。
是分区的数据库体系和分布式事务。更新多个业务实体的业务交易相当普遍。这些类型的事务在单体应用中实现非常简单,因为单体应用往往只存在一个数据库。但在微服务架构下,不同服务可能拥有不同的数据库。CAP原理的约束,使得我们不得不放弃传统的强一致性,而转而追求最终一致性,这个对开发人员来说是一个挑战<br>
中台系统
基础功能角度 , 每个烟囱越建越高,但是对于部分基础的功能,比如用户,权限,菜单,鉴权,交互,中间件等功能重复构造和维护,烟囱式系统之间的交互与集成,因此,用来构造共享服务架构的建设。
为什么
共性业务的无需重复投资建设,建设成本和维护成本降低;
可以快速进行服务能力迭代,高效支撑前端业务变化;<br>
中台还可以解决 数据分散的问题
分类<br>
业务中台
数据中台
分布式系统
分布式事务
最终一致性
最大努力通知其实只是表明了一种柔性事务的思想
比如发送短信
消息事务
rocketMq中的消息事务,主要还是通过写入消息的回调来确认该消息能否被消费,利用消息队列的解耦合来执行。
本地消息列表
通过本地数据库来记录当前是否执行成功,定时任务进行失败之后的重试,确保最终一致性<br>
强一致性
2PC 强一致性的解决方案,阻塞请求
一阶段执行业务
二阶段提交事务
3PC
3PC 的引入是为了解决提交阶段 2PC 协调者和某参与者都挂了之后新选举的协调者不知道当前应该提交还是回滚的问题
补偿性事务
TCC
2PC 和 3PC 都是数据库层面的,而 TCC 是业务层面的分布式事务
try---confirm---cancel
每个业务的开发都涉及到三个点。还需要引入一个事务管理器
分布式锁
基于中间件去实现,redis setnx 指令
zookeeper 临时有序节点
dubbo
远程通讯
协议支持
dubbo
Rmi协议
Hessian协议
HTTP协议
nio支持
netty
mina
序列化
二进制序列化
Hessian 默认的序列化方式
java
文本序列化
Json Serialization
SOAP 文本序列化
集群容错<br>
容错
failover
失败自动重试 retries="2" 重试俩次
failfast
失败就返回异常,用于非幂等操作,比如新增记录
failsafe
失败直接忽略,写日志时
forking
有一条成功就可以
Failback Cluster
必须成功,失败后定时重发
Broadcast
必须全部成功才行
负载均衡
服务降级
mock=force:return+null
mock=fail:return+null
服务自动发现<br>
核心
服务暴露
dubbo将服务包装成一个serviceBean,通过spring容器进行管理
服务引用
referenceBean实现了FactoryBean接口,
服务调用
消费者
提供者
内置容器
Spring <br>
JETTY
LOG4J<br>
原理
1 business 业务层,用户如何使用,<br>
service, 服务代码
接口 interface
refer, 引用
2 RPC
config
referencebean
服务消费
servicebean
服务暴露
proxy
register<br>
生产者会将服务推送到注册中心,消费者也会从注册中心拉取数据,本地缓存
cluster 容错与集群策略
directory,从注册中心拉取的可以调用的服务<br>
路由 route,通过脚本对directory 提供的list<invoker> 进行筛选
balance 负载均衡方式,通过负载均衡决定最终的调用者
监控中心 minotor
对服务监控
协议 protocol <br>
服务的暴露
依赖spring容器的启动过程
1 加载bean定义,和beandefineparser,解析XML标签
2 根据标签,加载对应的bean定义,然后创建对应的bean,如protocol,register,monitor,provider,consumer等标签
3 servicebean实现了InitializingBean接口,在接口方法里,完成serviceBean的检查与封装如provider,application,register,monitor,protocol,<br>
4 serviceBean 实现了springEvent接口,实现延迟暴露过程
5 由协议对象去暴露,doExport--doExportUrls,多协议暴露<br>
6 完成初始值设置后,proxyFactory(spi机制),和基于接口的javassist动态代理技术生成代理类<br>
SPI机制获取的类
proxyFactory
protocol dubboprotocol
负载均衡类 balance
7 封装invoker对象后打开服务器,openServer(URL) url= 协议+ip+端口+类全路径
8 注册到服务器然后本地进行缓存,ProviderCusumerRegTable 中缓存 providerinvoker<br>
服务的引入
1 加载bean定义,和beandefineparser,解析XML标签
2 根据标签,加载对应的bean定义,然后创建对应的bean,如protocol,register,monitor,provider,consumer等标签
3 referenceBean实现了FactoryBean接口,在接口方法里,完成对象的获取getObject
4 refenrenceBean完成了对属性consumer,application,register,monitor,protool的检查与封装
5 由协议protocol对象去执行doRefer方法<br>
6 在directory中,订阅服务中心中提供的服务,然后dubboProtocol执行远程引用的过程
7 依旧是初始化一个nettyClient,然后封装为一个invoker
8 注册到服务器然后本地进行缓存,ProviderCusumerRegTable 中缓存 Consumerinvoker<br>
服务调用过程
1 注入的代理类 proxy
2 filter mockFilter 、local、cache
mock 本地伪装,调用失败后如何返回
cache 缓存
3 clusterInvoker 容错机制
4 balance 负载均衡策略
5 filter context、count、limit、monitor等<br>
6 协议调用, protocol,dubbo、rmi、hessiom<br>
7 传输 transporter 、 netty/mina
3 remoting
远程通讯
nio支持
netty
mina
协议支持
dubbo
Rmi协议
Hessian协议
序列化
Hessian
dubbo
java
Json Serialization
mybatis
接口层
sqlSession
SqlSessionFactory 的构造方法要求传入configuration
核心处理层
配置解析 解析mybatis配置文件,对全局进行封装
configuration类
configuration创建,依次解析mybatis-xml配置文件,数据源,最终加载成为configuration对象
typeAliasRegistry 中依次注册事务,数据源工厂,日志,缓存,数据库驱动及供应商信息,动态代理创建等
typeAliasRegistry 中注册sql解析器
缓存
事务
mapper
接口方法可以重载吗
xml中#和$的区别
#代表占位符,sql解析之后会把他解析成?,调用PreparedStatement的set方法来赋值
$会直接替换为参数,不能防止sql注入,引发安全问题
mapper最终经过解析后存放在configuration对象中
SQL解析与执行
sql执行组件
Executor 负责一级缓存,二级缓存,事务回滚等<br>
<span style="font-size: inherit;">BaseExeutor+cacheExecutor</span><br>
simpleExecutor 默认执行器,statement对象用完就删<br>
ReuseExecutor 可重用执行器,具体指statement对象<br>
BatchExecutor 批量提交sql的执行器,比如要插入1000条数据,
为什么是1000,,因为数据库的sql长度有限制
开启一个事务,然后将1000条语句,拼接成一个sql去执行,
ParameterHandler 负责参数解析<br>
PrepareStatement 参数解析时使用<br>
StatementHandler 负责statement和prepareStatement创建
BaseStatementHandler
SimpleStatementHandler 简单不带动态参数的sql的执行<br>
PrepareStatementHandler 带动态参数和占位符的sql执行
CallableStatementHandler 存储过程的执行
RoutingStatementHandler 根据条件决定使用那种语句处理器<br>
ResultSetHandler 执行结果处理器
DefaultResultSetHandler 处理 Statement 返回的结果,
插件管理
缓存部分
一级缓存
在同一个sqlsession对象里的缓存,和sqlsession生命周期有关
基于executor中的perpendcache完成,每次更新都会清空缓存<br>
二级缓存
以mapper对象的namespace空间为作用域的缓存,有一个transactioncachemanager管理全部的缓存,每个sqlsession提交之后对tcm进行刷新。
数据库连接池
druid 推荐使用
DBCP
C3P0
基础支持层
数据源配置
反射
类型转换
日志
0 条评论
下一页