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: devinclude: devDB,devRedis,devMVC

springboot2.4版本后就提供了环境组group

spring:profiles:active: devgroup:"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);@Autowiredprivate BookService bookService;@GetMappingpublic 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: infocom.kdy.controller: debug #设置某个包的日志级别
logging:group:ebank: com.kdy.controller,com.kdy.service,com.kdy.mapperother: com.alibabalevel:root: infoebank: 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 {@Autowiredprivate BookService bookService;@GetMappingpublic 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 {@Autowiredprivate BookService bookService;@GetMappingpublic 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.loglogback:rollingpolicy:max-file-size: 4KBfile-name-pattern: server.%d{yyyy-MM-dd}.%i.log

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【使用维纳滤波进行信号分离】基于维纳-霍普夫方程的信号分离或去噪维纳滤波器估计(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

BUU [网鼎杯 2020 朱雀组]phpweb

BUU [网鼎杯 2020 朱雀组]phpweb 众生皆懒狗。打开题目&#xff0c;只有一个报错&#xff0c;不知何从下手。 翻译一下报错&#xff0c;data()函数:,还是没有头绪&#xff0c;中国有句古话说的好“遇事不决抓个包” 抓个包果然有东西&#xff0c;仔细一看这不就分别是函数和参…

MySQL 数据库 【增删查改(二)】

目录 一、表的设计 1、一对一 2、一对多 3、多对多 二、新增 三、查询 1、聚合查询 &#xff08;1&#xff09;聚合函数&#xff1a; &#xff08;2&#xff09; group by 子句 &#xff08;3&#xff09;having 2、联合查询 (1)内连接 (2)外连接 (3)自链接 (4)…

142. 环形链表 II

142. 环形链表 II 中等 2.2K 相关企业 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定…

服务器(容器)开发指南——SSH打洞开发

文章目录 SSH容器服务打包测试服务文件镜像打包 SSH打洞开发部署带SSH的容器SSH连接服务器&#xff08;容器内部&#xff09;SSH访问容器内的缺陷 IDE远程SSH开发VSCode远程SSH开发Jetbrains系列产品SSH远程开发 在进行定制化的服务开发时&#xff0c;我们有时候只能在固定的服…

没有使用IaC的DevOps系统都是耍流氓 |IDCF

作者&#xff1a;徐磊 文章首发地址&#xff1a;https://smartide.cn/zh/blog/2022-1010-iac/ 作为现代软件工程的基础实践&#xff0c;基础设施即代码&#xff08;Infrastructure as Code, IaC&#xff09;是云原生、容器、微服务以及DevOps背后的底层逻辑。应该说&#xff…

layui框架学习(34:数据表格_基本用法)

Layui中的数据表格模块table支持动态显示并操作表格数据&#xff0c;之前学习的页面元素中的表格主要是通过使用样式及属性对表格样式进行设置&#xff0c;而table模块支持动态显示、分页显示、排序显示、搜索等形式各样的动态操作&#xff0c;参考文献3中也给出了数据表格的各…

Git初始化

查看git版本 git --version 设置Git的配置变量 方法&#xff1a; 修改全局文件&#xff08;用户主目录下.gitconfig&#xff09;修改系统文件&#xff08;如/etc/gitconfig&#xff09; 用户姓名和邮件地址 修改用户名和邮件地址 git config --global user.name "用…

LLM系列 | 18 : 如何用LangChain进行网页问答

简介 一夕轻雷落万丝&#xff0c;霁光浮瓦碧参差。 紧接之前LangChain专题文章&#xff1a; 15:如何用LangChain做长文档问答&#xff1f;16:如何基于LangChain打造联网版ChatGPT&#xff1f;17:ChatGPT应用框架LangChain速成大法 今天这篇小作文是LangChain实践专题的第4…

Qt: 查看qmake相关参数设置

Qt开发中&#xff0c;经常会遇到qmake相关问题&#xff0c;比如同时安装了多个Qt版本的情况。比如我的情况是系统自带了Qt 5.12.8, 但是开发中遇到一些兼容性问题&#xff0c;于是又手动安装了5.9.8。 查看qmake版本&#xff0c;qmake -v, 虽然项目中已经指定了5.9.8, 但是系统…

爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB

目录 一、网站分析二、定位监听三、熟悉AES-ECB四、调试分析五、node运行js六、Python执行js 一、网站分析 三年前的案例&#xff0c;我的原始文章网站 &#xff0c;如图我们直接点击标题进入到详情页&#xff0c;链接会发生跳转&#xff0c;且与我们在详情看到的链接&#xf…

iOS开发-格式化时间显示刚刚几分钟前几小时前等

iOS开发-格式化时间显示刚刚几分钟前几小时前等 在开发中经常遇到从服务端获取的时间戳&#xff0c;需要转换显示刚刚、几分钟前、几小时前、几天前、年月日等格式。 主要用到了NSCalendar、NSDateComponents这两个类 NSString *result nil;NSCalendarUnit components (NSC…

【后端面经】微服务构架 (1-6) | 隔离:如何确保心悦会员体验无忧?唱响隔离的鸣奏曲!

文章目录 一、前置知识1、什么是隔离?2、为什么要隔离?3、怎么进行隔离?A) 机房隔离B) 实例隔离C) 分组隔离D) 连接池隔离 与 线程池隔离E) 信号量隔离F) 第三方依赖隔离二、面试环节1、面试准备2、基本思路3、亮点方案A) 慢任务隔离B) 制作库与线上库分离三、章节总结 …

以智慧监测模式守护燃气安全 ,汉威科技“传感芯”凸显智慧力

城市燃气工程作为城市基建的重要组成部分&#xff0c;与城市居民生活、工业生产紧密相关。提升城市燃气服务质量和安全水平&#xff0c;也一直是政府和民众关注的大事。然而&#xff0c;近年来居民住宅、餐饮等工商业场所燃气事故频发&#xff0c;时刻敲响的警钟也折射出我国在…

MySQL高级篇第4章(逻辑架构)

文章目录 1、逻辑架构剖析1.1 服务器处理客户端请求1.2 Connectors1.3 第一层&#xff1a;连接层1.4 第二层&#xff1a;服务层1.5 第三层&#xff1a;引擎层1.6 存储层1.7 小结 2、SQL执行流程2.1 MySQL 中的 SQL执行流程2.2 MySQL8中SQL执行原理2.3 MySQL5.7中SQL执行原理2.4…

9条建议告诉你如何正确处理PCB设计布线

一、关于PCB布线线宽 1、布线首先应满足工厂加工能力&#xff0c;首先向客户确认生产厂家&#xff0c;确认其生产能力&#xff0c;如图1所示。如客户无要求&#xff0c;线宽参考阻抗设计模板。 图1 PCB板厂线宽要求 2、阻抗模板&#xff0c;根据客户提供的板厚及层数要求&…

LeetCode208.Implement-Trie-Prefix-Tree<实现 Trie (前缀树)>

题目&#xff1a; 思路&#xff1a; tire树&#xff0c;学过&#xff0c;模板题。一种数据结构与算法的结合吧。 代码是&#xff1a; //codeclass Trie { private:bool isEnd;Trie* next[26]; public:Trie() {isEnd false;memset(next, 0, sizeof(next));}void insert(strin…

【环境配置】使用Docker搭建LAMP环境

这篇文章不是介绍DOCKER是什么&#xff0c;也不是阐述DOCKER的核心&#xff1a;镜像/容器和仓库之间的关系,它只是一篇让刚刚接触DOCKER的初学者&#xff0c;在没有完全了解DOCKER是什么之前,也能尽快的在Linux系统下面通过DOCKER来搭建一个LAMP环境&#xff0c;这是其一&#…

工作中遇到的关于配置问题

工作中遇到的问题 想记录一下 一个程序员小白每天遇到的问题 1.创建了一个Maven的web工程&#xff0c;但是启动一直是404&#xff0c;原服务器未能找到目标资源 解决办法&#xff1a; 选择deployment&#xff0c;点击加号选择war格式就OK啦 目录里面无法创建类&#xff0…

深蓝学院C++基础与深度解析笔记 第13章 模板

1. 函数模板 ● 使用 template 关键字引入模板&#xff1a; template<typename T> //声明&#xff1a;T模板形参void fun(T); // T 函数形参template<typename T> //定义void fun(T) {...}– 函数模板不是函数 –…