SpringBoot运维

能够掌握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.yml

application-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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/52343.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式之四:工厂模式

引言&#xff1a;除了使用new操作符之外&#xff0c;还有更多制造对象的方法。同时&#xff0c;实例化这个活动不应该总是公开地进行。 1.简单工厂模式 这里有一些相关的具体类&#xff0c;要在运行时有一些具体条件来决定究竟实例化哪个类。这样的代码&#xff08;if..elseif…

MFC自定义控件使用

用VS2005新建一个MFC项目,添加一个Custom Control控件在窗体 我们需要为自定义控件添加一个类。项目,添加类,MFC类 设置类名字,基类为CWnd,你也可以选择CDialog作为基类 类创建完成后,在它的构造函数中注册一个新的自定义窗体,取名为"MyWindowClass" WNDCL…

深入了解HTTP代理在网络爬虫与SEO实践中的角色

随着互联网的不断发展&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;成为各大企业和网站重要的推广手段。然而&#xff0c;传统的SEO方法已经难以应对日益复杂和智能化的搜索引擎算法。在这样的背景下&#xff0c;HTTP代理爬虫作为一种重要的工具&#xff0c;正在逐渐被…

JUC中其他常用类

1.CopyOnWriteArrayList ArrayList是线程不安全的&#xff0c;Vector是线程安全的(方法被Synchronized修饰)&#xff0c;CopyOnWriterArrayList是在Vector的基础上再做优化&#xff0c;因为当读取操作较多时&#xff0c;Vector的效率不高。CopyOnWriterArrayList中读操作并没有…

ceph-mon运行原理分析

一、流程&#xff1a;ceph-deploy部署ceph-mon组建集群 1.ceph-deploy部署ceph-mon的工作流程及首次启动 1&#xff09;通过命令创建ceph-mon&#xff0c;命令为&#xff1a;ceph-deploy create mon keyring def mon(args):if args.subcommand create:mon_create(args)elif…

苍穹外卖day07——缓存菜品套餐+购物车功能实现

缓存菜品——需求设计与分析 问题说明 用户访问量过大带来的一个直接效果就是响应速度慢&#xff0c;使用体验下降。 实现思路 使用redis缓存菜品数据&#xff0c;减少数据库查询操作。 页面展示上基本就是同一个分类在同一页&#xff0c;所以key-value结构可以使用不同的分…

Vue没有node_modules怎么办

npm install 一下 然后再npm run serve 就可以运行了

记一次偶然的网站sql注入

自己学了点渗透的内容后就开始尝试挖漏洞了&#xff0c;偶然发现了这个yp网站&#xff0c;由于好奇心就浏览了一下里面的内容&#xff0c;突然注意到有个id的地方跳转页面&#xff0c;于是就想试试看有没有注入&#xff0c;就有了以下的内容。。。 界面如下 当时就是好奇点进去…

事件标志组

Q: 什么是事件标志组&#xff1f; A: 事件标志位&#xff1a;表明某个事件是否发生&#xff0c;联想&#xff1a;全局变量 flag。通常按位表示&#xff0c;每一个位表示一个事件&#xff08;高8位不算&#xff09; 事件标志组是一组事件标志位的集合&#xff0c; 可以简单的理…

ElasticSearch基础篇-Java API操作

ElasticSearch基础-Java API操作 演示代码 创建连接 POM依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…

springCloud Eureka注册中心配置详解

1、创建一个springBoot项目 2、在springBoot项目中添加SpringCloud依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.3</version><type>…

从源程序到可执行文件的四个过程

从源程序到可执行文件的四个过程 预处理编译汇编链接 程序要运行起来&#xff0c;必须要经过四个步骤&#xff1a;预处理、编译、汇编和链接&#xff0c;如下图所示&#xff1a; -E选项&#xff1a;提示编译器执行完预处理就停下来&#xff0c;后边的编译、汇编、链接就先不执…

关于在VS2017中编译Qt项目遇到的问题

关于在VS2017中编译Qt项目遇到的问题 【QT】VS打开QT项目运行不成功 error MSB6006 “cmd.exe”已退出,代码为 2。如何在VS2017里部署的Qt Designer上编辑槽函数 【QT】VS打开QT项目运行不成功 error MSB6006 “cmd.exe”已退出,代码为 2。 链接 如何在VS2017里部署的Qt Design…

flask实现一个登录界面

flask实现一个登录界面 基础的Flask项目结构 forms.py&#xff1a;定义登录表单和表单字段的文件。templates/login.html&#xff1a;用于渲染登录表单的 HTML 模板文件。routes.py&#xff1a;定义应用的路由和视图函数的文件。__init__.py&#xff1a;创建并初始化 Flask 应…

解压缩软件WinRAR-bandizip-7z--洛

个人收集的解压软件&#xff01;后期还会更新 ------------------------------------------------------------------- WinRAR&#xff1a;密码1234WinRARhttps://wwzb.lanzoue.com/b0485ldcj BandiZip&#xff1a;密码1234 Bandizip-Professionalhttps://wwzb.lanzoue.com/…

SpringBoot内嵌的Tomcat:

SpringBoot内嵌Tomcat源码&#xff1a; 1、调用启动类SpringbootdemoApplication中的SpringApplication.run()方法。 SpringBootApplication public class SpringbootdemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootdemoApplicat…

windows下载安装FFmpeg

FFmpeg是一款强大的音视频处理软件&#xff0c;下面介绍如何在windows下下载安装FFmpeg 下载 进入官网: https://ffmpeg.org/download.html, 选择Windows, 然后选择"Windows builds from gyan.dev" 在弹出的界面中找到release builds, 然后选择一个版本&#xff0…

如何在MacBook上彻底删除mysql

好久以前安装过&#xff0c;但是现在配置mysql一直出错&#xff0c;索性全部删掉重新配置。 一、停止MySQL服务 首先&#xff0c;请确保 MySQL 服务器已经停止运行&#xff0c;以免影响后续的删除操作。 sudo /usr/local/mysql/support-files/mysql.server stop如果你输入之…

【RTT驱动框架分析03】- sfus flash 操作库的分析和基于STM32F103RCT6+CUBEMX的SFUS移植教程

sfus flash 操作库的分析 sfus 抽象 /*** serial flash device*/ typedef struct {char *name; /**< serial flash name */size_t index; /**< index of flash device information table see flash_…

IntelliJ IDEA流行的构建工具——Gradle

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 如…