SpringBoot、SpringCloud学习历程
一、SpringBoot
1.架构的演变
- 单一应用架构
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。 - 垂直应用架构
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。 - 分布式服务架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。 - 流动计算架构
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
2.Spring“统治一切”
3.第一个SpringBoot程序
前言:如果非科班,idea的安装,大家自行百度~
3.1 打开idea,点击新建项目
3.2Spring Initializr
3.3自定义依赖项
3.4等待构建完成
可选:删掉框中的文件,使得项目更加清爽~
3.5最终
3.6启动应用
3.7启动成功
3.8访问http://localhost:8080
3.9构建MVC架构目录
注意:构建的controller、service、dao、pojo等包一定要跟xxxApplication在同级目录下。因为xxxApplication的扫描器默认扫描xxxApplication所在目录及下层目录。
3.10创建一个HelloController
3.11保存->重启->访问
3.12打jar包
3.13启动打的jar包
停止当前应用(防止端口冲突),鼠标在demo-0.0.1-SNAPSHOT.jar处右键单击选择->打开于->终端。
然后在终端输入java -jar demo-0.0.1-SNAPSHOT.jar
再次访问:http://localhost:8080/test/hello
提示:在终端按住ctrl+c即可停止java -jar 包(服务)的运行。
3.14更改项目端口号
3.15重启->访问http://localhost:8081/test/hello
3.16更换Spring Banner
推荐网站:Spring Banner在线生成
在resource下创建banner.txt,然后将从网站上复制下来的,粘贴到文件中,保存后重启即可。
3.17成功更换
3.18SpringBoot自动装配原理
自动配置:
pom.xml
- spring-boot-dependencies:核心依赖在父工程中
- 引入spring-boot依赖的时候,无需指定版本号,因为spring-boot-dependencies中存在版本仓库
pom.xml–>spring-boot-starter-parent—>spring-boot-dependencies - including:Version Control & Core Dependencies $ Core plugins
启动器
-
启动器:通俗的说就是Springboot的启动场景
-
eg:spring-boot-starter-web,它会帮我们自动导入web环境所有的依赖
-
springboot会将所有的功能场景,封装成一个个的启动器
-
需要使用什么功能,只需引入对应的启动器"starter"官网starters url
-
主程序
/** 标注这个类是一个springboot的应用 */
@SpringBootApplication
public class DemoApplication
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- 注解
@SpringBootConfiguration:soringboot的配置
@Configuration:spring配置类
@Component:说明这也是一个spring的组件
@EnableAutoConfiguration:自动配置
@AutoConfigurationpackage:自动配置包
@Import(AutoConfigurationPackages.Registrar.class):自动配置"包注册"
@Import(AutoConfigurationImportSelector.class):自动配置导入选择
//获取所有的配置
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = new ArrayList<>(
SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()));
ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).forEach(configurations::add);
Assert.notEmpty(configurations,
"No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
META-INF/spring.factories:自动配置的核心文件
结论:springboot所有的自动配置都是在启动的时候扫描并加载:META-INF/spring.factories
,所有的自动配置类都在这个文件里面,但是不一定生效,只有导入对应的启动器,自动装配才会生效。
1.springboot在启动的时候,从类路径下/META-INF/spring.factories
获取指定的值;
2.将这些自动配置的类导入容器,自动配置就会生效;
3.整合JAVA EE
的解决方案和自动配置类都在spring-boot-autoconfigure-2.7.3.jar这个包下。
SpringApplication.run(DemoApplication.class, args);
SpringApplication.run(DemoApplication.class, args);
1.判断应用的类型是普通项目还是Web项目
2.查找并加载所有可用的初始化器,设置到initializers属性中
3.找出所有的应用程序监听器,设置到listeners属性中
4.推断并设置main方法的定义类,找到运行的主类
面试点:关于SpringBoot,谈谈你的理解:
- 自动装配
- run();
- springboot是spring的一个升级,对开发者来说,熟悉springboot有助于快速开发java.
- springboot提个重要的概念就是自动配置,使得开发者无需像之前spring项目那样做大量的配置,有了springboot,比如我们要集成redis,在使用maven构建项目的情况下,我们只需要引入redis的依赖,然后在application.yml配置文件里配置必要的参数即可,如果要覆盖默认配置,同样在配置文件直接写就可以完成覆盖,也就是说使用springboot既可以享受快速开发,也可以轻松的覆盖默认配置。
- sprincloud就是在springboot的基础上开发的。
4.SpringBoot自定义配置文件
springBoot使用一个全局的配置文件,配置文件名称是固定的。
- application.properties
语法结构:key=value - application.yml
语法结构:
1.key: value
2.#对象
student:
name: cxj
age: 18
3.#对象行内写法
student: {name: cxj,age: 18}
4.#数组
pets:
- cat
- dog
- pig
#数组,行内写法
pets: [cat,dog,pig]
5.yaml可以直接给实体类赋值
通过@ConfigurationProperties(prefix = “类名”)可以将yaml中的对象值直接赋给对应的类。
二、SpringCloud
1.认识微服务
微服务这种方案需要技术框架来落地,全球的互联网公司都在积极尝试自己的微服务落地技术。国内最知名的就是SpringCloud和Dubbo.
微服务拆分的目的就是单一职责。
面试题:面向对象的五大基本原则
- 单一职责原则(SRP)任何一个软件模块都应该只对某一类行为负责。
-开放封闭原则(OCP)面向扩展开放,面向修改关闭。 - 里氏替换原则(LSP) 超类存在的地方,子类是可以替换的。
- 依赖倒置原则(DIP) 实现尽量依赖抽象,不依赖具体实现。
- 接口隔离原则(ISP)应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。
微服务技术对比图
2.SpringCloud
3.springcloud和springBoot的兼容关系
该文章基于Hoxton.SR10,对应的SpringBoot版本是2.3.x版本。
4.服务拆分及远程调用
服务拆分注意事项
1.不同的微服务,不要重复开发相同的业务
2.微服务数据独立,不要访问其他微服务的数据库
3.微服务可以将自己的业务暴露为接口,供其他微服务调用
5.微服务远程调用