eziceice / blog

Personal blog for programming
4 stars 2 forks source link

Spring Boot #3

Open eziceice opened 5 years ago

eziceice commented 5 years ago

1. Annotation in Spring IOC

Life cycle of Spring bean

Spring bean的生命周期大致分为Bean的定义,Bean 的初始化,Bean的生存期和Bean的销毁四个部分。

Bean Definition

Conditional

Bean的作用域

Profile

使用@Profile,并且使用环境命令-Dspring.profiles.active=dev可以随意切换配置环境。

引入XML配置Bean

使用@ImportSource就可以将定义好bean的xml装配到ioc容器中

Spring EL

2. Spring AOP

How AOP works in Spring

AOP: Aspect oriented programming (面向切面编程)

约定编程

AOP的概念

AOP开发详解

3. Spring with Database

How to work with Database in Spring

Spring中主流方式是使用Mybatis和Hibernate,目前来看Hibernate全映射框架在互联网时代高性能的要求下逐渐被淘汰,Mybatis逐渐成为主流,Spring的JDBC Template则并不经常使用。

JDBC Template

Spring JPA (Hibernate)

MyBatis

MyBatis支持定制化SQL,存储过程以及高级映射的优秀持久层框架。

4. Spring with Transaction

Manage Transaction

在高并发的场景下,数据库事务便显得尤其重要,尤其是涉及到金钱的情况下,更是不允许出错的。Springboot通过各种注解来支持数据库事务的操作。在Spring的数据库事务中可以使用编程式事务,也可以使用声明式事务,现在在绝大部分的情况下都是使用声明式事务。

Spring声明式事务的使用

@Transcational配置项

@Transcationnal可以放在接口上也可以放在实现类上,推荐放在实现类上,因为该注解是基于AOP的,如果放在接口上意味着无法使用CGLIB的动态代理。

Isolation(事务的隔离级别)

追求更高的隔离级别,它能更好的保持数据的一致性,但是也要付出锁的代价。有了锁,就意味着性能的丢失,而且隔离级别越高,性能就是直线的下降。通常的隔离级别为read commited。不同的数据库对于隔离级别的支持也不一样,Oracle只支持read committed,而MySQL则支持四种。

数据库的ACID

数据库的四个隔离级别:

Propagation(事务的传播行为)

传播行为是方法之间调用事务采取的策略问题。在绝大部分的情况下,我们会认为数据库事务要么全部成功,要么全部失败。然而在某些情况下,我们不应该因为极少数的交易不能完成而回滚批量任务调用的其他交易。因此,如果一些交易发生异常,我们只是回滚那些出现异常的交易。

在Spring中,当一个方法调用另外一个方法时,可以让事务采取不同的策略工作,如新建事务或者挂起当前事务。 常用的Propagation:

NESTED: 当数据库支持保存点技术时(save point), 就启用保存点技术;如果不能支持,就新建一个事务去运行代码,等价于REQUIRES_NEW。NESTED的传播行为和REQUIRES_NEW还是有区别的。NESTED的传播行为会沿用当前事务的隔离级别和锁等特性,而REQUIRES_NEW则可以拥有自己独立的隔离级别和锁等特性。

@Transcationalt一定不可以使用在自调用,此时会失效(同一个类中的方法直接调用)。因为Spring数据库事务实现的原理是AOP,AOP的原理为动态代理,如果调用过程中是类本身的调用而不是代理对象的调用,则就不会有AOP,则Spring就不能把你的代码织入到约定的流程中。

5. Spring and Redis

Spring and Redis

NoSQL现在已经广泛应用,在互联网中起到加速系统的作用。其中有两种NoSQL使用最为广泛,那就是Redis和MongoDB。

Redis是一种运行在内存中的数据,支持7种数据类型的存储。由于其是基于内存的,因此运行速度很快,大约是关系数据库的几倍到几十倍的速度,所以开发中我们会将常用的数据存储到Redis中。

Spring-Jedis (Spring中Redis的驱动)

Redis Transcation

在高并发的场景中,往往我们需要保证数据的一致性,这时考虑使用Redis事务或者利用Redis执行Lua的原子性来达到数据一致性的目的。

Redis Pipline

在默认的情况下,Redis客户端是一条条命令发送给Redis服务器的,这样显然性能不太高。在关系数据库中我们可以使用批量,也就是只有需要执行SQL时,才一次性发送所有的SQL去执行,这样性能就高了很多。通常网络1传输速度的瓶颈会造成Redis性能不佳,然而使用pipline后就可以大幅度的在需要执行很多命令时提升Redis的性能。

Redis Subscription

发布订阅是message的一种常用的模式。通过多个监听器对渠道进行监听(Queue/Topic),来接受渠道内的消息。

Redis Lua Script

在Redis中使用Lua脚本可以提高Redis的计算能力,而且还具备原子性,所以在需要保证数据一致性的高并发环境中,我们也可以使用Redis的Lua脚本来保证数据的一致性。

在Redis中有两种运行Lua脚本的方法:

如果Lua脚本比较长,那么就需要通过网络传递脚本给Redis执行,而现实的情况是网络的传递速度往往跟不上Redis的执行速度,所以网络就成为了Redis执行的瓶颈。如果只是传递32位编码和参数,那么需要传递的消息就少了许多,这样可以极大的减少网络传输的内容,提升性能。

Redis Spring Annotation

6. Spring and MongoDB

MongoDB

由于Redis的计算能力十分有限,MongoDB此时就派上用场了。对于那些需要统计,按条件查询和分析的数据,它提供了支持,它可以说是一个最接近关系数据库的SQL。

MongoDB的目的是为Web应用提供可扩展的高性能数据存储解决方案。

MongoDB Template

7. Spring MVC

Spring MVC

Spring MVC是一个较为松散的组合,展示给用户的视图(View),控制器返回的数据模型(Model),定位试图的解析器(ViewResolver)和处理适配器(HandlerAdapter)等内容都是独立的。

Spring MVC的框架原理

Spring MVC的流程

8. 深入Spring MVC

深入Spring MVC开发

处理器映射

HandlerMapping的主要任务就是将请求定位到具体的Handler上。

获取Controller Parameter

自定义参数转换规则

Validation

Spring MVC支持JSR-303验证规范,在默认情况下SpringBoot会引入关于Hibernate Validator机制来支持JSR-303验证规范。

ModelAndView

Controller是业务逻辑核心内容,而控制器的核心内容之一就是对数据的处理。

ViewResolver和View

View是render数据模型展示给用户的组件,在Spring MVC中又分为logical view和physical view。Logical view需要ViewResolver进行进一步的定位解析。Physical view只需要将数据模型直接渲染出来。

File Upload

9. 构建REST风格网站

REST Web Development

在REST风格中,每一个资源都是对应着一个地址,而一个代表资源网址应该是一个名词,而不存在动词,这代表着对一个资源的操作。

REST简述

REST:Representational State Transfer,如果一个architecture符合REST原则,就成它为REST Architecture。

REST Keyword

Resource-Reprensentation-State Transfer

HTTP Method

Things to avoid in REST

使用Spring MVC开发REST风格End point

RestTemplate

在当今的microserivces中,会将一个大系统拆分为多个microsevices。按照microservices的建议,每个service系统都会暴露REST URL请求给别的微服务系统所调用。为了方便完成系统之间进行互相调用,Spring还给予了RestTemplate,通过它可以很方便的对REST请求进行系统间的调用,完成系统之间的数据集成。

10. Spring Security

Spring Security

对于构建distributed-miscroservices solution,通常security是一个很大的问题。Spring提供了其安全框架Spring Security来解决安全访问控制的问题。

Spring Security Basic和简单Security Authentication

使用WebSecurityConfigurerAdapter自定义

自定义用户服务信息

In-memory security

Jdbc user details security

Restriction on request

Spring EL Expression

HTTPS

Cross-Site Request Forgery - CSRF

CSRF

Remember me

Log out

11. Spring中的其他技术

Spring中的其他技术

Spring中还有一些其他的技术比如异步线程池,JMS Message,Scheduler和WebSocket等。

Async Thread Pool

Message Queue

Schedule Task

Web Socket

WebSocket Protocol是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信,允许服务器主动发送信息给客户端,这样就可以实现从客户端发送消息到服务器,而服务器又可以转发消息到客户端,这样就能够实现客户端之间的交互。

STOMP

并不是所有Browser目前都能够支持WebSocket Protocol,为了使得WebSocket的应用能够兼容那些unsupported browser,可以使用STOMP Protocol。

12. WebFlux

In computing, reactive programming is an asynchronous programming paradigm concerned with data streams and the propagation of change.

WebFlux概述

Spring WebFlux Architecture: WebFlux SpringMVC vs WebFlux: MVCvsWebFlux

WebHandler

WebFlux Client

WebClient

Converter

Database Concurrent Scenario

3 solutions to solve concurrent scenario: Pessimistic Lock, Optimistic Lock and Cache.

Pessimistic Lock

Optimistic Lock

Cache-Redis

13. Deploy/Test and Monitor

Deploy

Hot Deploy

Monitor

eziceice commented 5 years ago

Spring Boot 拾遗