能够掌握SpringBoot程序多环境开发
能够基于Linux系统发布SpringBoot工程
能够解决线上灵活配置SpringBoot工程的需求
Windows打包运行
你的电脑不可能一直开着机联网作为服务器:
我们将我们项目打包放到外部的服务器上,这样其他用户才能正常访问:
打包:
使用maven工具,maven clean后maven package。target下就有一个本项目名.jar的包
windows环境运行springboot的jar包:
本项目名.jar根目录文件夹上敲cmd,java -jar 项目名.jar
我们只需要敲上java -jar sp(jar包的首字母),然后tab键,windows系统会自动补全
由于打包前默认测试
可在右侧maven,本项目中lifeCycle,点一下test,点菜单上面的闪电,将其删除禁用掉即可。
注意事项
jar支持命令行启动需要依赖maven插件支持,请确认打包时是否具有SpringBoot对应的maven插件。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
有插件的打包后有发现META-INFO有MANIFEST.MF打开有Start-Class和Main-Class来加载引导类。
有插件的打包后有发现BOOT-INF里有lib依赖包,里面各种jar包。
org这个文件夹就是使得这个springboot项目能够独立运行的工具文件夹。里面有boot的类加载器。boot想要独立运行,需要class中项目文件和lib包,及org工具文件夹。
Linux打包运行
我们使用VM打开CentOS7的虚拟机
可用FinalShell或SecureCRT 8.5界面好一些。
finalshell可用SSH连接虚拟机的linux系统。
linux按安装jdk8centos7 安装jdk详细教程_centos7安装jdk_奇漠的博客-CSDN博客
usr下创建app目录 cd/usr mkdir app cd app
通常我们的项目的东西一般放到这个文件夹或~的文件夹下
将jar上传到这。
然后java -jar 项目名.jar即可运行,但是没连数据库,yml的url写的localhost
我们首先在linux中安装数据库,使用yam或rpm安装相同版本的mysql数据库:
Centos7在线安装MySQL5(教学版)_centos7安装mysql5_-starshine丨的博客-CSDN博客
安装完后,使用windows的navicat连一下,然后建表建数据,重新运行即可。
临时属性设置
java -jar springboot.jar --server.port=80
或idea中编辑启动中configuaration中环境中Program arguments: --server.port=80
生效原因:引导类main方法有args[]参数传递给引导类run的入参,其实为安全可删除入参args
ConfigurableApplicationContext ctx = SpringApplication.run(SpringbootBeginQuickstartApplication.class, args);
甚至可在引导类main方法中用arg[0]="--server.port=80"
设置开发环境临时属性
问题:开发时,我们使用我们的一些配置。在将来上线时,产品经理的一些设置,可能跟我们不一样。
0,普通yml(4级)
1 resource的config目录的yml优先级高于普通yml(3级)
springboot给我们提供了一套机制,可以在现有的配置的基础上在写一套application.yml配置来覆盖:
就在resource文件夹下,创建一个config目录,将新的配置文件放进去,就能覆盖原有的配置。
且这两个配置文件还有合作的关系,互补配置,冲突的部分config中的进行覆盖。
2, jar包和application.yml同级的yml优先级更高一些(2级)
再一个问题是:我们的数据库连接的密码时明文的:将来肯定不可能使用明文:
我们将开发的yml复制一份到打完jar包的项目的同级目录中:
也就是jar包和application.yml同级,然后在这个根目录进行java -jar运行,优先用平级的application.yml文件。这个这个同级的yml配置文件给运维人员使用。
3.jar包同级的config文件夹中的yml优先级更高(1级)
对于运维组的大boss,比如银行副行长级别的配置,还有一个:在该同级目录下,创建一个config目录,里面加上application.yml。对于加密,有些目录直接加了密,没有打开访问的权限
1级与2级留做系统打包后设置通用属性,1级常用于运维经理进行线上整体项目部署方案调控。3级与4级用于系统开发阶段设置通用属性,3级常用于项目经理进行整体项目属性调控。
项目类路径配置文件:服务于开发人员本机开发与测试
项目类路径config目录中配置文件:服务于项目经理整体调控工程路径配置文件:服务于运维人员配置涉密线上环境
工程路径config目录中配置文件:服务于运维经理整体调控
还可在Idea的启动参数,编辑启动中configuaration中环境中Program arguments: --server.port=80
配置--spring.config.name=ebank 这种方式有魅力和properties都支持可不写后缀。
或--spring.config.location=classpath:ebank.yml,也可
--spring.config.location=classpath:ebank.yml,--spring.config.location=classpath:ebank2.yml
谁在最后谁生效。
多环境开发
开发、测试 、生产
1、开发环境:开发环境时程序猿们专门用于开发的服务器,配置可以比较随意,为了开发调试方便,一般打开全部错误报告和测试工具,是最基础的环境。
2、测试环境:一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产服务器上,是开发环境到生产环境的过度环境。
3、生产环境:生产环境是指正式提供对外服务的,一般会关掉错误报告,打开错误日志,是最重要的环境。部署分支一般为master分支。
resource下的application.yml将这个配置文件进行copy,复制3份到resource目录下,
一定要以application-(环境名)命名,dev\pro\test。删除配置中其他东西,只留一些配置相关的:
在这个主yml文件中进行指定使用的yml配置文件
spring:
profiles:
active: dev
同理properties也类似,用spring.profiles.active=dev指定
多环境的分组管理
根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下
application-devDB.ymlapplication-devRedis.yml
application-devMVC.yml
想要使用的时候,直接include就ok了
spring:
profiles:
active: dev
include: devDB,devRedis,devMVC
springboot2.4版本后就提供了环境组group
spring:
profiles:
active: dev
group:
"dev": devDB,devMVC
"pro": proDB,proMVC
加载active为dev还是会加载dev的grop中的配置文件,还是后面的会覆盖前面的配置
如果maven中设置的为生产环境,springboot中设置的为开发环境
springboot是基于maven运行的。所以maven是主,springboot为辅。
pom中设置多环境
默认开启dev的环境:开哪个环境,profile.active的参数值就为哪个
pom文件依赖下方加入:
<profiles>
<profile>
<id>env_dev</id>
<properties>
<profile.active>dev</profile.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault><!--开启哪个环境,哪个环境生效-->
</activation>
</profile>
<profile>
<id>env_pro</id>
<properties>
<profile.active>pro</profile.active>
</properties>
</profile>
</profiles>
yml中加入
spring:
profiles:
active: @profile.active@
group:
"dev": devDB,devMVC
"pro": proDB,proMVC
这样的话,springboot就会随着maven的环境的变化而加载不同的springboot的环境配置了。使用maven控制boot环境后,现在maven和boot的环境就统一了。
日志
编程期调试代码
运营期记录信息
记录日常运营重要信息(峰值流量、平均响应时长……)记录应用报错信息(错误堆栈)
记录运维过程数据(扩容、宕机、报警……)
代码中使用日志工具记录日志
import org.slf4j.Logger;下的
@RestController//restful风格的controller
@RequestMapping("/books")
public class BookController {
private static final Logger log = LoggerFactory.getLogger(BookController.class);
@Autowired
private BookService bookService;
@GetMapping
public R getAll() {
log.debug("debug....");
log.info("info....");
log.warn("warn....");
log.error("error....");
return new R(true,bookService.list());
}
)
结果全在日志中不同颜色展示出来提示日志,且后面跟着参数里面的内容
默认使用的info级别及以上的级别
日志等级:debug>info>warn>error:设置为哪一等级,只会打印该等级及以下等级的日志。
debug级别需要自己手动打开:yml中设置:
#debug: true
logging:
level:
root: debug
若不想看系统及的debug,只看某个包下的debug,可以这样:
logging:
level:
root: info
com.kdy.controller: debug #设置某个包的日志级别
logging:
group:
ebank: com.kdy.controller,com.kdy.service,com.kdy.mapper
other: com.alibaba
level:
root: info
ebank: debug #对日志分组中的组设置日志级别
com.kdy.controller: debug #设置某个包的日志级别
抽取log对象
private static final Logger log = LoggerFactory.getLogger(BookController.class);反复写
找个地方写个父类
public class BaseClass {//让其它类来继承该类
private Class clazz;
public static Logger log;
public BaseClass(){
clazz = this.getClass();//这里的this是调用该构造方法的对象,也就是子对象,因为子类继承父类创建对象并不会创建父类对象,而是super代指父类对象,this是子类对象
log= LoggerFactory.getLogger(clazz);
}
}
@RestController//restful风格的controller
@RequestMapping("/books")
public class BookController extends BaseClass {
@Autowired
private BookService bookService;
@GetMapping
public R getAll() {
log.debug("debug....");
log.info("info....");
log.warn("warn....");
log.error("error....");
return new R(true,bookService.list());
}
}
使用Lombok并注入Slf4j也可使用log
@Slf4j
@RestController//restful风格的controller
@RequestMapping("/books")
public class BookController {
@Autowired
private BookService bookService;
@GetMapping
public R getAll() {
log.debug("debug....");
log.info("info....");
log.warn("warn....");
log.error("error....");
return new R(true,bookService.list());
}
}
日志输出格式控制
详见sringboot15
文件的形式记录日志
logging:
file:
name: server.log
项目根路径下。
设置定时生成一份日志文件,且设置日志文件的最大大小
logging:
file:
name: server.log
logback:
rollingpolicy:
max-file-size: 4KB
file-name-pattern: server.%d{yyyy-MM-dd}.%i.log