2、项目配置设计(上)

news2024/11/26 5:35:58

文章目录

  • 前言
  • 一、配置文件功能需求
  • 二、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.coloradmin.cn/o/2187552.html

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

相关文章

骨架屏 (懒加载优化)

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

【设计模式-解释模式】

定义 解释器模式是一种行为设计模式,用于定义一种语言的文法,并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类,使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…

基于Springboot vue应急物资供应管理系统设计与实现

博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找…

【硬件模块】HC-SR04超声波模块

HC-SR04超声波模块实物图 工作参数 探测距离&#xff1a;2~600cm 探测精度&#xff1a;0.1cm1% 感应角度&#xff1a;<15 输出方式&#xff1a;GPIO 工作电压&#xff1a;DC 3~5.5V 工作电流&#xff1a;5.3mA 工作温度&#xff1a;-40~85℃ 引脚接线 HC-SR04MCU备注VC…

Golang | Leetcode Golang题解之第454题四数相加II

题目&#xff1a; 题解&#xff1a; func fourSumCount(a, b, c, d []int) (ans int) {countAB : map[int]int{}for _, v : range a {for _, w : range b {countAB[vw]}}for _, v : range c {for _, w : range d {ans countAB[-v-w]}}return }

04-SpringBootWeb案例(下)

3. 员工管理 完成了部门管理的功能开发之后&#xff0c;我们进入到下一环节员工管理功能的开发。 基于以上原型&#xff0c;我们可以把员工管理功能分为&#xff1a; 分页查询&#xff08;今天完成&#xff09;带条件的分页查询&#xff08;今天完成&#xff09;删除员工&am…

Pikachu-Sql Inject-数字型注入(GET)

一、、破解 SQL 查询语句中的字段数 ?id1 order by 3 -- // -- 是注释&#xff0c; 加号 在MySQL中会转成空格 order by 1 &#xff0c;by 数字几&#xff0c;就是按照第几列进行排序&#xff1b;如果没有这一行&#xff0c;则报错 如&#xff1a;以下语句&#xff0c;根据…

QT学习笔记1(QT和QT creator介绍)

QT学习笔记1&#xff08;QT和QT creator介绍&#xff09; Qt 是一个跨平台的应用开发框架&#xff0c;主要用于图形用户界面&#xff08;GUI&#xff09;应用的开发&#xff0c;但也支持非GUI程序的开发。Qt 支持多种平台&#xff0c;如Windows、macOS、Linux、iOS和Android&a…

Servlet的生命周期及用户提交表单页面的实现(实验报告)

一、实验目的、要求 1. 掌握Servlet的定义&#xff0c;即Servlet是运行在服务器端的Java程序&#xff0c;用于扩展服务器的功能。 2. 学习和掌握在开发环境中搭建Servlet应用所需的工具&#xff0c;如Tomcat服务器、IDEA等。 二、实验内容 根据本章所学知识&#xff0c;实验…

linux第一课:下载与安装

这是我的个人复习笔记&#xff0c;草稿箱字太多会卡就发这了&#xff0c;欢迎大家阅读。 Kali Linux&#xff0c;黑客必备神器。跟着我&#xff0c;带你从入门到入狱&#xff01; 第一课&#xff0c;下载与安装。 第一步&#xff1a; 在官网下载Centos镜像&#xff1a;http…

(2025)408考研:王道操作系统文件管理强化

写在最前面,需要pdf的请资源里下载,已经排版好了,这里不知道为什么粘贴上来排版这么难看!!! 某一个分区进行格式化的时候,这个分区的文件系统就被建立了,一旦这个文件系统建立完后,就确定了文件系统使用的什么样的物理结构。 操作系统引导: 主存分为两部分,RAM和RO…

人体目标检测数据集 18000张 人体 带标注voc yolo

人体目标检测数据集 18000张 人体 带标注voc yolo 继续 人体目标检测数据集介绍 数据集名称 人体目标检测数据集 (Human Detection Dataset) 数据集概述 该数据集专为训练和评估基于YOLO系列目标检测模型&#xff08;包括YOLOv5、YOLOv6、YOLOv7等&#xff09;而设计&#…

vue-cli老项目继续优化:json压缩神器 compress-json

前言 上文讲到一个 vue-cli 带脚本生成内容的老项目的打包时间已经从 40min &#xff0c;优化到 12min &#xff0c;再到 9min 。 还有可以考虑的方式包含缩小脚本体积、依赖分包、构建的缓存等等。 那么本文就来讨论缩小脚本体积的方式。 分析 前文已知&#xff0c;生成的…

螺狮壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习06(Docker网络连接)

如果要搭建基于docker的私人DC&#xff0c;除了虚拟机网络连接外&#xff0c;就得掌握docker的网络连接。磨刀不误砍柴工&#xff0c;或者说工欲善其事必先利其器&#xff0c;我们先学学典型的docker的网络连接方式。Docker的网络连接有四种&#xff1a;bridge、none、containe…

jmeter学习(2)变量

1&#xff09;用户定义的变量 路径&#xff1a;添加-》配置元件-》用户定义的变量 用户定义的变量是全局变量&#xff0c;可以跨线程组被调用&#xff0c;但在启动运行时获取一次值&#xff0c;在运行过程中不再动态获取值。 2&#xff09;用户参数 路径&#xff1a;…

扩展可持续性概念:太空移民、持久产品与人类未来

可持续性的扩展概念&#xff1a;超越绿色能源&#xff0c;关乎人类未来的延续 当我们听到“可持续性”这个词时&#xff0c;大多数人首先想到的是环境保护、绿色能源、减少碳足迹或保护生态系统。虽然这些都是不可忽视的重要部分&#xff0c;但可持续性远远超出了绿色能源的范…

RabbbitMQ篇(环境搭建 - 下载 安装)(持续更新迭代)

目录 一、Windows 1. 下载安装程序 2. 安装配置erlang 3. 安装rabbitMQ 4. 验证 二、Linux 1. 下载rpm包 1.1. 下载Erlang的rpm包 1.2. 下载socat的rpm包 1.3. 下载RabbitMQ的rpm包 2. 安装 2.1. 安装Erlang 2.2. 安装socat 2.3. 安装RabbitMQ 3. 启动RabbitMQ服…

酒店生态发展旅游四个一体化建设-—未来之窗行业应用跨平台架构

一、酒店在旅游中的作用 首先&#xff0c;酒店为游客提供了舒适的住宿环境。经过一天的游玩&#xff0c;游客需要一个干净、安全、设施齐全的空间休息&#xff0c;恢复精力&#xff0c;以更好地继续后续的行程。 其次&#xff0c;酒店是旅游服务的重要载体。它不仅提供住宿&am…

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

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

【MATLAB2024b】安装离线帮助文档(windows)

文章目录 一、在 MATLAB 设置中安装二、从math works 网站下载ISO&#xff1a;给无法联网的电脑安装 版本&#xff1a;matlab 2024b&#xff08;或者大于等于2023a&#xff09; 所需空间&#xff1a;10~15 GB 平台&#xff1a;Windows 需要注册math works账号。 一、在 MATLAB …