目录
1. 前奏
1.1 回顾spring
spring 是为了解决企业级应用开发的复杂性而创建的。就是为了简化开发
spring的重要组件
1. IOC,依赖注入和控制反转,面向接口事项松耦合
2. AOP切面,进行声明是编程,注解等
3. 通过切面和模板减少代码量
1.2 spring boot 优点
1. 简化spring的开发
2. 默认配置来简化配置,自动转配
3. 内嵌容器,简化web项目
4. 简化配置文件,简化xml配置
2. 架构演变之路
单体-----》rpc----->soA
2.1 单体
特点
1. all in one,所有的业务功能模块都集成在一个项目中。
2. 所有的功能都在一个war或者jar中,在部署和维护时,一起停止,一起启动
3. 一般系统应用和数据库分开部署。(就是说应用和数据库分别在不同的服务器上)
4. 一般通过应用集群和数据库集群来提供性能。(就是说多来几个服务器)
优点:项目架构简单,前期开发成本低,周期短,小型项目的首选
缺点:
1、全部功能集成在一个工程中,对于大型项目不易开发、扩展及维护。
2、系统性能扩展只能通过扩展集群结点,成本高、有瓶颈。
3、技术栈受限。
2.2 垂直架构
特点:
1. 就是在单体架构的基础上,将原来的单体应用拆分成多个互不相关的几个系统应用。
2. 不同的几个系统应用之间进行相互的调用,存在数据耦合的情况
3. 项目之间的接口多为数据同步功能,如:数据库之间的数据库,通过网络接口进行数据库同步。
优点:
-
系统拆分实现了流量分担,解决了并发问题
-
可以针对不同模块进行优化
-
方便水平扩展,负载均衡,容错率提高
-
系统间相互独立
缺点:
-
服务之间相互调用,如果某个服务的端口或者ip地址发生改变,调用的系统得手动改变
-
搭建集群之后,实现负载均衡比较复杂
2.3 分布式架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式调用是关键。
SOA 架构和微服务架构都属于分布式架构,
分布式的思想就是把不同的业务模块,部署在不同的服务器上,以应对高并发的问题;
SOA 是一种分布式架构,把业务系统分成多个子系统,提供不同的服务,再通过服务组合、编排实现业务流程;
微服务是SOA的升华,如果非要说点儿不同的,那么微服务更加强调服务的细分和专业,去ESB总线、去中心化,部署粒度更细,服务扩展更灵活。
2.3.1 soa架构
SOA 面向服务编程
特点:
1. 基于SOA的架构思想将重复公用的功能抽取为组件,以服务的方式给各各系统提供服务。
2. 各各项目(系统)与服务之间采用webservice、rpc等方式进行通信
3. ESB企业服务总线作为项目与服务之间通信的桥梁
优点:
-
将基础服务进行了抽取,系统间相互调用,提高了代码复用和开发效率
-
可以针对不同服务的特点制定集群及优化方案。
-
采用ESB减少系统中的接口耦合。SOA 架构时代有两个很重要技术实现方式:Web Service 和 ESB :前者提供了标准的数据传输协议,后者实现了服务编排和协议转换。
2.3.2 微服务架构
特点:
1. 可以说微服务架构是SOA结构的升级
2. 微服务就是进一步更细小力度的将服务进行拆分,单一且微小
3. 不在使用Web Service 和 ESB。
优点:
1、将系统服务层完全独立出来,并将服务层抽取为一个一个的微服务。
2、微服务遵循单一原则。
3、微服务之间采用RESTful等轻量协议传输。微服务架构采用去中心化思想,服务之间采用RESTful等轻量协议通信,相比ESB更轻量。
缺点:
1、微服务过多,服务治理成本高,不利于系统维护。
2、分布式系统开发的技术成本高(容错、分布式事务等),对团队挑战大。
3. spring boot 项目搭建
3.1 项目工程创建
(1)通过官网,手脚架下载,http://start.spring.io/ . 生成一个压缩包,下载,导入IDE中
(2) 使用idea或者其他的工具生成
3.2 启动项目
直接run启动程序里的Main()方法
注意:在启动项目的时候,可能会出现一个问题,启动成功后,服务马上就停止了
解决方法:出现这种问题的主要原因是,项目现在没有成为一个web项目,项目中并没有相关的tomcat等的服务器,所以项目运行就结束!
如果想要一直运行,就需要在pom文件中加入对应的web坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
或者,如果idea中装了EditStart插件后,可以点击该插件,选在spring web,也能自动加入该jar包。
3.3 小功能
动态生成 banner。banner.txt文件
修改启动banner:
在resources目录下新建banner.txt
http://www.network-science.de/ascii/ 英文
https://www.degraeve.com/img2txt.php 图片
3.4 spring boot的配置文件
1. 配置文件支持两种 yaml(yml) properties
2. 配置文件的位置优先级,以下四个由高到底
- file:./config/
- file:./
- classpath:./config
- classpath:./
3. 配置文件的一些细节
- 可以注入属性。两个注解@ConfigurationProperties @Value
松散组合: 能自动识别从下划线转成驼峰
- 使用表达式 #{} ${}
- JSR303数据校验 @Validated @Email
- 多环境配置
3.5 自定义注解
四个元注解
@Target 指该注解应该注释的范围。包括类,接口,字段,方法等
public enum ElementType {
TYPE, // 类、接口、枚举类
FIELD, // 成员变量(包括:枚举常量)
METHOD, // 成员方法
PARAMETER, // 方法参数
CONSTRUCTOR, // 构造方法
LOCAL_VARIABLE, // 局部变量
ANNOTATION_TYPE, // 注解类
PACKAGE, // 可用于修饰:包
TYPE_PARAMETER, // 类型参数,JDK 1.8 新增
TYPE_USE // 使用类型的任何地方,JDK 1.8 新增
@Retursion 指注解应该运行的生命周期等。描述注解保留的时间范围(即:被描述的注解在它所修饰的类中可以被保留到何时) 。
public enum RetentionPolicy {
SOURCE, // 源文件保留
CLASS, // 编译期保留,默认值
RUNTIME // 运行期保留,可通过反射去获取注解信息
}
@Inherited 是否让子类继承,使被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解)。
@Documented 是否写入JavaDoc文档中,描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息