2、项目配置设计(上)

文章目录

  • 前言
  • 一、配置文件功能需求
  • 二、web工程设计思路
  • 三、Config实现思路

前言

配置文件作用:把需要经常修改的参数,从代码中分离出来,单独管理,方便后期维护。

开发一个web应用,肯定需要一些基础性的配置信息,这些信息项目中一般都会使用配置文件统一管理。
在这里插入图片描述

图中只是一个简单的示意,随着我们项目的不断完善,后续该配置文件的信息也会越来越多,这里先简单介绍一下。

  • HTTP模块:启动的端口号是多少。
  • 日志模块:日志级别、输出位置、日志文件名、是否打印堆栈信息,日志格式等。
  • DB:连接地址和端口号、数据库名称、用户名和密码等。

实际工作中,这些配置信息我们会从代码当中分离出来。单独维护,方便后期运维修改。在整个应用加载的时候,把它加载到go的内存当中,通常用一个Config变量存储,后续在项目代码当中,基本上就是以如下的方式使用,比如开始可能是将服务的地址写死在代码中的,而现在我们以配置文件的方式获取变量。

//r.Run("localhost:8080",
r.Run (app.Config.HTTP.Listen)

一、配置文件功能需求

本项目中,配置文件的实现主要会考虑如下四点:

  1. 使用YAML文件格式配置,备选:toml、ini、json
  2. 支持多环境配置: dev、test、prerelease、online
  3. 支持配置重载: config-default.yml -→ config.yml
  4. 支持环境变量覆盖

第一点:本项目我们会选用yaml格式,因为yaml和toml是工作配置文件用的最多的格式,ini使用相对较少,最不推荐配置文件使用json这种格式,它的语义语义性不是特别好,当然json格式在前后端交互时却是首选的文件格式。

第二点:工作中项目基本都需要支持多环境配置模式,在开发和测试的时候可能是一个环境,线上用户是访问不到这个环境的代码和数据库的,而上线后则需要正式的online环境配置,让所有用户都能访问到。

第三点:它支持一个重载模式。所谓的重载,就是有一份基础的公共的配置,这份配置里面配置的参数是通用的,而且经常不更改的,但是后面我有一个文件,可能是会就像上面第二点说的一样,针对这些不同的环境,有不同的配置参数。那但凡在这些配置参数里面,如果我发现这两个文件里面都有相同的配置字段的话,那后面这个文件中的字段,值是可以覆盖前面这个值,这样的话,在不同的环境里面,就可以使用不同的字段对它进行覆盖,使用起来就会非常灵活或方便。

第四点:支持环境变量覆盖是一个附加的锦上添花的功能,平常的工作当中也会这么用,比如一个项目启动的时候,有一些字段,可能是写死在本地的一些配置文件当中,但有时候希望通过环境变量的方式,把配置文件当中某个值进行二次覆盖,那这样就可以更好的发挥这个配置文件的灵活性。

本项目中我们会把这四点一一实现。

二、web工程设计思路

先不急于实现,我们先来看一下web应用项目工程的设计思路。整体上我们把一个项目就当成一个APP,也就是一个应用。我们会把所有核心的代码都放在这个app目录下,app.go则作为整个项目应用入口。我们会把各个组件都挂载到这个APP应用下,也就是说我们所有核心的组件都是app这个全局的变量的一个子模块,这些组件从服务初始化启动的时候,生命周期就随着整个应用
。那为什么要这样设计呢?因为这样后续使用这些模块的时候,在这个项目的任何位置,都可以使用。下图其实也是本项目的一个基本纲要。
在这里插入图片描述

比如要使用某一个配置下的一些值,那可能就是像app.Config.HTTP.Listen这种直接点式的链式语法,再比如说我想使用log模块打印日志,可以在任何一个代码层面使用app.Log().Error(""server error")来完成。同样,dbredis等等,都是以这种思路使用。

//获取某个配置
app.Config.HTTP.Listen
// 使用日志模块
app.Log().Error(""server error")

三、Config实现思路

在这里插入图片描述
程序入的口的话肯定是main.go文件,在main.go里面,我们会对整个应用做一些初始化,而这个初始化我们可以把它封装在app包的Init函数中。初始化工作的第一步肯定是做配置文件的加载,因为后续的DB、Redis等的初始化都依赖配置文件中的信息。最终把加载的内容保存到一个配置结构体,然后挂载到app.Config这个变量中。

正式进入下篇配置文件加载实战前,希望大家已经掌握了如下知识点:

  1. 命令行参数解析:服务启动的时候,我们会给它传一些命令行的参数,可以用go中的flag包解析。
  2. 文件操作:文件的读取、路径获取等。
  3. yaml解析:解析yaml配置文件。
  4. 利用 Struct自定义tag和反射( reflect)实现环境变量重载。

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

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

相关文章

话术挂断之后是否处理事件

文章目录 前言联系我们解决方案方案一方案二 前言 流程:自动外呼进入机器人话术。问题:在机器人放音时用户挂断后,话术还会继续匹配流程,如果匹配上的是放音节点,还会进行放音,那么在数据库表conversation…

android Activity生命周期

android 中一个 activity 在其生命周期中会经历多种状态。 您可以使用一系列回调来处理状态之间的转换。下面我们来介绍这些回调。 onCreate(创建阶段) 初始化组件:在这个阶段,Activity的主要工作是进行初始化操作。这包括为Ac…

wsl中安装ubuntu,vscode访问这个ubuntu

WSL1升级为WSL2 wsl --set-default-version 2 wsl --set-version Ubuntu-22.04 2在windows商店中也可以安装ubuntu,在这个ubuntu中windows的c盘在/mnt/c中

【AIGC】2020-NIPS-去噪扩散概率模型

2020-NIPS-Denoising Diffusion Probabilistic Models 去噪扩散概率模型摘要1. 引言2. 背景3. 扩散模型和去噪自动编码器3.1 正向过程和 L T L_{T} LT​3.2 逆过程与 L 1 : T − 1 L_{1:T-1} L1:T−1​3.3 数据缩放、逆过程解码器和 L 0 L_{0} L0​3.4 简化的训练目标 4. 实…

强大的JVM监控工具

介绍 在生产环境中,经常会遇到各种各样奇葩的性能问题,所以掌握最基本的JVM命令行监控工具还是很有必要的 名称主要作用jps查看正在运行的Java进程jstack打印线程快照jmap导出堆内存映像文件jstat查看jvm统计信息jinfo实时查看和修改jvm配置参数jhat用…

Java 每日一刊(第20期):I/O 流

文章目录 前言流的起源及概念Java I/O 流概述字节流字符流转换流缓冲流对象流与序列化NIO(New I/O)流的关闭与资源管理本期小知识 前言 这里是分享 Java 相关内容的专刊,每日一更。 本期将为大家带来以下内容: 流的起源及概念J…

Leetcode: 0041-0050题速览

Leetcode: 0041-0050题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解 遵从开源协议为知识共享 版权归属-相同方式…

C++ | Leetcode C++题解之第447题回旋镖的数量

题目&#xff1a; 题解&#xff1a; class Solution { public:int numberOfBoomerangs(vector<vector<int>> &points) {int ans 0;for (auto &p : points) {unordered_map<int, int> cnt;for (auto &q : points) {int dis (p[0] - q[0]) * (p…

【Node.js】内置模块FileSystem的保姆级入门讲解

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;Vscode 本文代码都经由博主PleaSure乐事实操后得出&#xff0c;可以放心使用。 1.FileSystem介绍 Node.js 的 fs&#xff08;filesystem&#xff09;模块是一个核心模块&#xff0c…

C++入门基础知识97——【关于C++ 条件运算符 ? :】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 条件运算符 ? :的相关内容&#xff…

【PCL】Ubuntu22.04 安装 PCL 库

文章目录 前言一、更新系统软件包二、安装依赖项三、下载 PCL 源码四、编译和安装 PCL五、测试安装成功1、 pcd_write.cpp2、CMakeLists.txt3、build 前言 PCL&#xff08;Point Cloud Library&#xff09;是一个开源的大型项目&#xff0c;专注于2D/3D图像和点云处理。PCL为点…

在WPF中实现多语言切换的四种方式

在WPF中有多种方式可以实现多语言&#xff0c;这里提供几种常用的方式。 一、使用XML实现多语言切换 使用XML实现多语言的思路就是使用XML作为绑定的数据源。主要用到XmlDataProvider类. 使用XmlDataProvider.Source属性指定XML文件的路径或通过XmlDataProvider.Document指定…

【折半查找】

目录 一. 折半查找的概念二. 折半查找的过程三. 折半查找的代码实现四. 折半查找的性能分析 \quad 一. 折半查找的概念 \quad 必须有序 \quad 二. 折半查找的过程 \quad \quad 三. 折半查找的代码实现 \quad 背下来 \quad 四. 折半查找的性能分析 \quad 记住 比较的是层数 …

git 报错git: ‘remote-https‘ is not a git command. See ‘git --help‘.

报错内容 原因与解决方案 第一种情况&#xff1a;git路径错误 第一种很好解决&#xff0c;在环境变量中配置正确的git路径即可&#xff1b; 第二种情况 git缺少依赖 这个情况&#xff0c;网上提供了多种解决方案。但如果比较懒&#xff0c;可以直接把仓库地址的https改成ht…

Android 简单实现联系人列表+字母索引联动效果

效果如上图。 Main Ideas 左右两个列表左列表展示人员数据&#xff0c;含有姓氏首字母的 header item右列表是一个全由姓氏首字母组成的索引列表&#xff0c;点击某个item&#xff0c;展示一个气泡组件(它会自动延时关闭)&#xff0c; 左列表滚动并显示与点击的索引列表item …

Elasticsearch 8.16 和 JDK 23 中的语言环境变化

作者&#xff1a;来自 Elastic Simon Cooper 随着 JDK 23 即将发布&#xff0c;语言环境信息中有一些重大变化&#xff0c;这将影响 Elasticsearch 以及你提取和格式化日期时间数据的方式。首先&#xff0c;介绍一些背景知识。 什么是语言环境&#xff1f; 每次 Java 程序需要…

理解Matplotlib构图组成

介绍 Matplotlib 是 Python 中最流行的数据可视化库之一。它提供了一系列丰富的工具&#xff0c;可以绘制高度自定义且适用于各种应用场景的图表。无论你是数据科学家、工程师&#xff0c;还是需要处理数据图形表示的任何人&#xff0c;理解如何操作和定制 Matplotlib 中的图表…

三、数据链路层(上)

目录 3.1数据链路层概述 3.1.1术语 3.1.2功能 3.2封装成帧和透明传输 3.2.1封装成帧 ①字符计数法 ②字符&#xff08;节&#xff09;填充法 ③零比特填充法 ④违规编码法 3.2.2透明传输 3.2.3差错控制 差错原因 检错编码 奇偶校验 ☆循环冗余码CRC 例题 纠错…

骨架屏 (懒加载优化)

骨架屏 &#xff08;懒加载优化&#xff09; 即便通过 Webpack 的按需加载、CDN 静态资源缓存 和 代码分割 等技术来减少首屏的代码体积&#xff0c;首屏加载时的白屏时间&#xff08;也称为首屏等待时间&#xff09;仍然可能存在&#xff0c;尤其在网络条件较差或页面内容复杂…

MongoDB 快速入门+单机部署(附带脚本)

目录 介绍 体系结构 数据模型 BSON BSON 数据类型 特点 高性能 高可用 高扩展 丰富的查询支持 其他特点 部署 单机部署 普通安装 脚本安装 Docker Compose 安装 卸载 停止 MongoDB 删除包 删除数据目录 参考&#xff1a; https://docs.mongoing.com/ 介绍…