目录
1. 前奏
1.1 回顾spring
1.2 spring boot 优点
2. 架构演变之路
2.1 单体
2.2 垂直架构
2.3 分布式架构
2.3.1 soa架构
2.3.2 微服务架构
3. spring boot 项目搭建
3.1 项目工程创建
3.2 启动项目
3.3 小功能
3.4 spring boot的配置文件
3.5 自定义注解
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 工具为类生成帮助文档时是否要保留其注解信息