记一次改代码后本地正常,开发环境服务能启动,一个生产环境发布正常,另一个生产环境服务启动失败的事故(还好没杀程序员祭天)以警示

本文主要是介绍记一次改代码后本地正常,开发环境服务能启动,一个生产环境发布正常,另一个生产环境服务启动失败的事故(还好没杀程序员祭天)以警示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述:这两天在工作中的两个项目优化一点同样写死的代码,大概是这样的↓

1203220171237629901和1203220171237629902是写死的,但其实可以通过Redis中动态获取,改完之后一个项目中本地测试跑main方法没问题,服务也能启动↓

另一个项目本地启动服务也能起来,不过有一些相关的报错↓

发布到线上后,服务启动失败,一个Service对象创建失败↓

子系统宕机10分钟,被运维人员吐槽,还好不是白天,要不然真是要杀程序员祭天了,扣绩效都是小事。

 

项目概况和环境:改动涉及到两个工程,都是Spring Boot项目,一个工程是用来定时跑任务的,一个工程是业务后台,跑任务的工程没用配置中心,跑业务后台的工程用了配置中心,配置中心这边有公共的配置文件application.yml,以及多个服务各个环境的配置文件↓

   

 

 

分析问题:

找到创建失败的Service,发现在static代码块有一句代码是通过RedisTemplate获取器的一个方法获取RedisTemplate对象,熟悉Spring的后端开发同学都知道Service对象会纳入Spring Bean管理,自动初始化,static代码块中的代码会随着初始化,此时就会获取RedisTemplate对象,而要获取Redis肯定要依赖配置文件的配置,代码也是这么写的↓

本地环境是dev,会去找application-dev.yml,本地也有这个文件,跑任务的工程发布到开发环境,此时环境也是dev,正常,发布到正式环境是prod,也正常。业务后台的工程当时没有发布到开发环境,直接发到线上去了,服务启动失败。我就很纳闷为什么同样的修改一个生产正常,一个生产事故,后来再仔细想了下,发现问题:跑任务的工程没有用配置中心,线上环境有各个环境对应的application-%s.yml文件并且有Redis配置,跑业务后台的工程用了配置中心,没有application-prod.yml文件导致报错。

 

心得:

1.要遵循发布流程,上生产的代码一定要先上测试环境通过测试

2.要求自己把控好质量关,开发环境一定要验证,而不仅仅只是单元测试或者跑main方法通过就行了

3.加强工作中的沟通,存在不确定时要询问主管或其他同事确认

欢迎各位大佬留言讨论。我还不想死呀,以后要更严谨。

这篇关于记一次改代码后本地正常,开发环境服务能启动,一个生产环境发布正常,另一个生产环境服务启动失败的事故(还好没杀程序员祭天)以警示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055671

相关文章

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

关于DNS域名解析服务

《关于DNS域名解析服务》:本文主要介绍关于DNS域名解析服务,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录DNS系统的作用及类型DNS使用的协议及端口号DNS系统的分布式数据结构DNS的分布式互联网解析库域名体系结构两种查询方式DNS服务器类型统计构建DNS域

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN