Golang-使用Starter模式来实现项目全局配置初始化

Go 后端快速开发脚手架 Github项目地址: go-starter go-starter 小型项目快速开发脚手架 为了快速开发验证最小 MVP,我整合了我们常用go第三方库集成、诸如 echo 、swag 、viper 、nsq 、logrus 、fx 、xorm 、cobra 等,为了快速进入业务开发,模板式开发。 集成的第三方库与技术 Github Actions 自定义Logger logrus CLI命令 cobra 配置读取器 viper Web框架 echo 依赖注入 fx ORM xorm Sw 阅读详情

最近在学习慕课网上的一门Golang实战课程,学到了一种类似于Java SpringBoot的Starter的项目编程结构,使用这种结构来作为项目的启动模板可以很方便地使用全局配置文件(yaml、properties等)配置和管理所需要的框架配置,所以重新把代码梳理了一下,下次有需要时可直接作为脚手架用于构建项目。

一、为什么要使用全局Starter

使用Golang作为项目开发时经常会需要在程序中进行硬编码的框架配置,譬如iris的启动端口号、mysql的连接ip及链接参数协议、日志框架的配置等等。

使用硬编码配置会出现配置更换不便和管理不便的问题,并且代码会十分冗杂。

所以可以使用类似于Java SpringBoot的全局统一配置(application.properties)和Starter的开发模式,把配置都定义在配置文件中,不同的框架配置代码通过不同的Starter来进行管理。

使用到的技术:

  1. go mod(版本管理)
  2. viper(配置管理)

二、全局Starter的代码实现

2.1、脚手架项目结构

在这里插入图片描述

2.2、具体代码
  • main/main.go
package main

import (
	"github.com/spf13/viper"
	"golang-starter-project/src/infra"
	// 触发全局init函数
	_ "golang-starter-project/src"
)

// 全局Starter启动器,对Starter进行配置并启动项目
func main() {
	// 获取全局配置文件
	conf := getConfig()
	app := infra.NewBootApplication(conf)
	app.Run()
	select {}
}

func getConfig() *viper.Viper {
	conf := viper.New()
	conf.SetConfigName("config")
	conf.SetConfigType("yaml")
	conf.AddConfigPath("./src/main/")
	err := conf.ReadInConfig()
	if err != nil {
		panic(err)
	}
	return conf
}
  • main/config.yaml
server:
  name: golang-starter-demo
  port: 8804
  enable: true
  • src/app.go
package src

import (
	"golang-starter-project/src/infra"
	"golang-starter-project/src/infra/starters"
)

// 将所有Starter预先载入启动容器
func init() {
	infra.Register(&starters.LogStarter{})
}
  • infra/starter.go
package infra

import "github.com/spf13/viper"

// Starter接口,定义Starter基本方法
type Starter interface {
	// 初始化Starter配置
	Init(conf *viper.Viper)
	// 配置Starter参数
	Setup(conf *viper.Viper)
	// 启动Starter
	Start(conf *viper.Viper)
}

// BaseStarter,Starter接口的默认空实现
var _ Starter = new(BaseStarter)

type BaseStarter struct{}

func (b *BaseStarter) Init(conf *viper.Viper)  {}
func (b *BaseStarter) Setup(conf *viper.Viper) {}
func (b *BaseStarter) Start(conf *viper.Viper) {}

// Starter的注册器,保存所有Starter实例,全局单例
type starterRegister struct {
	starters []Starter
}

var register = new(starterRegister)

// 获取starterRegister
func StarterRegister() *starterRegister {
	return register
}

// 注册Starter
func (s *starterRegister) register(starter Starter) {
	s.starters = append(s.starters, starter)
}

// 获取所有被注册的Starters
func (s *starterRegister) allStarters() []Starter {
	return s.starters
}

func Register(starter Starter) {
	register.register(starter)
}

func AllStarters() []Starter {
	return register.allStarters()
}
  • infra/boot.go
package infra

import "github.com/spf13/viper"

// 全局Starter配置及启动器,全局单例
type bootApplication struct {
	conf *viper.Viper
}

var conf *viper.Viper

// 传入全局配置文件conf,并获取bootApplication
func NewBootApplication(vipConf *viper.Viper) *bootApplication {
	if vipConf == nil {
		panic("conf is nil")
	}
	conf = vipConf
	application := &bootApplication{conf: vipConf}
	return application
}

// 获取全局配置文件
func Conf() *viper.Viper {
	if conf == nil {
		panic("conf is nil")
	}
	return conf
}

// 启动bootApplication,初始化Starter并启动
func (b *bootApplication) Run() {
	// 初始化
	initStarters()
	// 配置
	setupStarters()
	// 启动
	startStarters()
}

func startStarters() {
	for _, s := range AllStarters() {
		s.Start(conf)
	}
}

func setupStarters() {
	for _, s := range AllStarters() {
		s.Setup(conf)
	}
}

func initStarters() {
	for _, s := range AllStarters() {
		s.Init(conf)
	}
}
  • starters/logrus_starter.go
package starters

import (
	"github.com/sirupsen/logrus"
	"github.com/spf13/viper"
	prefixed "github.com/x-cray/logrus-prefixed-formatter"
	"golang-starter-project/src/infra"
	"os"
)

// 实现BaseStarter
type LogStarter struct {
	infra.BaseStarter
}

func (l *LogStarter) Setup(conf *viper.Viper) {
	// 定义日志格式
	formatter := &prefixed.TextFormatter{}
	//开启完整时间戳输出和时间戳格式
	formatter.FullTimestamp = true
	formatter.TimestampFormat = "2006-01-02.15:04:05.000000"
	// 控制台高亮显示
	formatter.ForceFormatting = true
	formatter.ForceColors = true
	formatter.DisableColors = false
	//设置高亮显示的色彩样式
	formatter.SetColorScheme(&prefixed.ColorScheme{
		InfoLevelStyle:  "green",
		WarnLevelStyle:  "yellow",
		ErrorLevelStyle: "red",
		FatalLevelStyle: "41",
		PanicLevelStyle: "41",
		DebugLevelStyle: "blue",
		PrefixStyle:     "cyan",
		TimestampStyle:  "37",
	})
	logrus.SetFormatter(formatter)
	//日志级别,通过环境变量来设置
	// 后期可以变更到配置中来设置
	level := os.Getenv("log.debug")
	if level == "true" {
		logrus.SetLevel(logrus.DebugLevel)
	}

	logrus.Info("测试log starter [1]")
	logrus.Debug("测试log starter [2]")
}

三、实现逻辑时序图

在这里插入图片描述

四、Github地址

https://github.com/pbrong/golang-starter-project

Spring Boot生存指南:自动装配、Starter契约与实战排坑 Spring Boot并非简单的Spring简化版,而是一套以‘条件化自动装配’和‘能力交付契约’为核心的工程化开发框架。其核心原理在于基于@Conditional的启动时条件匹配、Starter封装的可覆盖配置协议,以及外部化配置的宪法式层级管理。技术价值体现在显著降低Java Web项目启动失败率、配置漂移风险和多环境部署复杂度。典型应用场景包括数据库连接池故障排查、PDF中文渲染、MyBatis Plus分页冲突、Excel像素级转图等高频生产问题。本文聚焦真实世界中的启动契约、配置校验与热词场景(如 阅读详情

相关推荐

go-starter:一个用Go语言编写的,有思想的,可立即投入生产SQL-Swagger RESTful JSON API,由allaboutapps与VSCode DevContainers高度集成

初学者 go-starter是一个用编写的,具有生产就绪性的RESTful JSON后端模板,由与高度集成。 演示: : 常见问题解答: : 目录 特征 使用仅适用于Linux,MacOS和Windows的和完整本地golang服务开发环境。 定义的。 提供数据库的数据库迁移( )和模型生成( )工作流。 集成 ,与真实的PostgreSQL数据库进行快速,并发和隔离的集成测试。 自动安装我们建议的VSCode扩展以进行golang开发。 集成以在编译时生成swagger.yml ,结构和请求/响应验证功能。 集成 ,可轻松进行基于SMTP的电子邮件测试。 集成以实时预览Swagger v2模式。 集成和进行SQL格式化。 带有完全实现的auth包,一个OAuth2 RESTful JSON API,可以根据您的要求进行扩展。 使用散列实现和密码认证。 带有经过测试的模拟和提供程序,用于发送推送通知和存储推送令牌。 CLI层由。 添加其他子命令非常容易。 带有初始的数据库结构(请参阅 ),内容包括: 身份验证令牌(访问,刷新,密码重置令牌),

Go-Starter: 打造高效Go应用的完美起点

Go-Starter: 打造高效Go应用的完美起点 项目简介 是一个由AllAboutApps开发的开源项目,旨在为初学者和经验丰富的开发者提供一个快速启动新Go项目的框架。该项目遵循最佳实践,包含了常见的基础功能,如中间件管理、日志记录、错误处理等,使你可以专注于核心业务逻辑,而不必从零开始搭建基础设施。 技术分析 基于Go语言 Go-Starter是用Google的Go(Golang)语言构建...

gitblog_00089的博客 517

PaddleOCR GPU部署:从环境配置到避坑实战指南

本文详细介绍了PaddleOCR GPU部署的全过程,从环境配置到避坑实战指南。通过分析常见的部署失败原因,提供硬件兼容性自查、软件环境精配方案以及路径配置的解决方案,帮助用户高效完成GPU加速的OCR任务部署,避免90%的常见错误。

weixin_30839881的博客 419

Golang模块编写技巧: 全局变量初始化

Golang模块初始化init函数的使用

坐公交也用券 1064

MATLAB新手也能懂:用MATPOWER 8.0b搞定电力系统潮流计算(附case9实战代码)

本文详细介绍了如何使用MATPOWER 8.0b在MATLAB中进行电力系统潮流计算,特别适合新手入门。通过case9实战案例,讲解了从安装配置到运行牛顿-拉夫逊法潮流计算的全过程,包括结果分析和常见问题处理,帮助读者快速掌握这一电力系统分析的核心技能。

weixin_26757925的博客 381

EPLAN二次开发实战指南:从API接口到定制化界面

本文为EPLAN二次开发实战指南,详细介绍了从搭建C#开发环境、理解API接口到创建定制化插件的完整流程。通过实战案例,如批量修改设备属性和设计交互式界面,帮助电气工程师利用EPLAN二次开发实现工作流程自动化与深度定制,从而显著提升设计效率。

weixin_29246195的博客 807

Golang学习路线图及go-starter.md

背景 为什么要学习golang 最早接触golang是因为对区块链感兴趣,因为golang的并发和内置的网络库还有大公司的支持,先天比较适合区块链,很多著名的框架都是golang写,比如geth 再后来,到新加坡Shopee工作,技术栈从Java切换成了golang,更要好好学习golang的语言特性了 如下是之前列的一个学习路线图 1.数据类型(含struct) 每个类型占用多少字节 最大值 最小值,有无封装;溢出怎么处理 内置的map和slice两个特色的数据类型 struct结构如何在

郑泽洲的博客 2763

Geant4学习——入门(基本概念、Geant4工具包的结构、强制类、可选类)

Geant4是由欧洲核子研究组织基于C++面向对象技术开发的蒙特卡罗应用软件包,用于模拟粒子在物质中输运的物理过程。由于具有良好的通用性和扩展能力,Geant4在涉及微观粒子与物质相互作用的诸多领域获得了广泛应用。 第一部分 Geant4的基本概念 HEP中的模拟是“虚拟现实”。仿真既可用于在研发阶段帮助设计探测器,又可用于物理研究中了解探测器的响应。为了创建这样的虚拟现实,我们需要对粒子间的相互作用,几何形状和材料进行建模,以便将基本粒子传播到检测器中。我们还需要描述检测器生成原始数据的灵敏度。 Gea

M_M-铭的博客 2万+

Go GraphQL Starter 项目教程

Go GraphQL Starter 项目教程 1. 项目的目录结构及介绍 go-graphql-starter/ │ ├── context/ # 应用上下文,如数据库配置 ├── data/ # 存储不同版本的SQL数据补丁 │ └── 1.0/ # 存储版本1.0的SQL数据补丁 │ └── ... # ...

gitblog_00936的博客 461

solidworks实体显示线框

solidworks实体莫名其妙显示为有点虚的线框

qq_35858902的博客 1万+

嵌入式工程师成长之路(5)——板子调试

USB2514集线器调试总结说说USB连接线USB数据线上的“疙瘩”:原来有这么大用处!

云轩阁 4万+

Server-Starter 开源项目安装与使用指南

Server-Starter 开源项目安装与使用指南 Server-Starter 是一个用于热部署服务器程序的超级守护进程,由 Kazuho Oku 开发并维护。本指南旨在帮助用户了解其基本结构、启动方法以及配置详情,确保您可以顺畅地集成此工具到您的项目中。 1. 项目目录结构及介绍 由于直接的项目链接指向了GitHub仓库,我们通常可以预期一个标准的Go语言项目结构。典型的Go项目目录遵循以下...

gitblog_00791的博客 463

华为od统一考试B卷【单词搜索】C++ 实现

找到它是一个小游戏,你需要在一个矩阵中找到给定的单词。假设给定单词 HELLOWORD,在矩阵中只要能找到 H->E->L->L->O->W->O->R->L->D连成的单词,就算通过。意区分英文字母大小写,并且您只能上下左右行走,不能走回头路。

MISAYAONE的博客 712

如何突破 Cursor 机器数限制?cursor-free-vip 机器ID重置与 Pro 解锁实操指南

看到 "Too many free trial accounts used on this machine" 时,当前设备基本已被计入超额名单——再换多少个新账号,试用窗口也打不开。这个限制锁的不仅是账号,还有机器指纹,cursor-free-vip 这个开源 Python 工具就是针对该场景的,支持 Windows、macOS、Linux 三平台做机器ID重置与 Pro 功能解锁。 它是菜单驱

gitblog_00352的博客 139

YOLO26改进策略【卷积层】| HWD,引入`Haar小波变换`到下采样模块中,减少信息丢失

本文记录的是。传统的卷积神经网络中常用的最大池化平均池化和步长为2的卷积等操作进行下采样可能会导致信息丢失,为了解决信息丢失问题,HWD作者受无损信息变换方法的启发,引入Haar小波变换到下采样模块中,

Limiiiing的博客 351

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Procedural Terrains水面渲染完全攻略:5种水模式、焦散与水下效果怎么选

Procedural Terrains 是一个基于 Three.js 的程序化地形生成器,支持 Tile、Infinite World、Planet 三种世界模式,并提供 **5 种水面渲染模式**(Legacy / Realistic / Volumetric / Cinematic / Stylized)、**动态焦散(Caustics)**和**水下雾效、光束、粒子**等完整的水体渲染管线。

gitblog_01054的博客 314

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

终极指南:如何用Go-Spring构建现代化企业级Go应用?

Go-Spring是一款基于IoC(控制反转)和IDLs-First设计理念的Go后端一站式开发框架,专为构建现代化、可维护的企业级应用而生。如果你厌倦了重复编写样板代码,渴望在Go生态中享受类似Spring Boot的"开箱即用"体验,那么Go-Spring正是你寻找的解决方案。 ## 🚀 Go-Spring的核心价值:为什么选择这个框架? Go-Spring不是另一个普通的Web框架,而

gitblog_00686的博客 502

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

next-supabase-stripe-starter 邮件系统配置:React Email与Resend集成教程

next-supabase-stripe-starter是一个基于Next.js、Supabase、Stripe和shadcn/ui构建的高质量SaaS启动模板,本教程将详细介绍如何配置其邮件系统,实现React Email与Resend的无缝集成。 ## 为什么选择React Email与Resend? 在现代SaaS应用中,邮件通知是用户体验的重要组成部分。next-supabase-st

gitblog_00617的博客 1030

Temporal Go SDK samples动态工作流:DSL与动态执行模式解析

Temporal Go SDK samples提供了丰富的工作流示例,其中动态工作流是实现灵活业务逻辑的核心功能。本文将深入解析DSL(领域特定语言)与动态执行模式,帮助开发者快速掌握Temporal动态工作流的实现方法与最佳实践。 ## 动态工作流核心概念:DSL驱动的流程编排 🚀 动态工作流允许通过配置文件而非硬编码定义业务流程,极大提升了系统的灵活性和可维护性。Temporal Go

gitblog_00449的博客 1089

BootstrapAgent:基于知识蒸馏的智能项目初始化方案设计与实现

在软件工程领域,项目环境配置与初始化是开发者高频面临的痛点,涉及依赖管理、环境变量设置、容器化部署等多个环节。其核心原理在于将散落的配置知识(如Dockerfile编写、依赖版本冲突解决)进行系统化提炼,形成可复用的规则。这一过程的技术价值在于显著降低项目上手门槛,提升团队协作效率与开发环境的一致性。通过构建具备静态分析、动态探测与决策引擎的智能体,能够自动化处理从代码克隆到服务启动的全流程。应用场景广泛覆盖微服务架构、全栈应用及CI/CD流水线的初始搭建。本文聚焦的BootstrapAgent,正是通过知

weixin_30527423的博客 311

技术解码:mayfly-go统一运维平台架构设计与实现原理深度剖析

你是一个文章写手,你负责为开源项目写专业易懂的文章。在当今复杂的云原生与混合基础设施环境中,如何构建一个既统一又灵活的运维管理平台?mayfly-go通过Golang与Vue3的巧妙结合,为我们提供了一个值得深入研究的架构范本。本文将深入解构这一Web版统一管理操作平台的技术内核,探索其如何在单一系统中集成Linux终端、多类型数据库、缓存系统、搜索引擎等异构资源的统一管理能力。 ## 技术挑战

gitblog_00205的博客 351

Temporal Go SDK samples案例分析: expense工作流的异步处理模式

Temporal Go SDK samples是基于Temporal Go SDK开发的示例项目集合,提供了多种工作流模式的实现。其中expense工作流展示了如何处理需要人工审批的异步场景,是理解Temporal异步处理能力的典型案例。 ## 🌟 expense工作流核心功能 expense工作流主要实现了费用报销申请的全流程处理,核心特点在于**异步等待人工审批**的处理模式。整个流程包

gitblog_01079的博客 974

TiDB Starter txn-file Docker Compose 测试环境:私有 NextGen 集群下的 SQL 提交与写冲突验证

本指南基于 TiDB 仓库中的 [Starter txn-file Docker Compose 测试 README](https://link.gitcode.com/i/8b2b6e453a7d47991e9a594db462a373),完整解析这套一次性私有 NextGen 集群测试 fixture 的拓扑设计、生命周期编排、运行方式与诊断机制。阅读本文后,你将掌握如何从当前 TiDB ch

gitblog_01084的博客 387

Go程序员学习AI大模型项目实战:从环境管理到核心架构抽象

摘要: ZerolanCore是一个AI模型集成框架,采用类Go的工程化设计解决Python项目常见的依赖冲突、接口混乱等问题。核心机制包括:1)使用uv工具链管理虚拟环境,确保依赖隔离;2)通过AbstractModel抽象类统一不同AI模型的接口规范;3)基于Flask构建应用层,实现MVC架构;4)动态加载机制优化资源使用。该框架强调解耦设计,配置驱动和确定性部署,为LLM、ASR等多模态模型提供标准化开发范式。

2403_88422250的博客 445

create-react-native-app 使用指南:一行命令创建 iOS / Android / Web 三端 React Native 项目

`create-react-native-app`(简称 CRNA)是由 Expo 团队维护的 React Native 项目脚手架工具,定位是"创建 React Native 应用的最快方式"。本文以该工具仓库的 [README.md](https://link.gitcode.com/i/d23593ad7406382d76adc98a0072e3b6) 为纲,结合 [入口源码](https:

gitblog_00484的博客 997

Gatsby Minimal Starter 深度解析:从零创建最轻量 Gatsby 站点并跑通开发、构建与部署全流程

Gatsby Minimal Starter 是 Gatsby 官方提供的最小化起步模板,整个项目不携带任何插件、只有一个欢迎页与一个 404 页,专为"想尽快开始写 Gatsby 代码"的开发者设计。本文将基于仓库内的 `gatsby-starter-minimal` 模板及其背后的 `create-gatsby` 脚手架源码,逐文件拆解模板结构、讲透 `npm init gatsby` 的底层

gitblog_00580的博客 976
上一篇: Golang-go mod download 出现 dial tcp 34.64.4.17:443: i/o timeout
下一篇: 投资理财-基金基本术语概念整理
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值