SpringBoot学习笔记三

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 缓存使用
  1. 启用缓存
  2. 设置进入缓存的数据
  3. 设置读取缓存的数据

导入缓存技术对应的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

一种高吞吐量的分布式发布订阅消息系统,提供实时消息功能

监控

服务状态是否宕机 运行指标(内存,虚拟机,线程。请求) 监控日志 管理服务(服务下线)

笔记一
笔记二
笔记三

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值