ssm
SSM整合
spring + spring mvc + mybatis
spring :整合型/设计型
spring mvc : 控制层
mybatis:持久层
涉及 的ioc容器:spring mvc+ spring 的容器
关系:父子关系
子容器可以访问父容器的bean,但是父容器不能访问子容器的bean
在ServletContextLinsliner中获取Spring ioc容器
配置名
对应内容
对应容器
spring-mvc.xml
controller,springmvc相关
web容器
spring-service.xml
service,aop,tx相关
root容器
spring-mapper.xml
mapper,datasource,mybatis相关
root容器
配置spring的ioc配置。让DipatcherServelet在初始化时,加载spring ioc的容器作为父容器,ContextLoaderListener会在服务器启动时运行。
三个spring配置文件:
spring-service.xml ...
三角洲改枪码
12345678M14射手步枪-全面战场-6H6B6KS0383RCT51GRAKEAK-12突击步枪-全面战场-6H6B6NS0383RCT51GRAKEM7战斗步枪-全面战场-6H6B3RG0383RCT51GRAKEAUG突击步枪-全面战场-6H6B6TG0383RCT51GRAKEPKM通用机枪-全面战场-6H6B6VC0383RCT51GRAKEM250通用机枪-全面战场-6H6B79G0383RCT51GRAKEM249轻机枪-全面战场-6H6B8040383RCT51GRAKE725双管霰弹枪-全面战场-6H6B68O0383RCT51GRAKE
12345678KC17突击步枪-全面战场-6H6B59K0383RCT51GRAKECAR-15突击步枪-全面战场-6H6B5RO0383RCT51GRAKEK416突击步枪-全面战场-6H6B5VS0383RCT51GRAKEUZI冲锋枪-全面战场-6H6B6180383RCT51GRAKEQCQ171冲锋枪-全面战场-6H6B6380383RCT51GRAKEP90冲锋枪-全面战场-6H6B65C0383RCT51GRAK ...
事务的四大特性
概述
数据库中的事务有四大特性(ACID),分别是原子性、一致性、隔离性和持久性。针对隔离性,还有四个隔离级别,分别是串行化、可重复读、读已提交和读未提交。这四个隔离级别是针对并发事务中存在的三个问题,分别是脏读、不可重复读和幻读。
事务的四大特性
原子性(Atomicity)
事务包含的所有数据库操作要么全部成功,要不全部失败回滚。
一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。一致性规定事务提交前后只存在两个状态,提交前的状态和提交后的状态,绝对不会出现中间的状态。最典型的例子就是银行转账,A和B之间互相转账,账面加起来总和5000元,无论A和B之间怎么转,转几次,成功与否,事务结束后A和B账面总和还是5000元。
隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要 ...
代理模式
代理模式
功能增强:在原有的功能上,增加了额外的功能,
控制访问:代理类不让你访问目标对象,只能通过代理对象来控制目标对象。
使用代理对象包装目标对象,每次访问目标对象时,都通过代理对象来访问。
代理对象就可以控制目标对象实现功能的过程,并且在其中添加额外的功能.
两个一致:
代理对象和目标对象 功能一致 :代理对象和目标对象实现相同的接口
结果一致 : 代理对象实现功能的过程,就是目标对象实现功能的过程。
静态代理
代理类是自己手动实现的,
目标类是确定好的。
核心功能前
核心功能后
catch中
finally中
动态代理
1. JDK动态代理 (Interface Proxy)
JDK动态代理主要依赖于java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。JDK动态代理适用于那些实现了接口的类。
实现原理:
利用反射机制在运行时动态地创建一个实现了给定接口列表的新类。
这个新类将代理原始的对象,并且所有的方法调用都将被转发到一个实现了InvocationHandler接口的实 ...
分布式链路追踪技术Zipkin+Micrometer Tracing
分布式链路追踪技术Zipkin+Micrometer Tracing
zipkin介绍
Zipkin 分布式跟踪系统就能非常好地解决该问题,主要解决以下3点问题:
1.动态展示服务的链路;
2.分析服务链路的瓶颈并对其进行调优;
3.快速进行服务链路的故障发现。
zipkin架构
ZipKin 可以分为两部分:
ZipKin Server :用来作为数据的采集存储、数据分析与展示;
ZipKin Client :基于不同的语言及框架封装的一些列客户端工具,这些工具完成了追踪数据的生成与上报功能。
Instrumented client和server是分别使用了ZipKin Client的服务,Zipkin Client会根据配置将追踪数据发送到Zipkin Server中进行数据存储、分析和展示。
zipkin服务端
Zipkin (服务端)包含四个组件,分别是 collector、storage、search、web UI。
1) collector 信息收集器: collector 接受或者收集各个应用传输的数据。
2) storage 存储组件: zipkin 默认直接将 ...
声明式事务
声明式事务
编程式事务:需要手动去实现事务的功能呢
声明式事务:只需要声明事务,具体的功能由框架完成。
事务特性:
原子性:事务被视为一个不可分割的单位,事务中的操作要么都执行,要么都不执行
一致性:事务将数据库从一个一致性转换到另外一个一致性状态
隔离性:多个并发执行的事务不会干扰,
隔离级别:
读未提交 (Read Uncommitted):提供了最低的隔离级别,可能导致脏读、不可重复读和幻读。
读已提交 (Read Committed):防止脏读,但仍然可能遇到不可重复读和幻读。
可重复读 (Repeatable Read):防止脏读和不可重复读,但仍然可能发生幻读。==对正在操作的数据加锁。==
序列化 (Serializable):防止所有并发问题,但可能会引起较高的锁定开销。==对表加锁==
脏读:读到了未提交的数据
不可重复读:只能读到已经提交的数据,读两次的数据可能不一样
幻读:对没有加锁的数据进行操作,当其他事务操作了之后,可能两次读到数据不一样。
持久性:
一旦事务被提交,它对数据库所做的更改就是永久性的,并且不能因为任何系统故障而 ...
分布式锁
分布式锁
分布式锁主流的实现方案:
基于数据库实现分布式锁
基于缓存( Redis等)
基于Zookeeper
每一种分布式锁解决方案都有各自的优缺点:
性能:Redis最高
可靠性:zookeeper最高
因为Redis具备高性能、高可用、高并发的特性,这里,我们就基于Redis实现分布式锁。
分布式锁的关键是多进程共享的内存标记(锁),因此只要我们在Redis中放置一个这样的标记(数据)就可以了。不过在实现过程中,不要忘了我们需要实现下列目标:
多进程可见:多进程可见,否则就无法实现分布式效果
避免死锁:死锁的情况有很多,我们要思考各种异常导致死锁的情况,保证锁可以被释放
排它:同一时刻,只能有一个进程获得锁
高可用:避免锁服务宕机或处理好宕机的补救措施(redis集群架构:1.主从复制 2.哨兵 3.cluster集群)
分布式锁使用的逻辑如下:
1234567891011尝试获取锁 成功:执行业务代码 执行业务 try{ 获取锁 业务代码-宕机 } catch(){ }finally ...
布隆过滤器
BloomFilter【布隆过滤器】
简介
概述:布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上由一个很长的二进制向量(二进制数组)和一系列随机映射函数(hash函数)。
作用:布隆过滤器可以用于检索一个元素是否在一个集合中。
添加元素:将商品的id(id1)存储到布隆过滤器
假设当前的布隆过滤器中提供了三个hash函数,此时就使用三个hash函数对id1进行哈希运算,运算结果分别为:2、5、10那么就会数组中对应的位置数据更改为1。
判断数据是否存在:使用相同的hash函数对数据进行哈希运算,得到哈希值。然后判断该哈希值所对应的数组位置是否都为1,如果不都是1则说明该数据肯定不存在。如果都是1说明该数据可能存在,因为哈希运算可能就会存在重复的情况。如下图所示:
假设添加完id1和id2数据以后,布隆过滤器中数据的存储方式如上图所示,那么此时要判断id3对应的数据在布隆过滤器中是否存在,按照上述的判断规则应该是存在,但是id3这个数据在布隆过滤器中压根就不存在,这种情况就属于误判。
误判率:数组越小误判率就越大,数组越大误判率就越小,但是同时带来了更多的 ...
微服务监控技术
微服务监控技术
SpringBoot Actuator的具体使用
在被监控的微服务导入依赖
12345<!-- SpringBoot Actuator --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency>
配置application.yml文件
12345678910management: endpoints: web: exposure: include: '*' #暴露所有的端点 base-path: /boot #监控actuator的名称,默认是actuator,这里改为了boot endpoint: health: show-details: always #查看健康状态的详细信息
启动微服务后访问
启动后访问`ht ...
异步编排
异步编排
异步:多线程
编排:执行顺序
CompletableFuture是jdk8的新特性,主要是用于异步调用,内部封装了线程池,也支持自定义线程池,可以将请求或者处理过程,进行异步处理。
异步执行一个任务时,我们一般是使用自定义的线程池Executor去创建执行的。如果不需要有返回值, 任务实现Runnable接口;如果需要有返回值,任务实现Callable接口,调用Executor的submit方法,再使用Future获取即可。如果多个线程存在前后依赖的话,我们怎么处理呢?其实可用CompeletableFuture。
CompeletableFuture对前后有依赖顸的异步任务的调用有点类似于前面我们学过的axios的回调函数,所以也称之为异步编排技术。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475761.CompletableFuture: ...
