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

golang自封框架

前言

Go 是一种开源编程语言,可以轻松构建简单、可靠和高效的软件。

但是作为一个标准的项目,立项设计到落地,需要大量开发,选用各种框架,例如api、db、log等等,每个框架都需要不断的选型兼容,然后进行大量配置,重构,才能投入生产使用。

如何快速从0到1完成一个投产使用的服务呢

框架

在软件工程和编程中,框架是可重复使用的软件组件的集合,能提高新应用程序的开发效率。重复利用现有开发和研究是所有工程领域的基本原则。例如,电气工程师使用现有电子元件来制造新设备。组件制造商遵循预先确定的标准和规范来确保组件的可用性。同样,软件框架也包含基于特定软件标准和协议的可重复使用的代码模块。框架还可以定义和强制执行某些软件架构规则或业务流程,以便能够以标准化方式开发新的应用程序。

go-core

根据平时开发经验,自研开发了一个go框架,包括了常用的各种功能,对其进行安全、联调等模块的封装,可以开包即用,实现快速完成一个后端,下面是开源库的地址

github链接icon-default.png?t=O83Ahttp://github.com/SmartLyu/go-core

使用方法

  1. 自己新开启一个项目,引用项目,直接使用项目中的框架。
    go mod init <my-project-name>
    
    go get github.com/yuanJewel/go-core
  2. 直接克隆项目后,使用运行测试项目。

推荐使用方法1,可以跟随开源项目不断迭代,并且代码也更优雅。

本文档以项目的版本 v1.3.5 为例,具体使用方法以项目中内容为准。

框架解析

api框架

选用iris作为基础框架,它以其全面的功能、强大的配置能力以及良好的扩展性著称。

  • 功能全面:Iris提供了广泛的功能,包括但不限于WebSockets、动态路由、MVC模式支持等,这使得Iris能够轻松应对各种Web开发需求。

  • 易用性和灵活性:Iris提供了详尽的文档和示例代码,帮助开发者快速学习和使用。此外,它的配置灵活,允许开发者根据项目需求调整框架行为。

基于iris进行二次开发,扩展其基本功能,并封装好监控、权限等常用接口的实现。

使用起来很简单,实现框架中 `Service` 的接口,可以直接使用 `Object` 类,如果需要自定义一些特定方法,重写即可。

db框架

选用gorm作为基础框架,它为开发人员提供了一种简便的方式来管理数据库,并将对象模型映射到关系型数据库中。

封装了所有库操作的方法,具体的方法可以查看接口描述

  1. 封装了所有增删改的事务检查操作,代码对于数据库操作的影响有预期,但是可能出现不正确的情况,这些情况往往都是bug,所以,框架会判断是否符合预期,不符合预期的操作会撤销事务。
  2. 封装了审批的功能,所有操作,从api到数据操作,sql的详情,通过traceId关联
  3. 封装了查询操作,传入数据库对应的对象,即可完成查询操作,db操作极大简化。
  4. 区分了查询单个记录和多个记录的方法,方便程序处理。

log框架

选用logrus作为基础框架,它提供了日志级别控制、日志格式化输出、日志文件轮转等丰富的功能。

该日志模型,被整个项目使用,可以通过环境变量调整配置,写文件会自动滚动更新,迭代配置,包括业务日志和access日志。

api的access日志的格式和nginx日志格式一致,golang日志每行都是json,方便es清洗入库。

如果使用debug可以查看到执行的sql语句,再根据traceId详细看到一个操作全链路的事件信息。

例子

  1. `Object` 类,继承了框架的类,可以复写接口内的方法,实现对api的声明。
  2. `TestModel` 类,声明数据库的结构,将其传入数据库中即可实现数据库的增删改查
  3. 使用 `service` 中的方法,可以快速关联api和db的增删改查操作
package main

import (
	"fmt"
	"github.com/kataras/iris/v12"
	"github.com/yuanJewel/go-core/api"
	"github.com/yuanJewel/go-core/config"
	"github.com/yuanJewel/go-core/db/service"
	"github.com/yuanJewel/go-core/logger"
	"log"
)

type Object struct {
	api.Object
}

func (Object) Party(app iris.Party) {
	app.Get("/", index).Name = "index"
	app.Get("/test", getTest).Name = "get"
	app.Put("/test", putTest).Name = "put"
	app.Post("/test", postTest).Name = "post"
	app.Delete("/test", deleteTest).Name = "delete"
}

// index 自定义,处理 /api/v1/ 路径 请求的逻辑
func index(ctx iris.Context) {
	ctx.ViewData("message", "welcome to yuanJewel go-core")
	if err := ctx.View("index.html"); err != nil {
		return
	}
}

// TestModel 通过接口实现数据库的增删改查
// 下面的结构体就是数据库的字段的描述声明
type TestModel struct {
	ID string `gorm:"column:id;type:varchar(255);primary_key" json:"id"`
}

// get 查
func getTest(ctx iris.Context) {
	service.GetDbInfoByIds(ctx, TestModel{}, &[]TestModel{})
}

// post 增
func postTest(ctx iris.Context) {
	service.PostDbInfo(ctx, &[]TestModel{}, api.NormalSpecialTask)
}

// put 改
func putTest(ctx iris.Context) {
	service.PutDbInfoById(ctx, "get-projects", &TestModel{}, api.NormalSpecialTask)
}

// delete 删
func deleteTest(ctx iris.Context) {
	service.DeleteDb(ctx, "get-projects", &TestModel{})
}

func main() {
	if err := service.InitDb(&config.DataSourceDetail{
		Driver:   "mysql",
		Host:     "数据库地址",
		Db:       "库名",
		User:     "账号",
		Password: "密码",
	}); err != nil {
		log.Fatal("Init Database Error...", err)
	}

	app, _close := api.CreateApi(Object{}, true)
	defer func() {
		_ = _close()
	}()

	logger.Log.Info("服务已运行...")
	if err := app.Run(iris.Addr(fmt.Sprintf(":%d", 8080))); err != nil {
		log.Fatal("Start Api Error...")
	}
}

如果需要做更多的自定义和更新,直接阅读源码使用。

结语

使用本框架请遵循license中的声明,如果有不明白的,可以根据项目中README所写内容,联系作者。本文章可以自由收藏和转发。

如果同学觉得框架还可以,麻烦点个star鼓励一下作者。


http://www.kler.cn/news/360288.html

相关文章:

  • go中阶乘实现时递归及迭代方式的比较
  • element-ui table 前端分页
  • Oracle 使用位图索引 Cost降低200倍! 探讨位图索引的利与弊
  • 002_基于django国内运动男装小红书文章数据可视化分析系统的设计与实现2024_qo6cy3i4
  • Linux虚拟化软件与操作系统与SSH客户端
  • 使用 Docker 升级 MySQL 的优化步骤与说明
  • 【CXL协议-性能注意事项(13)】
  • 零售行业的数字化营销转型之路
  • 教学资料管理|基于springBoot的教学资料管理系统设计与实现(附项目源码+论文+数据库)
  • 计算机保研/考研资料分享
  • 苏宁商品详情接口技术解析与实战代码
  • 用python-pptx轻松统一调整演示文档配色方案
  • 前端学习笔记(1.0)
  • m1安装roop,本地运行,视频换脸
  • FineReport 全局参数
  • harmonyOS next之实现时间打卡定时器
  • 如何按照最左原则和B+树设计的联合索引
  • 有关java中的spi
  • element plus el-checkbox 无法选中问题
  • 图片翻译软件有哪些?好用的在线图片翻译工具大盘点