SpringBoot项目程序打包 (Windows-version)
1 对SpringBoot项目打包(执行Maven构建指令package)
2 运行项目 java -jar springboot.jar
TIPS:jar支持命令行启动需要依赖maven插件支持,打包时确认SpringBoot对应的插件
在pom文件中 spring-boot-maven-plugin
Linux-version
安装JDK
安装包保存在/usr/locar自定义目录或$HOME下
使用jar命令启动SpringBoot工程可以使用临时属性替换配置文件中的属性
java -jar springboot,jar —key=value
多个临时属性之间使用空格分隔
临时属性必须是当前boot工程支持的属性,否则失效
SpringBoot中4级配置文件
1级:file:config/application.yml 最高
2级:file: application.yml
3级: classpath: config/application.yml
4级:classpath: application.yml 最低
作用:
1级与2级留做系统打包后设置通用属性,1级常用于运维经理进行线上整体项目部署方案调控
3级与4级用于系统开发阶段设置通用属性,3级常用于项目经理进行整体项目属性调控
配置文件分四种
项目类路径配置文件:服务于开发人员本机开发与测试
项目类路径config目录中配置文件:服务于项目经理整体调控
工程路径配置文件:服务于运维人员配置涉密线上环境
工程路径config目录中配置文件:服务于运维经理整体调控
TIPS:
多层级配置文件之间属性采用叠加并覆盖的形式作用于程序
配置文件可以改名/改路径,通过启动参数设定
微服务开发中配置文件通过配置中心进行设置
多环境开发(YAML)
#应用环境
spring:
profiles:
actives: pro
---
#生产环境
spring:
profiles: pro
server:
port: 80
---
#开发环境
spring:
profiles: dev
server:
port: 81
---
#测试环境
spring:
config:
activate:
on-profile: test
server:
port: 82
多环境开发(YAML)多配置文件格式
主启动配置文件application.yml
#应用环境
spring:
profiles:
actives: pro
环境分类配置文件application**-pro**.yml
server:
port: 80
环境分类配置文件application**-dev**.yml
server:
port: 81
环境分类配置文件application**-test**.yml
server:
port: 82
properties文件多环境配置:仅支持多文件格式
代码:略(和yaml文件一样)
多环境开发需要设置常用环境:
例如开发,生成,测试环境
yaml格式中设置多环境使用- - -区分环境设置边界
每种环境的区别在于加载的配置属性不同
启用某种环境是需要指定启动时使用该环境
根据功能对配置文件中的信息进行拆分,并制作成多里的配置文件,命名规则如下
application-devDB.yml
application-devRedis.yml
application-devMVC.yml
使用lnclude属性
在激活指定环境情况下,同时对多个环境进行加载使其生效,多个环境用逗号分割
#应用环境
spring:
profiles:
actives: dev
include: devDB,devRedies,devMVC
TIPS:当主环境dev与其他环境相同属性时,主环境生效:其他环境中有相同属性时,最后加载的环境属性生效
使用group属性
从SpringBoot2.4版开始使用group属性替代include属性,降低了配置书写量
使用group属性定义多种主环境与子环境的包含关系
#应用环境
spring:
profiles:
actives: dev
group:
"dev": devDB,devRedies,devMVC
"pro": proDB,proRedis,proMVC
"test": testDB,testRedis,testMVC
Maven 与SpringBoot多环境冲突解决方案
1 当Maven与SpringBoot同时对多环境进行控制时,以Maven为主,SpringBoot使用@…@占位符读取Maven对应的配置属性值
2 基于SpringBoot读取Maven配置属性的前提下,如果在IDEA下测试工程时pom.xml每次更新需要手动compile方可生效
日志基础操作
日志(log)作用
编程期调试代码
运营期记录信息:记录日常运营重要信息 记录应用报错信息 记录运维过程数据
代码中使用日志工具记录日志
1 添加日志记录操作
public class xxxxx{
private static final Logger log = LoggerFactroy.getLogger(xxxxx.class);
public function(){
log.debug();
log.info();
log.warn();
log.error():
}
}
日志级别
名称 | 描述 |
---|---|
TRACE | 运行堆栈信息,使用率低 |
DEBUG | 调试代码使用 |
INFO | 记录运维过程数据 |
WARN | 记录运维过程报警数据 |
ERROR | 记录错误堆栈信息 |
FATAL | 灾难信息,合并计入ERROR |
2 设置日志输出级别
3 设置日志组
#开启debug模式,输出调试信息,用于检查系统运行状况
debug: true
#设置日志级别,root表示根节点,整体应用日志级别
logging:
#设置分组
group:
group1: com.study.controller,com.study.dao
iservice: com.abibi
level:
root: debug
#设置分组
group: warn
iservice: debug
优化日志对象创建代码
使用lombok的主键@Slf4j
@Slf4j
public class xxxxx{
public function(){
log.debug();
log.info();
log.warn();
log.error();
}
}
日志输出格式控制
设置日志输出格式
logging:
pattern:
console: "%d - %m%n"
%d 日期 %m消息 %n换行
启动热部署(IDEA)
重启Restart : 自定义开发代码,包含类,页面,配置文件等,加载位置restart类加载器
重载ReLoad:jar包,加载位置base类加载器
1开启开发者工具后启用热部署 2 使用构建项目操作启动热部署 build project 3 热部署仅仅加载当前开发者自定义开发的资源,不加载jar资源
热部署范围配置
自定义不参与重启排除项
devtools:
restart:
exclude: public/"",static/""
关闭热部署
设置高优先级属性禁用
public static void main(String[] args){
System.setProperty("spring.devtools.restart.enabled","false");
SpringApplication.run();
}
使用注解@ConfigurationProperties(prefix=“”)为第三方bean注入属性
@EnableConfigurationProperties(xx.class)注解可以将使用@ConfigurationProperties(prefix=“”)注解对应的类加入到Spring容器
TIPS:@EnableConfigurationProperties 与 @Component 不能同时使用
@ConfigurationProperties绑定属性支持属性名宽松绑定
TIPS:绑定前缀名命名规范:仅能使用纯小写字母,数字,中划线作为合法的字符
@Value不支持属性名宽松绑定
数据校验
开启数据校验有助于系统安全性,J2EE规范中JSR303规范定义了一组有关数据校验相关的API
1 开启Bean数据校验:添加JSR303规范坐标与Hibernate校验框架对应坐标 2 对Bean开启校验功能使用@Validated 在class上启用功能 3 在具体的属性里添加校验规范数据格式
1 在pom.xml下导入
2 设置Bean 3 添加规范
@Component
...
@ConfigurationProperties(prefix="servers")
@Validated
public class ServerConfig{
@Max(value = 400 , message="The Max value can not over 400")
private int port;
}
加载测试专用属性
在启动测试环境时候可以通过properties参数设置测试环境专用属性:用于小范围测试环境
properties:一般是配置文件 args:是命令行配置
@SpringBootTest(properties = {"test.prop = testValue1"},args={"--test.arg=testValue2"})
public class PropertiesAndTest{
@Value("${test.prop}")
private String msg
@Test
void test1(){
System.ou.println(msg);
}
}
使用@Import注解加载当前测试类专用的配置
@SpringBootTest
@Import(ClassName.class)
public class PropertiesAndTest{
@Autowired
private String msg
@Test
void test1(){
System.ou.println(msg);
}
}
web环境模拟测试
虚拟请求测试
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
//开启虚拟MVC调用
@AutoConfigureMockMvc
Public class WebTest{
@Test
//注入虚拟MVC调用对象
public void testWeb(@Autowired MockMvc mvc )throws Exception{
//创建虚拟请求 ,当前访问/books
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.ger("/books");
//执行请求
ResultActions action = mvc.perform(builder);
}
@Test
//测试响应状态
public void tesStatus(@Autowired MockMvc mvc )throws Exception{
//创建虚拟请求 ,当前访问/books
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.ger("/books");
//执行请求
ResultActions action = mvc.perform(builder);
//设定预期值,与真实值进行比较,成功通过,失败
//定义执行状态匹配器
StatusResultMachers status = MockMvcResultMachers.status();
//定义预期执行状态 状态200
ResultMatcher ok = status.isOk();
//使用本次真实执行结果与预期结果进行比对
action.andExpect(ok);
}
//测试响应体
public void testBody(@Autowired MockMvc mvc )throws Exception{
//创建虚拟请求 ,当前访问/books
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.ger("/books");
//执行请求
ResultActions action = mvc.perform(builder);
//匹配执行结果(是否预期值)
//定义执行状态匹配器
StatusResultMachers content = MockMvcResultMachers.content();
//定义预期执行结果
ResultMatcher result = content.string("springboot");
//使用本次真实执行结果与预期结果进行比对
action.andExpect(result);
}
//测试响应体Json
public void testJson(@Autowired MockMvc mvc )throws Exception{
//创建虚拟请求 ,当前访问/books
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.ger("/books");
//执行请求
ResultActions action = mvc.perform(builder);
//匹配执行结果(是否预期值)
//定义执行状态匹配器
StatusResultMachers content = MockMvcResultMachers.content();
//定义预期执行结果
ResultMatcher result = content.json("{\"id\":1,\"name\":\"springboot\"}");
//使用本次真实执行结果与预期结果进行比对
action.andExpect(result);
}
}
Status,Body等等这些都是可以测试的
数据层测试事务回滚
为测试用例添加事务,SpringBoot会对测试用例对应的事务提交操作进行回滚
@SpringBootTest
@Transactional
public class DaoTest{
@Autowired
private BookService bookService;
}
如果想在测试用例中提交事务,可以通过@Roolback注解设置
@SpringBootTest
@Transactional
@Rollback(false)
public class DaoTest{
@Autowired
private BookService bookService;
}
测试用例数据设定
测试用例数据通常才用随机值进行测试,使用SpringBoot提供的随机数赋值
testcast:
book:
id: ${random.int} #随机int
id2: ${random.int(10)} #随机int 10以内
type: ${random.int(10,20)}
uuid: ${random.uuid} #随机uuid
name: ${random.value} #随机字符串,MD5字符串,32位
数据层解决方案
现有数据层解决方案技术选型
Druid + MyBatis-Plus + MySQL
数据源:
Druid 持久化技术:MyBatis-Plus / MyBatis 数据库 :MySQL
SpringBoot提供了3种内嵌的数据源对象提供开发者选择
- HikariCP
- Tomcat提供的DataSource
- Commons DBCP
HikariCP: 默认内置数据源对象
Tomcat提供的DataSource :HikariCP不可用的情况下,而且在web环境中,就会使用
Commons DBCP :上面两个用不了,就会用
内嵌SQL数据库
SpringBoot提供三种内嵌数据库
- H2
- HSQL
- D erby
内嵌数据库(H2)
内存级别的数据库,轻量级,运行快,在测试时使用
设置当前项目为web工程,并配置H2管理控制台参数
server:
port: 80
spring:
h2:
console:
path: /h2
enabled: true
NoSQL
Redis
一款Key-Value存储结构的内存级NoSQL数据库
支持多种数据存储格式 支持持久化 支持集群
缓存
介于数据永久存储介质与数据应用之间的数据临时存储介质
作用: 有效减少低速数据读取过程的次数(磁盘IO),提高系统性能
提供临时的数据存储空间
SpringBoot 缓存使用
- 启用缓存
- 设置进入缓存的数据
- 设置读取缓存的数据
导入缓存技术对应的starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache </artifactId>
</dependency>
启用缓存
@SpringBootApplication
@EnableCaching
public class xxxx{
.....
}
设置当前操作的结果数据进入缓存
@Cacheable(value = "cacheSpace", key="#id")
public Book getById(Integert id ){
return bookDao.selectById(id);
}
TIPS:@Cacheable(value/cacheName = , key = )
value/cacheName: 缓存空间的名字
key : 查询缓存的关键值
@Cacheable注解:执行方法,缓存会根据key值在自定义的缓存空间value/cacheName中查找,查找失败则将return值缓存到缓存空间中,查找成功则return缓存空间里的对应id的值
SpringBoot提供的缓存技术提供了默认的缓存方案,还可以对其他缓存技术进行整合,统一接口,方便缓存技术的开发与管理、
Redies配置文件:
数据淘汰策略
影响数据淘汰的相关配置
检测易失数据(可能会过期的数据集server.db[i]i.expires)
LRU:Least Rcently Used LFU:Least Frequently Used
volatile-lru:挑选最近最少使用的数据淘汰 volatitle-lfu: 挑选最近使用次数最少的数据淘汰 volatile-ttl:挑选将要过期的数据淘汰 volatile-random:任意选择数据淘汰
SpringBoot task任务:
定时任务是企业级中的常见操作:年度报表,缓存统计报告
市面上流行的定时任务技术 : Quartz
SpringBoot 整合Quartz
工作(job):定义具体执行的工作
工作明细(JobDetail) : 描述定时工作相关的信息
触发器(Trigger):描述触发工作的规则,常用cron表达式定义
调度器(Scheduler)描述工作明细与触发器的对应关系
MESSAGE
企业级应用中广泛使用的三种异步消息传递技术
JME (Java Message Service):一个规范,等同于JDBC规范,提供了与消息服务相关的API
JMS 消息模型:
perer - 2 -peer:点对点模型,消息发送到一个队列中,队列保存消息。队列的消息只能被一个消费者消费或者超时
publish-subscribe:发布订阅模型,消息可以被多个消费者消费,生产者和消费者完全独立,不需要感知对方的存在
JME 种类
TextMessage MapMessage BytesMessage StreamMessage ObjectMessage Message(只有消息头和属性)
JMA实现:ActiveMQ ,Redis,HornetMQ ,RabbitMQ,RocketMQ(没有完全遵守JMS规范)
AMQP(advanced message queuing oriticik): 高级消息队列协议,消费代理规范,规范了网络交换的数据格式兼容JMS
优点: 具有跨平台性,服务器供应商,生产者,消费者可以使用不同的语言来实现
AMQP消息模型: **direct exchange ** ,topic exchange ,fanout exchange ,headers exchange,system exchange
AMQP消息种类:byte[]
AMQP实现:RabbitMQ ,StormMQ,RocketMQ
AMQP:规范了消息传递的格式 JMS 规范了消息传递的API
MQTT (Message Queueing Telemetry Transport)消息队列遥测传输,专为小设备设计,是物联网生态系统中主要成分之一
Kafka
一种高吞吐量的分布式发布订阅消息系统,提供实时消息功能
监控
服务状态是否宕机 运行指标(内存,虚拟机,线程。请求) 监控日志 管理服务(服务下线)