外部工具包不要依赖服务的环境变量

1. 前言

虽然这周才过去一天,但自己真的是被bug围住了,果然程序员每天的工作就是在写bug<->解决bug中无限循环。今天遇到了之前给项目写的一个工具包的bug,这个工具包因为需要抽出来给到其他组使用,所以抽成了类工具包的一个小的项目。
在遇到bug之前,这个工具包都很正常的运行,直到遇到bug,这个bug的产生是因为这个工具包是从之前的单体服务中抽取出来的,于是对于一些环境变量的判断,也一起带过来了,而这些就是bug产生的主因。

2. bug模样

这个bug产生的原因是因为我依赖了使用这个工具包的服务的环境变量,这个在遇到bug之前并没有意识到,以为从单体服务中拆出来,这个环境变量一定会通过类似service_name=hello_service ./bin/main这样的命令去启动,这样启动后,服务中的工具包获取环境变量只需要采用os.Getenv("service_name")就可以正确的获取到对应的service_name了。
这个在我们的单体服务中是没有问题的,因为服务发布最后的部署脚本是通过这种方式启动的service_name=hello-service ./bin/main,但能够bug就说明一定存在漏网之鱼,这个漏网之鱼就是docker镜像的启动,这个镜像启动的时候是直接通过./bin/main直接启动了,导致采用此镜像启动的服务就缺失了service_name,于是就造成了这个问题。

func main() {if serviceName := os.Getenv("service_name"); serviceName != "" && serviceName="hello_service" {fmt.Println(serviceName) // if have serviceName and serviceName is hello_service, execute this logic} else {// if not have serviceName or name is not hello_service, do other logics.fmt.Println("env variable not have service_name, please check") }
}

3. 经验

虽然确实是个屁大的bug,但是以为会获取到的变量没有获取到而走到了其他的逻辑,这种往小了说可能影响不大,往大了说这个影响还是很大的。后面自我反思确实不应该能够让工具包依赖环境变量,因为你永远不知道使用者部署在什么样的环境中,而你提供的只是工具的能力。
编写的外部工具包不要依赖服务的环境变量,如果要依赖的话,尽量在获取不到环境变量的时候抛出错误或者给出一些信息提示,防止服务启动之后因为工具包中的环境变量判断失误而导致逻辑失效或者逻辑错误!

4. 小结

遇到bug,就感觉很挫败,但确实是自己没有意识到这个问题,包括在自测以及QA同学测试过程中,都没有意识到这个问题,最后上线虽然没有出问题,但只是暂时的安全,因为docker镜像一旦启动,问题就贯穿其中了。做事的时候还是要思考的全面一些,这个bug属于原则性问题导致的bug,如果自己之前就能够对工具包不要依赖服务环境变量有一个比较清晰的认知,这个bug以及服务中依赖环境变量判断的逻辑就不会这个写了,bug也就自然不存在了。

2024-4-2 22:44:33 写于深圳,Keep thinking, keep coding!

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

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

相关文章

互联网、因特网、万维网的区别

互联网 internet&#xff1a;凡是能彼此通信的设备组成的网络就叫互联网&#xff0c;即使只有两台计算机&#xff0c;无论以何种技术使其彼此通信&#xff0c;都叫互联网。所以&#xff0c;根据互联网的覆盖规模可以分为&#xff1a; 局域网&#xff08;Local Area Network&am…

初学者必看!Python wtforms库让你轻松创建和验证Web表单

1. 什么是WTForms 库? WTForms 是一个 Python 库&#xff0c;用于在 Web 应用程序中创建和验证表单。它提供了一个简单的接口来定义表单字段和验证规则&#xff0c;并将它们呈现为 HTML 表单。WTForms 支持多种 Web 框架&#xff0c;包括 Flask、Django 和 Pyramid。 2. 核心…

NSSCTF Round#20 Basic 真亦假,假亦真 CSDN_To_PDF V1.2 出题笔记 (附wp+源码)

真亦假&#xff0c;假亦真 简介&#xff1a;java伪造php一句话马。实则信息泄露一扫就出&#xff0c;flag在/flag里面。 题目描述&#xff1a;开开心心签个到吧&#xff0c;祝各位师傅们好运~ 静态flag&#xff1a;NSS{Checkin_h4v3_4_g00D_tINNe!} /路由显示 <?php e…

【MyBatis】MyBatis的日志实现

目录 一、日志演变 二、MyBatis中实现日志管理 1.导入pom依赖 2.添加logback配置文件 3.日志打印 三、MyBatis日志技术实现原理 3.1 初始化 3.2 具体实现类 3.3 自己模拟实现mybaits的日志实现 四、架构系统如何考虑日志 一、日志演变 JDK 1.4之前 没有任何的日志框…

vue 移动端弹窗带滚动效果 滚动到底的时候弹窗下的页面会跟着滑动

<template><div class"wrap" :style"dynamicStyle"><!--dynamicStyle主要是介个 通过computed设置postion的值 弹窗的时候设置为fixed 关闭弹窗的时候设置为unset--><div class"banner-wrap"><img src"/assets/…

16.Python多线程

如果想让我们的程序同时执行多个任务&#xff0c;就需要使用多线程技术了 。到目前为止&#xff0c;我们编写的程序都是单线程的&#xff0c;在运行时一次只能执行 一个任务。 1 线程相关的知识 1.1 进程 一个进程就是一个正在执行的程序&#xff0c;每一个进程都有自己独立…

sklearn主成分分析PCA

文章目录 基本原理PCA类图像降维与恢复 基本原理 PCA&#xff0c;即主成分分析(Principal components analysis)&#xff0c;顾名思义就是把矩阵分解成简单的组分进行研究&#xff0c;而拆解矩阵的主要工具是线性变换&#xff0c;具体形式则是奇异值分解。 设有 m m m个 n n …

Linux内存管理 —— 通过实验学习和理解CoW(2)

文章目录 作者环境概述正文父进程执行fork时将可写的页面设置成只读copy_mmdup_mmdup_mmapcopy_page_range父进程首先写时,触发CoWhandle_pte_faultdo_wp_pagewp_page_copy子进程随后在写时触发缺页作者 pengdonglin137@163.com 环境 Linux-6.5 + ARM64 概述 前一篇通过实…

Rust---有关介绍

目录 Rust---有关介绍变量的操作Rust 数值库&#xff1a;num某些基础数据类型序列(Range)字符类型单元类型 发散函数表达式&#xff08;&#xff01; 语句&#xff09; Rust—有关介绍 得益于各种零开销抽象、深入到底层的优化潜力、优质的标准库和第三方库实现&#xff0c;Ru…

蚁剑流量分析

蚁剑流量分析 在靶机上面上传一个一句话木马&#xff0c;并使用蚁剑连接&#xff0c;进行抓包, 一句话木马内容 <?php eval($_POST[1]); defalut编码器 在使用蚁剑连接的时候使用default编码器 连接之后进行的操作行为是查看当前目录(/var/www/html)下的文件&#xff0…

数据结构进阶篇 之 【插入排序】详细讲解(直接插入排序,希尔排序)

千万不要因为一件事不会做而失去信心&#xff0c;你又不是只有这一件事不会&#xff0c;你还有很多呢 一、插入排序 1.直接插入排序 InsertSort 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 直接插入排序的特性总结 2.希尔排序 ShellSort 2.1 基本思想 2.2 实现原理 …

Sora 基础作品之 DiT:Scalable Diffusion Models with Transformer

Paper name Scalable Diffusion Models with Transformers (DiT) Paper Reading Note Paper URL: https://arxiv.org/abs/2212.09748 Project URL: https://www.wpeebles.com/DiT.html Code URL: https://github.com/facebookresearch/DiT TL;DR 2022 年 UC Berkeley 出…

罗克韦尔AB的PLC协议和西门子PLC协议转换网关

下面是罗克韦尔(AB)的Compact系列的PLC与西门子S7-1500之间的通讯的配置&#xff0c;实现AB的标签数组与西门子DB数据块之间通讯。 首先在AB的PLC内建立输入和输出数组&#xff0c;用于接收和写入S7-1500的PLC数据&#xff0c;名称分别是IN_INT16、OUT_OUT16&#xff0c;输入80…

为“自研”的KV数据库编写JDBC驱动

一觉醒来&#xff0c;受到梦的启发&#xff0c;自研了一套K/V数据库系统&#xff0c;因为"客户"一直催促我提供数据库的JDBC驱动&#xff0c;无奈之下&#xff0c;只好花费一个上午的时间为用户编写一个。 我们知道&#xff0c;JDBC只定义一系列的接口, 具体的实现需…

6个黑科技网站,永久免费

1、http://mfsc123.com https://www.mfsc123.com 一个非常赞的免费商用素材导航网站。 收集了各种免费、免版权的图片、插画、视频、视频模板、音乐、音效、字体、图标网站。 再也不用担心版权问题&#xff0c;都能免费商用&#xff0c;自媒体作者必备。 而且还在每个网站…

WeekPaper:GraphTranslator将知识图谱与大模型对齐

GraphTranslator: 将图模型与大型语言模型对齐&#xff0c;用于开放式任务。 将基于图的结构和信息与大型语言模型的能力整合在一起&#xff0c;以提高在涉及复杂和多样数据的任务中的性能。其目标是利用图模型和大型语言模型的优势&#xff0c;解决需要处理和理解结构化和非结…

Python深度学习034:cuda的环境如何配置

文章目录 1.安装nvidia cuda驱动CMD中看一下cuda版本:下载并安装cuda驱动2.创建虚拟环境并安装pytorch的torch_cuda3.测试附录1.安装nvidia cuda驱动 CMD中看一下cuda版本: 注意: 红框的cuda版本,是你的显卡能装的最高的cuda版本,所以可以选择低于它的版本。比如我的是11…

Prometheus+grafana环境搭建redis(docker+二进制两种方式安装)(四)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前三篇 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 Prometheusgrafana环境搭建m…

HarmonyOS实战开发-一次开发,多端部署-视频应用

介绍 随着智能设备类型的不断丰富&#xff0c;用户可以在不同的设备上享受同样的服务&#xff0c;但由于设备形态不尽相同&#xff0c;开发者往往需要针对具体设备修改或重构代码&#xff0c;以实现功能完整性和界面美观性的统一。OpenHarmony为开发者提供了“一次开发&#x…

Ubuntu20.04安装MatlabR2018a

一、安装包 安装包下载链接 提取码&#xff1a;kve2 网上相关教程很多&#xff0c;此处仅作为安装软件记录&#xff0c;方便后续软件重装&#xff0c;大家按需取用。 二、安装 1. 相关文件一览 下载并解压文件后&#xff0c;如下图所示&#xff1a; 2. 挂载镜像并安装 2…