Spring框架之AOP与事务管理
Spring框架之AOP与事务管理今日目标
理解并掌握AOP相关概念
能够说出AOP的工作流程
能运用AOP相关知识完成对应的案例编写
重点掌握Spring的声明式事务管理
1,AOP简介前面我们在介绍Spring的时候说过,Spring有两个核心的概念,一个是IOC/DI,一个是AOP。
前面已经对IOC/DI进行了系统的学习,接下来要学习它的另一个核心内容,就是==AOP==。
对于AOP,我们前面提过一句话是:==AOP是在不改原有代码的前提下对其进行增强。==
对于下面的内容,我们主要就是围绕着这一句话进行展开学习,主要学习两方面内容AOP核心概念,AOP作用:
1.1 什么是AOP?
AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。
OOP(Object Oriented Programming)面向对象编程
我们都知道OOP是一种编程思想,那么AOP也是一种编程思想,编程思想主要的内容就是指导程序员该如何编写程 ...
Spring框架之第三方bean与注解开发
Spring框架之第三方bean与注解开发今日目标
掌握IOC/DI配置管理第三方bean
掌握IOC/DI的注解开发
掌握IOC/DI注解管理第三方bean
完成Spring与Mybatis及Junit的整合开发
1,IOC/DI配置管理第三方bean前面所讲的知识点都是基于我们自己写的类,现在如果有需求让我们去管理第三方jar包中的类,该如何管理?
1.1 案例:数据源对象管理在这一节中,我们将通过一个案例来学习下对于第三方bean该如何进行配置管理。
以后我们会用到很多第三方的bean,本次案例将使用咱们前面提到过的数据源Druid(德鲁伊)和C3P0来配置学习下。
1.1.1 环境准备学习之前,先来准备下案例环境:
创建一个Maven项目
pom.xml添加依赖
1234567<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId> ...
Spring框架之IOC与DI
Spring框架之IOC与DI今日目标
掌握Spring相关概念
完成IOC/DI的入门案例编写
掌握IOC的相关配置与使用
掌握DI的相关配置与使用
1,课程介绍对于一门新技术,我们需要从为什么要学、学什么以及怎么学这三个方向入手来学习。那对于Spring来说:
1.1 为什么要学?
随着时代发展,软件规模与功能都呈几何式增长,开发难度也在不断递增,该如何解决?
Spring可以简化开发,降低企业级开发的复杂性,使开发变得更简单快捷
为了解决项目中特定的问题,会引入对应的框架。如何简化各种框架接入的过程?
Spring可以框架整合,高效整合其他技术,提高企业级应用开发与运行效率
综上所述,Spring是一款非常优秀而且功能强大的框架,不仅要学,而且还要学好。
1.2 学什么?从上面的介绍中,我们可以看到Spring框架主要的优势是在简化开发和框架整合上,至于如何实现就是咱们要学习Spring框架的主要内容:
Spring框架中提供了两个大的核心技术,分别是:
IOC
AOP
Spring的简化操作和框架整合都是基于这两块内容,所以这也是Spring学 ...
微服务常用组件ES-下
微服务常用组件ES-下
在昨天的学习中,我们已经导入了大量数据到 elasticsearch 中,实现了商品数据的存储。不过查询商品数据时依然采用的是根据 id 查询,而非模糊搜索。
所以今天,我们来研究下 elasticsearch 的数据搜索功能。Elasticsearch 提供了基于 JSON 的 DSL(Domain Specific Language)语句来定义查询条件,其 JavaAPI 就是在组织 DSL 条件。
因此,我们先学习 DSL 的查询语法,然后再基于 DSL 来对照学习 JavaAPI,就会事半功倍。
1.DSL 查询Elasticsearch 的查询可以分为两大类:
叶子查询(Leaf queryclauses):一般是在特定的字段里查询特定值,属于简单查询,很少单独使用。
复合查询(Compound query clauses):以逻辑方式组合多个叶子查询或者更改叶子查询的行为方式。
1.1.快速入门我们依然在 Kibana 的 DevTools 中学习查询的 DSL 语法。首先来看查询的语法结构:
12345678GET /{索引库名 ...
Redis入门到实战_02_实战篇
实战篇Redis开篇导读亲爱的小伙伴们大家好,马上咱们就开始实战篇的内容了,相信通过本章的学习,小伙伴们就能理解各种redis的使用啦,接下来咱们来一起看看实战篇我们要学习一些什么样的内容
短信登录
这一块我们会使用redis共享session来实现
商户查询缓存
通过本章节,我们会理解缓存击穿,缓存穿透,缓存雪崩等问题,让小伙伴的对于这些概念的理解不仅仅是停留在概念上,更是能在代码中看到对应的内容
优惠卷秒杀
通过本章节,我们可以学会Redis的计数器功能, 结合Lua完成高性能的redis操作,同时学会Redis分布式锁的原理,包括Redis的三种消息队列
附近的商户
我们利用Redis的GEOHash来完成对于地理坐标的操作
UV统计
主要是使用Redis来完成统计功能
用户签到
使用Redis的BitMap数据统计功能
好友关注
基于Set集合的关注、取消关注,共同关注等等功能,这一块知识咱们之前就讲过,这次我们在项目中来使用一下
打人探店
基于List来完成点赞列表的操作,同时基于SortedSet来完成点赞的排行榜功能
以上这些内容咱们统统都 ...
微服务常用组件ES-上
微服务常用组件ES-上
B 站对应视频:https://www.bilibili.com/video/BV1S142197x7/
黑马商城作为一个电商项目,商品的搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的,存在很多问题。
首先,查询效率较低。
由于数据库模糊查询不走索引,在数据量较大的时候,查询性能很差。黑马商城的商品表中仅仅有不到 9 万条数据,基于数据库查询时,搜索接口的表现如图:
改为基于搜索引擎后,查询表现如下:
需要注意的是,数据库模糊查询随着表数据量的增多,查询性能的下降会非常明显,而搜索引擎的性能则不会随着数据增多而下降太多。目前仅 10 万不到的数据量差距就如此明显,如果数据量达到百万、千万、甚至上亿级别,这个性能差距会非常夸张。
其次,功能单一
数据库的模糊搜索功能单一,匹配条件非常苛刻,必须恰好包含用户搜索的关键字。而在搜索引擎中,用户输入出现个别错字,或者用拼音搜索、同义词搜索都能正确匹配到数据。
综上,在面临海量数据的搜索,或者有一些复杂搜索需求的时候,推荐使用专门的搜索引擎来实现搜索功能。
目前全球的搜索引擎技术排名如下: ...
微服务常用组件MQ-下
微服务常用组件MQ-下
在昨天的练习作业中,我们改造了余额支付功能,在支付成功后利用 RabbitMQ 通知交易服务,更新业务订单状态为已支付。
但是大家思考一下,如果这里 MQ 通知失败,支付服务中支付流水显示支付成功,而交易服务中的订单状态却显示未支付,数据出现了不一致。
此时前端发送请求查询支付状态时,肯定是查询交易服务状态,会发现业务订单未支付,而用户自己知道已经支付成功,这就导致用户体验不一致。
因此,这里我们必须尽可能确保 MQ 消息的可靠性,即:消息应该至少被消费者处理 1 次
那么问题来了:
我们该如何确保MQ消息的可靠性?
如果真的发送失败,有没有其它的兜底方案?
这些问题,在今天的学习中都会找到答案。
1.发送者的可靠性首先,我们一起分析一下消息丢失的可能性有哪些。
消息从发送者发送消息,到消费者处理消息,需要经过的流程是这样的:
消息从生产者到消费者的每一步都可能导致消息丢失:
发送消息时丢失:
生产者发送消息时连接 MQ 失败
生产者发送消息到达 MQ 后未找到 Exchange
生产者发送消息到达 MQ 的 Exchange 后,未找到合适的 Queu ...
微服务常用组件MQ-上
微服务常用组件MQ-上
对应 B 站视频:
微服务一旦拆分,必然涉及到服务之间的相互调用,目前我们服务之间调用采用的都是基于 OpenFeign 的调用。这种调用中,调用者发起请求后需要等待服务提供者执行业务返回结果后,才能继续执行后面的业务。也就是说调用者在调用过程中处于阻塞状态,因此我们成这种调用方式为同步调用,也可以叫同步通讯。但在很多场景下,我们可能需要采用异步通讯的方式,为什么呢?
我们先来看看什么是同步通讯和异步通讯。如图:
解读:
同步通讯:就如同打视频电话,双方的交互都是实时的。因此同一时刻你只能跟一个人打视频电话。
异步通讯:就如同发微信聊天,双方的交互不是实时的,你不需要立刻给对方回应。因此你可以多线操作,同时跟多人聊天。
两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发微信可以同时与多个人收发微信,但是往往响应会有延迟。
所以,如果我们的业务需要实时得到服务提供方的响应,则应该选择同步通讯(同步调用)。而如果我们追求更高的效率,并且不需要实时响应,则应该选择异步通讯(异步调用)。
同步调用的方式我们已经学过了,之前的 OpenFei ...
微服务入门与基本组件的使用-下
服务保护和分布式事务
在微服务远程调用的过程中,还存在几个问题需要解决。
首先是业务健壮性问题:
例如在之前的查询购物车列表业务中,购物车服务需要查询最新的商品信息,与购物车数据做对比,提醒用户。大家设想一下,如果商品服务查询时发生故障,查询购物车列表在调用商品服 务时,是不是也会异常?从而导致购物车查询失败。但从业务角度来说,为了提升用户体验,即便是商品查询失败,购物车列表也应该正确展示出来,哪怕是不包含最新的商品信息。
还有级联****失败问题:
还是查询购物车的业务,假如商品服务业务并发较高,占用过多 Tomcat 连接。可能会导致商品服务的所有接口响应时间增加,延迟变高,甚至是长时间阻塞直至查询失败。
此时查询购物车业务需要查询并等待商品查询结果,从而导致查询购物车列表业务的响应时间也变长,甚至也阻塞直至无法访问。而此时如果查询购物车的请求较多,可能导致购物车服务的 Tomcat 连接占用较多,所有接口的响应时间都会增加,整个服务性能很差, 甚至不可用。
依次类推,整个微服务群中与购物车服务、商品服务等有调用关系的服务可能都会出现问题,最终导致整个集群不可用。
这就是级联*** ...
Redis入门到实战_01_快速入门
基础篇Redis开篇导读理想课程
小伙伴们理想的课程一定是能够通过讲解的方式,得到如下这些启发,我们的课程会从基础到精通,从redis小白,到redis大牛,还在等什么,这套课程一定就是你最适合你的课程~
1.Redis简单介绍Redis是一种键值型的NoSql数据库,这里有两个关键字:
键值型
NoSql
其中键值型,是指Redis中存储的数据都是以key.value对的形式存储,而value的形式多种多样,可以是字符串.数值.甚至json:
而NoSql则是相对于传统关系型数据库而言,有很大差异的一种数据库。
对于存储的数据,没有类似Mysql那么严格的约束,比如唯一性,是否可以为null等等,所以我们把这种松散结构的数据库,称之为NoSQL数据库。
3.初始Redis3.1.认识NoSQLNoSql可以翻译做Not Only Sql(不仅仅是SQL),或者是No Sql(非Sql的)数据库。是相对于传统关系型数据库而言,有很大差异的一种特殊的数据库,因此也称之为非关系型数据库。
3.1.1.结构化与非结构化传统关系型数据库是结构化数据,每一张表都有严格的约束信息:字段名. ...
