学习主题:SpringBoot
学习目标:
对应视频:
http://www.itbaizhan.cn/course/id/85.html
对应文档:
无
对应作业
1. Spring Boot整合Spring Data Redis-整合步骤
(1) 阐述Spring Boot整合Spring Data Redis整合步骤。
1,导入redis 启动器坐标
<!-- springdata redis 的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. 配置jedis配置类
/*
* JedisPoolConfig : 配置连接池信息
*
* */
@Bean
@ConfigurationProperties(prefix="spring.config.pool") //加载application.properties下前缀为spring.config.pool配置信息
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedis = new JedisPoolConfig();
//
// jedis.setMaxIdle(20);
// jedis.setMinIdle(5);
// jedis.setMaxTotal(100);
System.out.println("默认值"+jedis.getMaxIdle());
System.out.println("默认值"+jedis.getMinIdle());
System.out.println("默认值"+jedis.getMaxTotal());
return jedis;
}
/*
* JedisConnectionFactory : 配置jedis 连接工厂
* */
@Bean
@ConfigurationProperties(prefix="spring.factory")
public JedisConnectionFactory jedisConnectionFactory (JedisPoolConfig jedisPoolConfig) {
System.out.println(jedisPoolConfig.getMaxIdle());
System.out.println(jedisPoolConfig.getMinIdle());
System.out.println(jedisPoolConfig.getMaxTotal());
JedisConnectionFactory jFactory = new JedisConnectionFactory();
jFactory.setPoolConfig(jedisPoolConfig);
// jFactory.setHostName("192.168.93.130");
// jFactory.setPort(6379);
// jFactory.setTimeout(30000);
return jFactory;
}
/*
* 配置jedis连接模板
* */
@Bean
public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory){
RedisTemplate<String, Object> redis = new RedisTemplate<>();
//连接 jedis连接工厂
redis.setConnectionFactory(jedisConnectionFactory);
redis.setKeySerializer(new StringRedisSerializer());
redis.setValueSerializer(new StringRedisSerializer());
return redis;
}
(1) @Configuration注解的作用是什么?
Springboot启动时 会去加载此类
(2) @Bean注解的作用是什么?
将对象注册到IOC容器中
3. Spring Boot整合Spring Data Redis-提取Redis的链接参数
(1) @ConfigurationProperties注解的作用是什么?
加载application.properties文件
spring.config.pool.max-idle=20
spring.config.pool.min-idle=5
spring.config.pool.max-total=100
spring.factory.host-Name=192.168.93.130
spring.factory.port=6379
spring.factory.timeout=20000
(2) @ConfigurationProperties注解中的prefix属性的作用是什么?
使用前缀是 ... 的配置信息
4. Spring Boot整合Spring Data Redis-存取Java对象
(1) 创建Users实体对象,包含id、name、age、address属性。
@Entity //标记实体类
@Table(name="t_user") //映射数据库中的表 ,如果开了正向索引就会创建此表
public class User implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY) //主键生成策略 , 此策略为数据库自动生成 (自动增长)
@Column(name="id")
private Integer id;
@Column(name="name")
private String name;
@Column(name="age")
private Integer age;
@Column(name="address")
private String address;
(2) 创建测试代码,在测试方法中重新设置序列化器,更换为jdk序列化器,并将Users对象缓存到Redis中。
// 存贮User对象 使用jdk序列化器将对象序列化为字节,转换为字符存储在redis库中
@Test
public void test3() {
User user = new User();
user.setAddress("wer");
user.setAge(12);
user.setName("wer");
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.opsForValue().set("user", user);
User user2=(User) redisTemplate.opsForValue().get("user");
System.out.println(user2);
}
(3) 创建测试代码,获取缓存的Users对象。
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
User user2=(User) redisTemplate.opsForValue().get("user");
5. Spring Boot定时任务-@Scheduled的使用
(1) Scheduled是什么?
定时任务器
(2) @Scheduled注解的作用是什么?
设置定时任务
(3) @Scheduled的cron属性的作用是什么?
Cron 表达式 ,定时任务触发是时间的一个字符串表达形式
(4) 什么是cron表达式?
Cron 表达式是一个字符串,分为6或7个域,每一个域代表一个含义
结构:
Corn从左到右(用空格隔开:秒 分 小时 月份中的日期 月份 星期中的日期 年份)
(5) @EnableScheduling注解的作用是什么?
开启定时任务器
6. Spring Boot定时任务-cron表达式
(1) Cron表达式的语法格式有几种?
两种
Seconds Minutes Hours Day Month Week Year
Seconds Minutes Hours Day Month Week
(2) Cron表达式的结构是什么样的?
Corn 从左到右(用空格隔开) : 秒 分 小时 月份中的日期 月份 星期中的日期 年份
(3) Cron表达式各字段的含义是什么?
![5e977e9dc4152266e888f654be3cd8d9.png](https://img-blog.csdnimg.cn/img_convert/5e977e9dc4152266e888f654be3cd8d9.png)
(4) 在Cron表达式中(*)、(?)、(-)、(,)、(/)、(#)分别表示什么含义?
(5) 在Cron表达式中L、W、LW、C分别表示什么含义?
![a0d7814aa1522c643efa8716fd3dd12a.png](https://img-blog.csdnimg.cn/img_convert/a0d7814aa1522c643efa8716fd3dd12a.png)
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。
第222次(SpringBoot)
学习主题:SpringBoot
学习目标:
对应视频:
http://www.itbaizhan.cn/course/id/85.html
对应文档:
无
对应作业
7. Spring Boot定时任务-Quartz介绍
(1) 什么是Quartz?
一个开源的定时任务框架
(2) Quartz的使用思路是什么?
1. job - 任务 - 你要做什么事?
2. Trigger - 触发器 - 你什么时候去做?
3. Scheduler - 任务调度 - 你什么时候需要去做什么事?
8. Spring Boot定时任务-SpringBoot整合Quartz
(1) 阐述Spring Boot整合Quartz整合步骤。
1. 修改pom.xml文件 添加 Quartz的坐标
<!-- Quartz 坐标 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- Sprng tx 坐标 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
2. 创建job类(任务类)
/*
* 定义job 任务类
* */
public class Quartzjob implements Job{
/*
* 任务被触发时所执行的方法
* */
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("Execute..."+new Date());
}
3. 编写 Quartz 配置类
@Configuration //让springBoot启动时来初始化此类
public class QuartzMain {
/*
* 创建Job对象
*/
@Bean
public JobDetailFactoryBean jobDetailFactoryBean() {
JobDetailFactoryBean factory = new JobDetailFactoryBean();
//与job类建立联系
factory.setJobClass(QuartzDemo.class);
return factory;
}
/*
* 创建Trigger对象 简单的trigger对象
*/
@Bean
public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){
SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean();
//关联 JobDetail 对象
factory.setJobDetail(jobDetailFactoryBean.getObject());
//该参数表示一个执行的毫秒数
factory.setRepeatInterval(2000);
//重复次数
factory.setRepeatCount(5);
return factory;
}
/*** 3.创建 Scheduler 对象 */
@Bean
public SchedulerFactoryBean schedulerFactoryBean(SimpleTriggerFactoryBean simpleTriggerFactoryBean,MyAdaptableJobFactory myAdaptableJobFactory){
SchedulerFactoryBean factory = new SchedulerFactoryBean();
//关联 trigger
factory.setTriggers(simpleTriggerFactoryBean.getObject());
return factory;
(2) @EnableScheduling注解的作用是什么?
开启定时任务
9. Spring Boot定时任务-Job类对象注入
(1) 阐述Job类注入时生异常的原因。
![168112f3d8cba4cb1b8ae9a15aee7bc7.png](https://img-blog.csdnimg.cn/img_convert/168112f3d8cba4cb1b8ae9a15aee7bc7.png)
UserService对象的注入就没有获取
(2) 如何解决该异常?
需要将JOb.class 类也加入到sprngIOC容器中 ,
@Component("myAdaptableJobFactory") //将该类注册到SpringIOC容器中
public class MyAdaptableJobFactory extends AdaptableJobFactory{
//AutowireCapableBeanFactory 可以将一个对象添加到SpringIOC容器中,并且完成该对象注入
@Autowired
private AutowireCapableBeanFactory autowireCapableBeanFactory;
/*
* 该方法需要将实例化的任务对象手动添加到SpringIOC容器中并且完成对象的注入
* */
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object obj =super.createJobInstance(bundle);
autowireCapableBeanFactory.autowireBean(obj);
return obj;
}
(3) AutowireCapableBeanFactory对象的作用是什么?
可以将一个对象添加到SpringIOC容器中,并且完成该对象注入
10. 单体架构
(1) 什么是单体架构?
单体架构也称之为单体系统或者是单体应用,就是一种把系统中所有的功能,模块耦合在一个应用中的架构方式
(2) 单体架构有哪些特点?
1. 打包成一个独立的单元(导成一个唯一的jar包或者是war包)
2. 会一个进程的方式来进行
![6907bdb7973545bbdbc55ee3b5f2b417.png](https://img-blog.csdnimg.cn/img_convert/6907bdb7973545bbdbc55ee3b5f2b417.png)
(3) 单体架构的优缺点是什么?
优点:
1. 项目易于管理
2. 部署简单
缺点:
测试成本高
可伸缩性差
可靠性差
迭代困难
跨语言程度差
团队协作难
11. 微服务架构
(1) 什么是微服务?
微服务是一种架构风格,一个大型的复杂软件应用,由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务直接是松耦合的,每个微服务仅关注于完成一件任务并很好的完成该任务
(2) 常见的架构风格有哪些?
1. 客户端于服务端的
2. 基于组件模型的架构
3. 分层架构
4. 面向服务架构
(3) 微服务架构有哪些特点?
系统是由多个服务构成
每个服务可以单独独立部署
每个服务之间是松耦合的,服务内部是高内聚的,外部是低耦合的,高内聚就是每个服务只关注完成一个功能
(4) 微服务架构的优缺点是什么?
优点:
测试容易
可伸缩性强
可靠性强
跨语言程度会更加灵活
团队协作容易
系统迭代容易
缺点:
运维成本过高,部署数量较多
接口兼容多版本
分布式系统的复杂性
分布式事务
12. 常见软件架构方式的区别
(1) 什么是MVC架构?
其实MVC架构就是一个单体架构
代表技术: Struts2,SpringMVC,Spring,Mybatis等等
(2) 什么是RPC架构?
RPC 远程过程调用 ,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议
代表技术: Thrift , Hessian等
(3) 什么是SOA架构?
SOA : 面向服务架构
ESB: 企业服务总线,服务中介,主要是提供了一个服务与服务之间的交互
ESB包含的功能 : 负载均衡,流量控制,加密处理,服务的监控.异常处理.监控告急等等
代表技术 : Mule ,WSO2
5. 微服务架构
微服务就是一个轻量级的服务治理方案
13. AKF拆分原则
(1) 设计微服务的原则是什么?
AKF 拆分原则
前后端分离原则
无状态服务
RestFul的通信风格
(2) 什么是AKF拆分原则?
通过加机器就可以解决容量和可用性问题 (一台不够就两台
![ae75b47a6be920c6580206fddd4a43d5.png](https://img-blog.csdnimg.cn/img_convert/ae75b47a6be920c6580206fddd4a43d5.png)
)
(3) AKF拆分原则中的Y轴表示什么?
功能 - 关注应用中功能划分,基于不同的业务拆分
Y轴扩展会将庞大的整体应用拆分为多个服务,每个服务实现一组相关的功能,如订单管理,客户管理等, 例子: 服务化架构(SOA)
![834ed2653593cf8a97002fbc9210fdd0.png](https://img-blog.csdnimg.cn/img_convert/834ed2653593cf8a97002fbc9210fdd0.png)
引发的问题 : 当服务数量增多时,服务调用关系变得复杂,为系统添加一个新功能 ,要调用的服务数也变得不可控 ,由此引发服务管理上的混乱
所以一般情况下,需要采取服务注册的机制形成服务网关来进行服务治理,系统的架构就会变成这样
![5875d08b818b8154ce3b579c051ffa2e.png](https://img-blog.csdnimg.cn/img_convert/5875d08b818b8154ce3b579c051ffa2e.png)
(4) AKF拆分原则中的X轴表示什么?
水平扩展 -- 关注水平扩展 ,也就是 “加机器解决问题”
通过绝对平等地复制服务与数据,以解决容量和可用性的问题 就是将微服务运行多个实例,做集群加负载均衡的模式
![87fa06263f9b9797bb2e06342f9ddbbc.png](https://img-blog.csdnimg.cn/img_convert/87fa06263f9b9797bb2e06342f9ddbbc.png)
(5) AKF拆分原则中的Z轴表示什么?
数据分区 -- 关注服务和数据的优先级划分,如地域划分
Z 轴扩展通常是指基于请求者或用户独特的需求,进行系统划分,并使得划
分出来的子系统是相互隔离但又是完整的。以生产汽车的工厂来举例:福特公司
为了发展在中国的业务,或者利用中国的廉价劳动力,在中国建立一个完整的子
工厂,与美国工厂一样,负责完整的汽车生产。这就是一种 Z 轴扩展。
![96707d3dc44b7cf0e792c29786b96a60.png](https://img-blog.csdnimg.cn/img_convert/96707d3dc44b7cf0e792c29786b96a60.png)
14. 前后端分离原则
(1) 什么是前后端分离原则?
![f10f58688ac9efe306958b05fbacc180.png](https://img-blog.csdnimg.cn/img_convert/f10f58688ac9efe306958b05fbacc180.png)
何为前后端分离?前后端本来不就分离么?这要从尴尬的 jsp 讲起。分工精细化从来都
是蛋糕做大的原则,多个领域工程师最好在不需要接触其他领域知识的情况下合作,才可能
使效率越来越高,维护也会变得简单。jsp 的模板技术融合了 html 和 java 代码,使得传统
MVC 开发中的前后端在这里如胶似漆,前端做好页面,后端转成模板,发现问题再找前端,
前端又看不懂 java 代码......前后端分离的目的就是将这尴尬局面打破。
前后端分离原则,简单来讲就是前端和后端的代码分离,我们推荐的模式是最好采用物
理分离的方式部署,进一步促使更彻底的分离。如果继续直接使用服务端模板技术,如:jsp,
把 java、js、html、css 都堆到一个页面里,稍微复杂一点的页面就无法维护了。
![a0dcfbd7aa8fd3534535e13d23eadb43.png](https://img-blog.csdnimg.cn/img_convert/a0dcfbd7aa8fd3534535e13d23eadb43.png)
这种分离方式有几个好处
1. 前后端技术分离,可以由各自的专家来对各自的领域进行优化,这样前端的用户体验优化效果更好
2. 分离模式下,前后端交互界面更清晰,就剩下了接口模型.后端的接口简单明了
3. 前端多渠道集成场景更容易实现,后端服务无需变更,采用统一的数据和模型,可以支持多个前端
15. 无状态服务
(1) 什么是无状态服务?
简单来说 就是对数据的处理就是无状态服务 ,对数据的操作 放入缓存数据库啥的就是有状态服务
16. RestFul通信风格
(1) 什么是RestFul通信风格?
![641636a55ff9c65a0e2e4ac509a4da04.png](https://img-blog.csdnimg.cn/img_convert/641636a55ff9c65a0e2e4ac509a4da04.png)
作为一个原则来讲本来应该是个”无状态通信原则”,在这里我们之间推荐一个实践优选的Restful通信风格
好处:
1. 无状态协议 HTTP ,具备先天优势,扩展能力很强,
2. JSON报文序列化,轻量简单,学习成本低
3. 语言无关 ,各大热门语言都提供Restful框架
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。