Bug 解决 | 本地项目上线后出现错误
目录
一、前言
二、原因分析
1、本地代码误发线上
2、环境差异
3、配置差异
4、资源路径差异
5、API 接口差异
6、用量差异
一、前言
大家好,我是小洪爱分享。在开发上线项目的过程中,我们经常会遇到一种让人头疼的情况。那就是开发好的项目功能明明在本地运行和测试都没问题,但一旦上线运行,就出现各种问题,导致上线后还要回滚代码到正常的版本。
导致这种情况的原因实在是太多了,比如环境、依赖、配置、编码粗心、开发流程不规范等等,缺乏经验的情况下,想第一次就正常上线成功,还是挺难的。
但是正所谓 “吃一堑长一智”,出了问题就要想办法预防和解决,所以我写下这篇文章,给大家分享导致本地项目上线后出问题的经典原因和解决方案,希望能帮大家后续开发上线项目时,少踩一些坑。
大家看看下面这些情况,说的是不是你!搞不好都能全中!(反正我朋友都干过哈哈)

二、原因分析
1、本地代码误发线上
这个问题本质上是由于粗心导致的,很多同学为了自己本地开发方便,可能写了一些模拟数据、特殊逻辑(比如不判断用户权限),但是最后上线前不检查,就直接把特殊逻辑发到线上了,导致各种各样 “哭笑不得” 的问题。
这里有 2 种预防方式:
1)使用 CR(Code Review)机制,在自己的代码发布前,由同事或上级来检查代码,从而提前发现一些问题。
2)不要写仅本地可用的代码、尽量不写和环境有关的特殊逻辑,保证自己写的每行代码都是可发布上线的
虽然这个问题可以预防,但是无法根治,因为人本身就是最大的 Bug,一个再牛的人也可能会犯一些小错误。
2、环境差异
很多时候,同一套代码换一个环境可能就跑不通了。比如操作系统、网络连通、依赖服务、依赖版本、防火墙安全设置等等的差异。
举个典型的例子,本地的数据库新增了字段,测试通过了;结果上线前忘了在线上数据库同步新增字段,就导致数据库相关功能崩掉。
要解决这个问题,最好的办法就是尽量保证本地环境和线上环境一致,比如使用 Docker 容器等虚拟化技术来模拟线上环境运行。或者在正式上线前,通过测试环境、预发布环境来测试部署,降低环境差异的风险。
此外还有个建议,对于核心项目,团队内最好能整理出一个规范的部署文档、明确定义项目运行的环境,保证团队成员都能提前知晓这些信息并正确配置环境。
3、配置差异
由于本地和线上的环境可能存在差异,我们适用于本地的项目配置文件不一定适用于线上。
比如 Java 项目的 application.yml 文件,一般会定义项目启动的端口、依赖的数据库服务配置、cookie 配置等。如果在配置文件中指定项目在 8080 端口启动,你自己的电脑上运行可能没问题,但为啥发到线上就运行不起来或无法访问呢?
大概率是因为线上服务器的 8080 端口已经被其他人占用了;或者没有给该端口开启防火墙,导致无法访问。
为了解决这个问题,通常我们会分别为本地和线上指定不同的配置,比如区分 application-dev.yml 、application-prod.yml 等,不同的环境加载不同的配置文件。
还可以使用一些可视化的配置管理工具(比如 Apollo、Nacos),让管理员统一在工具上发布不同环境的配置,并通过工具校验配置并记录变更,减少人工导致的配置差错。
4、资源路径差异
如果你的项目中引用了本地文件(比如 C 盘的 xxx.txt),那么上线后大概率会报错。因为线上的服务器并没有该路径、或者在该路径下没有文件。
为了解决这个问题,建议大家尽量使用相对路径去加载资源;或者使用集中的分布式文件系统、对象存储服务等,给每个资源一个统一确定的标识(比如网址),保证各机器上都能用相同的路径找到该资源。
5、API 接口差异
这个问题更多地是出现在前端。一般情况下,前端本地调试时请求的是后端的开发服务,而上线后请求的是线上服务。不仅请求的路径不同的,还可能出现跨域问题,导致接口请求失败、无法登录等问题。
所以尽量保证开发和线上接口的路径规范一致,对于跨域问题可以使用 Nginx 网关的反向代理功能统一解决。
另外,在企业开发中,一般开发环境和线上环境的网络是隔离的。如果你的代码依赖一些第三方接口,一定要注意接口的网络连通性、接口的性能差异等问题,提前做好相关的测试。
还有一种情况,在使用有回调功能的第三方服务(比如公众号开发)时经常会出现,那就是忘记了修改第三方服务的回调地址。而且这种错误不好排查,因为你能请求通别人的服务,只不过别人的服务通知不到你罢了。所以要格外留意这种情况。
6、用量差异
这是所有上线出 Bug 的情况中,我个人认为最高级的了,而且很难绝对避免。
由于本地、测试等非线上环境,通常比线上真实业务的数据量、调用量、负载压力小很多,所以很多问题不到线上很难发现。
比如你开发自测时,可能用单线程跑的好好的,结果一上线,有 10 个线程同时请求,服务就挂了、或者数据就不一致了。
还有你在开发自测时,可能系统压力很小,数据库、Redis 都跑的很开心。结果一上线,百万个用户一人存个数据,你的数据存储服务就都爆满了。
为了防止这些用量差异带来的问题,我们开发测试过程中不能只是简单地测试功能是否可用,还要使用 JMeter 等专业的压力测试工具,来验证系统的性能、稳定性和可用性。
再扩展一点,即使项目刚上线的时候没问题,也不代表一直没问题。比如外卖系统,一般中午饭点是流量的高峰,可能在这个时候系统扛不住了会崩掉,但其他时候都是正常的。所以对于用户量和规模较大的项目,我们要结合具体的业务和用户使用情况来分析,并采用不同的策略(比如流量的削峰填谷)来优化系统。
另外,大公司有的时候还会搞故障演练,就是故意模拟给你的系统制造故障,看看它多久能恢复。这样真出了事也能很快地处理,不至于被说 “降本增笑” 了。
OK,以上就是本期分享,不知道上面的坑大家踩过几个呢?
下次你认识的人或同事如果出现了上面的问题,请务必把这篇文章转给他看!
希望对大家有所帮助,关注我!不定期分享有用干货!!!
如果有疑问的可以评论提出来~
相关文章:
Bug 解决 | 本地项目上线后出现错误
目录 一、前言 二、原因分析 1、本地代码误发线上 2、环境差异 3、配置差异 4、资源路径差异 5、API 接口差异 6、用量差异 一、前言 大家好,我是小洪爱分享。在开发上线项目的过程中,我们经常会遇到一种让人头疼的情况。那就是开发好的项目功能…...
为什么我工作 10 年后转行当程序员?逆袭翻盘!
今天文章的主人公暂且称他为 A 君。不过 A 君有点特别,非科班,工作 10 年后才转行 iOS 程序员。今年 36 岁,目前在某行业头部企业任职前端负责人,管理 40 人的前端团队。 废话不多说,我们开始 A 君(为了描…...
见证中国数据库的崛起:从追赶到引领的壮丽征程《四》
见证中国数据库的崛起:从追赶到引领的壮丽征程《四》 四、未来展望:中国数据库的机遇与挑战新技术带来的机遇全球化竞争的挑战数据安全与隐私保护的挑战人才培养的持续挑战 【纪录片】中国数据库前世今生 在数字化潮流席卷全球的今天,数据库作…...
OpenCV||超细节的基本操作
一、图像读取 retval cv2.imread(filename[, flags]) filename:需要读取的图片路径名,支持多种图片格式,如JPEG、PNG、TIFF等。flags:一个可选参数,指定加载图像的颜色类型。常用的值包括: cv2.IMGEAD_A…...
算法训练(leetcode)第三十八天 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和、392. 判断子序列
刷题记录 *1143. 最长公共子序列1035. 不相交的线53. 最大子数组和392. 判断子序列 *1143. 最长公共子序列 leetcode题目地址 本题和718. 最长重复子数组相似,只是本题不要求连续,需要记录前面最长的子序列,在此基础上累计长度。 dp[i][j]…...
STM32——外部中断(EXTI)
目录 前言 一、外部中断基础知识 二、使用步骤 三、固件库实现 四、STM32CubeMX实现 总结 前言 外部中断(External Interrupt,简称EXTI)是微控制器用于响应外部事件的一种方式,当外部事件发生时(如按键按下、传感器信号…...
MySQL多实例部署
1、软件包下载 //环境:一台rocky Linux虚拟机,并且做好的基本配置及时钟同步,使用Xshell连接 [rootmysql ~]# yum -y install tar lrzsz libncurses* libaio perl//将包文件拖进去 [rootmysql ~]# rz -E rz waiting to receive. [rootmysql…...
云开发喝酒小程序3.6全新漂亮UI猜拳喝酒小程序 【已去除流量主】
云开发喝酒小程序3.6全新漂亮UI猜拳喝酒小程序 已去除流量主。UI特别漂亮,实属精品代码。 【已测】云开发喝酒小程序3.6漂亮UI猜拳喝酒小程序 已去除流量主。 云开发(serverless)小程序无需服务器,注册一个小程序就可以直接上线…...
图论进阶之路-最短路(Floyd)
时间复杂度:O(n^3) 使用场景:当需要得知任意两个点的最短距离以及其路径时使用 准备:需要两个矩阵 一个记录最短距离(D) 一个记录最短路径的最后一个结点(P) 其核心在于不断的判断越过中间…...
安装sqllab靶机之后,练习关卡报403 forbidden
解决办法: 在nginx的conf文件中添加上访问index.php vim /usr/local/nginx/conf/nginx.conf 保存退出 再重启一下nginx,就完成了。 ./nginx -s reload...
微信VX多开 免扫码 登录 互斥体 可视化 Exui v1.1 易语言源码附成品软件
UI设计: 1. EXUI界面库20240204 调用的模块: 1. wow64_hook_3.02.ec(压缩包内含) 2. 精易模块[v11.1.0].ec(自行下载) 更新日志: v1.1 2024年7月25日13:28:43 { 1. 有人反馈 设置了V…...
JavaEE 从入门到精通(一) ~ Maven
晚上好,愿这深深的夜色给你带来安宁,让温馨的夜晚抚平你一天的疲惫,美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 1.1 概念 什么是 Maven? Maven 的核心概念 1.2 maven依赖坐标 1.3 maven仓库 1.4 maven安装 1.5 mave…...
滚珠丝杆与丝杆支撑座:稳定性与精度的双重保障
丝杆支撑座是连接滚珠丝杆与电机的轴承,采用优质的轴承能确保支撑座与滚珠丝杆之间的刚性平衡。那么,滚珠丝杆搭连接杆支撑座有哪些优缺点呢? 正常情况下,丝杆支撑座能够提供稳定的支撑力,确保滚珠丝杆在复杂工况下保持…...
实验5-11 空心的数字金字塔
本题要求实现一个函数,输出n行空心的数字金字塔。 函数接口定义: void hollowPyramid( int n );其中n是用户传入的参数,为[1, 9]的正整数。要求函数按照如样例所示的格式打印出n行空心的数字金字塔,请注意,最后一行的…...
C#对象和类型
属性、方法、字段 字段和属性的区别 在C#中,字段(fields)和属性(properties)都是类的成员,它们提供了类存储数据的方式,但它们在用途和功能上有着明显的区别。 字段 字段通常用来存储类…...
免费分享一套SpringBoot+Vue图书(图书借阅)管理系统【论文+源码+SQL脚本】,帅呆了~~
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue图书(图书借阅)管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue图书(图书借阅)管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 本论文阐述了一套先进的图书管理系…...
数据结构与算法--队列
文章目录 提要队列的定义队列的认识队列的应用队列的抽象数据类型队列的存储结构队列的链式存储结构与实现链队的进队和出队操作链队的数据类型初始化链队列入队操作出队操作队列的顺序存储结构与实现顺序队列的假溢出问题队列上溢循环队列循环队列取下一相邻单元下标运算队满与…...
<Qt> 常用控件
目录 一、控件概述 二、QWidget 核心属性 (一)QWidget的核心属性概览 1. enabled 2. geometry 3. WindowFrame的影响 4. windowTitle 5. window Icon 6. windowOpacity 7. cursor 8. font 9. toolTip 10. focusPolicy 11. styleSheet 三、…...
关于C/C++的编译、构建、CMake、x86_amd64等问题(自用)
被这些玩意整红温了 编译器版本 x86:编译器为x86版本,输出文件为x86。amd64_x86:编译器为amd64版本,输出文件为x86。amd64:编译器为amd64版本,输出文件为amd64。x86_amd64:编译器为x86版本&am…...
【设计模式】工厂模式详解
1.简介 工厂模式是一种创建型设计模式,通过提供一个接口或抽象类来创建对象,而不是直接实例化对象。工厂模式的主要思想是将对象的创建与使用分离,使得创建对象的过程更加灵活和可扩展。 工厂模式主要包括以下角色: 抽象工厂&a…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
