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…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...