一、SpringBoot是spring开源组织下的子项目,是spring组件一站式解决方案,主要是简化了使用spring的难度,节省了繁重的配置,提供了各种启动器,开发者能快速上手。
1.SpringBoot的优点:
(1)独立运行(springboot内嵌了各种servlet容器,tomcat、jetty等,不需要打成war包部署到容器中,只需要打成一个可执行的jar包就能独立运行,所以依赖包都在一个jar包内)
(2)简化配置(spring-boot-starter-web启动器自动依赖其他组件,减少了maven配置)
(3)自动配置(springboot能根据当前路径下的类,jar包来自动配置Bean,如添加一个spring-boot-starter-web启动器就能拥有web的功能,无需其他配置)
(4)无代码生成和xml配置(springboot配置过程中无代码生成,也无需xml配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的)
(5)应用监控(springboot提供一系列端点可以监控服务及应用)
2.SpringBoot使用优点:
开箱即用和约定优于配置,开箱即用是指在开发过程中,通过在maven项目中的pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的xml配置文件以管理对象的生命周期。约定优于配置,是一种由springboot本身来配置目标结构,由开发者在结构中添加信息的软件设计范式,减少了开发人员需要作出决定的数量,同时减少了大量的XML配置,并且可以将代码编译、测试和打包等工作自动化。
3.SpringBoot配置文件的两种格式:
(1)properties
eg:app.user.name=Javastack
(2)yml
eg:app:
user:
name:javastack
主要区别是书写格式不同,yml格式不支持@PropertySource注解导入配置
4.SpringBoot的启动入口:
Spring Boot应用的启动入口是@SpringBootApplication注解标注类中的main()方法, @SpringBootApplication能够扫描Spring组件并自动配置Spring Boot
5.SpringBoot中常用注解:
(1)引导类的@SpringBootApplication
(2)@Controller处理http请求
(3)@RestController返回json
(4)RequestsMapping配置url映射
(5)ConfigurationProperties(prefix=“配置文件中的key的前缀”)可以将配置文件中的配置自动与实体进行映射
(6)@Autowired
二、Dubbo是微服务开发框架,提供了RPC通信与微服务治理两大关键能力,可实现服务发现、负载均衡、流量调度等服务治理诉求,dubbo是高度可扩展的。
1.Dubbo能做什么?
(1)透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需要简单配置,没有任何API侵入。
(2)软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
(3)服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可
2.Dubbo的架构
(1)dubbo架构图如下所示:
(2)节点角色说明:
provider:暴露服务的服务提供方
consumer:调用远程服务的服务消费方
Registry:服务注册与发现的注册中心
Monitor:统计服务的调用次数和调用时间的监控中心
Container:服务运行容器
角色分明,可以根据每个节点角色的状态来确定该服务是否正常
(3)调用关系说明:
0服务容器负责启动,加载,运行服务提供者
1服务提供者在启动时,向注册中心注册自己提供的服务
2服务消费者在启动时, 向注册中心订阅自己所需的服务
3注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
4服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
(4)xml文件配置
在资源包下新建xml文件,配置Dubbo的相关信息和服务,在消费端配置差异不大
(5)注解
在实现serviceImpl类上加的service注解为Dubbo的注解,不能使用SpringBoot中的注解,并要设置服务名称;然后在消费端引入使用interface注解,注明服务来源和服务名称,此外也需要在springBoot的配置文件中进行配置
三、Redis是一款内存高速缓存数据库,Redis是一个开源的,支持网络,可基于内存也可持久化的日志型,key-value数据库,并且提供多种语言的API。
1.Redis的五种类型:
字符串,列表,哈希,集合,有序集合。
2.优点:
性能极高,数据类型丰富,所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行
3.缺点:
持久化,Redis直接将数据存储到内存中,可通过两种方式持久化:定时快照和基于语句的追加。Snapshot方法是指每隔一段时间,将整个数据库的数据写到磁盘上,每次都是写全部数据,代价非常高;而AOF方法只追踪变化的数据,这类似于mysql的binlog方法,但追加log可能过大,同时所有操作均需要重新执行一遍,恢复速度缓慢; 耗内存:尽管Redis对一些数据结构采用了压缩算法存储,但是占用内存量还是很高。
4.特点:
大多数语言都支持Redis,因为Redis交换数据快,所以在服务器中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。Redis支持丰富的数据类型,将热点数据存到Redis(内存)中,要用的时候,直接从内存取,极大的提高了速度和节约了服务器的开销。
5.特性:
(1)持久化(Redis需要经常将内存中的数据同步到磁盘来保证持久化)
持久化的两种方式:
1、Snapshotting(快照),是默认的持久化方式,这种方式就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb,可以通过配置设置自动做快照持久化的方式,我们可以配置Redis在n秒内如果超过m个key被修改就自动做快照。
快照:快照是存储系统中的一种数据保护技术,主要是实现数据的逻辑保护。所谓逻辑保护,就是当数据出现误删除或者病毒等原因导致数据破坏的情况,通过快照技术,可以将数据恢复到某一个时间点的数据。对于存储中的快照技术也是类似,在某个时间点,你给某个磁盘(或者存储中的LUN)打一个快照,相当于让存储系统给这个磁盘拍了一个照片,当之后的使用过程中发生了意外,比如病毒把数据搞坏了等等,这个时候就可以通过快照知道原来的数据是什么样的,从而找回原来的数据
2、Append-only file(缩写aof)的方式
aof比快照方式有更好的持久化性,是由于在使用aof持久化方式时,Redis会将每一个收到的写命令都通过write函数追加到文件中(默认是appendonly.aof)。当Redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容,当然由于OS会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改,但我们可以通过配置文件告诉Redis我们想要通过fsync函数强制OS写入到磁盘的时机。
(2)主从复制
Redis支持主从复制,而且配置比较简单,主从复制实现了数据的备份,冗余,以构建高可用的系统。当master不能正常工作时,可以把slave切换成master
(3)发布订阅
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。pub/sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理部署上的耦合。Redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向Redis server订阅自己感兴趣的消息类型,Redis将消息类型称为通道(channel)。当发布者通过publish命令向Redis server发送特定类型的消息时。订阅该消息类型的全部client都会收到此消息,这里消息的传递是多对多的。一个client可以订阅多个channel,也可以向多个channel发送消息。
(4)事务
Redis通过MULTI、DISCARD、EXEC和WATCH四个命令来实现事务功能,对事务的支持目前还比较简单,Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。由于Redis是单线程来处理所有client的请求的,一般情况下Redis在接受到一个client发来的命令会立即处理并返回处理结果,但是当一个client在一个连接中发出multi命令,这个连接会进入一个事务上下文,该连续后续的命令并不是立即执行,而是先放到一个队列中。当从此连接受到exec命令后,Redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client,然后此连接就结束事务上下文
四、Hibernate属于持久层的ORM框架,对jdbc进行了轻量级封装,可以自动生成SQL语句,自动执行,完成与数据库的交互操作,在Dao层去使用。
ORM(对象关系映射):利用描述对象和数据库表之间映射的元数据,自动把java应用程序中的对象,持久化到关系型数据库的表中。通过操作java对象,就可以完成对数据库表的操作,可以把ORM理解为关系型数据和对象的一个纽带。ORM指的是将一个java中的对象与关系型数据库中的表建立一种映射关系,从而操作对象就可以操作数据库中的表。
Hibernate主要用来实现Java对象和表之间的映射,除此之外还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间。Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%,对于以数据为中心的程序来说,它们往往只在数据库中使用存储过程来实现商业逻辑,Hibernate可能不是最好的解决方案,对于那些在基于Java的中间层应用中,它们实现面向对象的业务模型和商业逻辑的应用,Hibernate是最有用的。
一些接口:
1、Configuration接口
负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象
2、SessionFactory接口
负责初始化Hibernate。它充当数据存储源的代理,并负责创建session对象,它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享,它是重量级的,这意味着不能随意创建或销毁它的实例,如果应用只访问一个数据库,只需要创建一个SessionFactory
3、Session接口
负责执行被持久化对象的CRUD操作(CRUD:增读更删)。但需要注意的是Session对象是非线程安全的,因此在设计软件架构的时候,应该避免多个线程共享一个session实例。同时,Hibernate的Session不同于JSP应用中的HttpSession
4、Query和Critical接口
Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式
5、Transaction接口
是Hibernate的数据库事务接口,它对底层的事务接口做了封装,底层事务接口包括:1、jdbc API;2、JTA(Java Transation API);3、CORBA(Common Objecr Request Broker Architecture)API