当前位置: 首页 > news >正文

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

nlp_gte_sentence-embedding_chinese-large在教育资源检索中的应用

nlp_gte_sentence-embedding_chinese-large在教育资源检索中的应用 1. 引言 教育资源检索一直是教育工作者和学习者面临的重要挑战。传统的检索方式往往依赖关键词匹配,当用户搜索"数学解题技巧"时,系统可能只能找到包含这些确切词汇的资源&…...

学术研究助手:OpenClaw+ollama-QwQ-32B文献分析工作流

学术研究助手:OpenClawollama-QwQ-32B文献分析工作流 1. 为什么需要AI辅助文献分析? 去年冬天,当我面对堆积如山的PDF论文时,突然意识到传统文献管理方式已经跟不上现代科研的节奏。手动标注关键结论、整理参考文献、绘制研究趋…...

论文写作“黑科技”:书匠策AI,让课程论文创作如行云流水

在学术的征途上,课程论文是每位学子必须跨越的一道门槛。从选题时的迷茫,到文献搜集的繁琐,再到撰写过程中的卡顿,每一步都似乎充满了挑战。但别怕,今天我要揭秘一个论文写作的“黑科技”——书匠策AI科研工具&#xf…...

手把手教你用yum在openEuler上安全升级OpenSSH 10.0p1(附完整命令集)

手把手教你用yum在openEuler上安全升级OpenSSH 10.0p1(附完整命令集) 最近在维护openEuler服务器时,发现系统自带的OpenSSH版本存在一些已知的安全漏洞。作为系统管理员,我深知SSH服务的安全性直接关系到整个服务器的访问安全。经…...

ESP32驱动BLE112模块的BGAPI通信实践指南

1. 项目概述 BLE112 是 Silicon Labs(现为 Skyworks)于 2012 年推出的首款基于 Bluegiga BGScript/BGAPI 架构的独立式蓝牙低功耗(BLE)模块。该模块采用 CC2540 兼容射频前端 专用 BLE 协议栈固件(BGStack v1.x&…...

5个实用案例展示梦幻动漫魔法工坊的强大生成能力

5个实用案例展示梦幻动漫魔法工坊的强大生成能力 1. 工具介绍与核心能力 梦幻动漫魔法工坊是一款基于Diffusion模型和LoRA微调技术的动漫图像生成工具。它能将文字描述转化为精美的二次元风格图像,特别适合创作可爱梦幻的动漫角色和场景。 这个工具的核心优势在于…...

MaixPy3开发环境搭建避坑指南:从驱动安装到板子连接(MAIX-ll-DOCK实测)

MaixPy3开发环境搭建避坑指南:从驱动安装到板子连接(MAIX-ll-DOCK实测) 当你第一次拿到MAIX-ll-DOCK开发板,准备开始你的嵌入式AI开发之旅时,最令人头疼的往往不是代码本身,而是环境搭建这个看似简单却暗藏…...

Lingyuxiu MXJ LoRA SpringBoot企业级集成:微服务架构实践

Lingyuxiu MXJ LoRA SpringBoot企业级集成:微服务架构实践 Lingyuxiu MXJ LoRA创作引擎不是又一个通用图生图工具。它从底层就只做一件事:把"唯美真人人像"这件事做到稳定、可控、可复现。 1. 企业级AI集成的挑战与机遇 现在很多企业都在尝试…...

直流电机PID控制硬件平台电路设计解析

1. 电路原理分析本项目为面向PID控制算法教学与实践的电机驱动硬件平台,核心目标是构建一个具备闭环反馈能力、参数可调、接口清晰且工程鲁棒性强的直流电机控制子系统。其硬件设计围绕“驱动—传感—控制”三要素展开,所有电路模块均服务于电机转速/位置…...

【黑马点评学习笔记 | 实战篇 】| 10-用户签到+UV统计

Bug如山勤为径,代码似海苦作舟。友友们好,这里是苦瓜大王。今天学习的是黑马点评项目实战篇——用户签到UV统计部分的学习。学完这一部分,主播会暂时将后面的高级篇和原理篇搁置,后面有时间了再学习。本节笔记如下,后续…...