Gone——golang依赖注入框架介绍

news2024/12/24 8:04:28

文章目录

    • Gone是什么
    • 特性
    • 小试牛刀
    • 概念与启动流程
      • 人话版本
      • 鬼话版本
      • 代码版本
    • 关于Logo

logo

Gone是什么

首先,Gone是Golang的一个轻量级的依赖注入框架,目前依赖注入的装配流程是通过反射来实现的;虽然golang的反射一直被人诟病太慢,但是在Gone中依赖注入只是程序的启动阶段,不影响运行阶段的速度,最多就是给启动过程增加几毫秒的时间,带来的好处却是不再需关心各种依赖如何创建。

其次,为了方便用户能够快速上手,我们开发了一系列内置组件,比如 xorm、redis、schedule、tracer、logrus、gin、cmux、zap、viper 等等,后续我们还会支持更多微服务中间件的接入;用户可以利用这些组件快速开发出一个云原生的微服务,所以Gone一套微服务解决方案

特性

  • 定义Goner接口,对依赖进行抽象
  • 依赖注入
    • 注入Goners
    • 注入函数参数
  • 模块化,可拆卸设计
  • 启动流程控制
  • 测试支持
  • 内置组件
    • goner/config,支持配置参数的依赖注入
    • goner/tracer,给调用链路增加TraceId,支持链路追踪
    • goner/logrus、goner/zap,支持日志记录
    • goner/gin,集成gin框架,提供HTTP请求参数的依赖注入
    • goner/viper,用于解析多种配置文件

小试牛刀

下面使用Gone来编写一个简单的Web服务,更多例子在快速开始 和 example。

package main

import (
	"fmt"
	"github.com/gone-io/gone"
	"github.com/gone-io/gone/goner"
)

// 实现一个Goner,什么是Goner? => https://goner.fun/zh/guide/core-concept.html#goner-%E9%80%9D%E8%80%85
type controller struct {
	gone.Flag //goner 标记,匿名嵌入后,一个结构体就实现了Goner
	gone.RouteGroup `gone:"gone-gin-router"` //注入根路由
}

// 实现 Mount 方法,挂载路由;框架会自动执行该方法
func (ctr *controller) Mount() gone.GinMountError {

	// 定义请求结构体
	type Req struct {
		Msg string `json:"msg"`
	}

	//注册 `POST /hello` 的 处理函数
	ctr.POST("/hello", func(in struct {
		to  string `gone:"http,query"` //注入http请求Query参数To
		req *Req   `gone:"http,body"`  //注入http请求Body
	}) any {
		return fmt.Sprintf("to %s msg is: %s", in.to, in.req.Msg)
	})

	return nil
}

func main() {
	//启动服务
	gone.Serve(func(cemetery gone.Cemetery) error {
		// 调用框架内置组件,加载gin框架
		_ = goner.GinPriest(cemetery)

		//将 一个controller类型的Goner埋葬到墓园
		//埋葬是什么意思? => https://goner.fun/zh/guide/core-concept.html#bury-%E5%9F%8B%E8%91%AC
		//墓园是什么意思? => https://goner.fun/zh/guide/core-concept.html#cemetery-%E5%A2%93%E5%9B%AD
		cemetery.Bury(&controller{})
		return nil
	})
}

运行上面代码:go run main.go,程序将监听8080端口,使用curl测试:

curl -X POST 'http://localhost:8080/hello' \
-H 'Content-Type: application/json' \
--data-raw '{"msg": "你好呀?"}'

结果如下:

{"code":0,"data":"to  msg is: 你好呀?"}

概念与启动流程

人话版本

代码写完了,跑得起来才行。

在Gone框架中,组件叫住Goner,Goner的属性可以是:interface、slice、map,程序启动时他们将被自动装配。在Gone启动前,需要将所有的Goners注册到Gone框架,启动时Gone会对所有Goners的属性进行自动装配,完成依赖注入,编写组件不必关心依赖的实现和依赖的接口是如何来的,只需要直接使用就可以了。

鬼话版本

我们编写的代码终究只是死物,除非他们被运行起来。

在Gone中,组件被抽象为 Goner(逝者),Goner 属性可以注入其他的 Goner 。Gone启动前,需要将所有 Goners 埋葬 到 墓园;Gone启动后,会 复活 所有 Goners,建立一个 天国,“天国的所有人都不再残缺,他们想要的必定得到满足”。

代码版本

package main

import (
	"fmt"
	"github.com/gone-io/gone"
)

// Worker 接口
type Worker interface {
	Do()
}
type Boss struct {
	gone.Flag
	workers []Worker `gone:"*"` //Boss 依赖 Worker接口,通过 gone标签标记为需要依赖注入
}

func (b *Boss) Do() {
	for _, w := range b.workers {
		w.Do()
	}
}

// WorkerX 实现 Worker 接口
type WorkerX struct {
	gone.Flag
}

func (w *WorkerX) Do() {
	fmt.Println("WorkerX Do")
}

func main() {
	gone.
		//Goner启动前的准备工作
		Prepare(func(cemetery gone.Cemetery) error {
			cemetery.
				//注册Boss
				Bury(&Boss{}).

				//注册多个Worker Goners
				Bury(&WorkerX{}).
				Bury(&WorkerX{}).
				Bury(&WorkerX{})
			return nil
		}).
		//Goner启动
		Run(func(boss *Boss) { //Run 方法中的参数被自动注入
			boss.Do()
		})
}

了解更多,请阅读 开发指南

关于Logo

Golang的吉祥物是一只可爱的地鼠,Gone的Logo是从它衍生出来,加上翅膀加上光圈,是一只天使地鼠,我们感觉这很复活Gone鬼故事的气质。

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

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

相关文章

是时候系统性的的学习那些开发中必备的软件了!

大家好,我是 王有志,一个分享硬核 Java 技术的金融摸鱼侠,欢迎大家加入 Java 人自己的交流群“共同富裕的 Java 人”。 最近小组内心来了两个实习生,各方面都很不错,基础知识扎实,勤奋好学(卷&…

Win10,Win11电脑重装系统怎么操作,简单一步搞定【保姆级教程】

电脑重装系统怎么操作?电脑使用时间长了,就会出现系统崩溃、病毒感染或者是系统文件损坏等问题。这个时候我们就可以对电脑进行系统重装,也就是恢复电脑出厂设置。现在市面上有很多系统重装工具可以帮助我们解决难题,如果您是电脑…

【ajax实战03】拦截器

一:axios拦截器 拦截器分类: 请求拦截器以及响应拦截器 拦截器作用: 在请求或响应被then或catch处理前拦截它们 二:请求拦截器 作用: 发起请求之前,调用一个配置函数,对请求参数进行设置…

如何使用 Postgres 折叠您的堆栈 实现一切#postgresql认证

技术蔓延如何蔓延 假设您正在开发一款新产品或新功能。一开始,您的团队会列出需要解决的技术问题。有些解决方案您将自行开发(您的秘诀),而其他解决方案您将使用现有技术(可能至少包括一个数据库)来解决。…

LDO芯片手册,实例应用分析

在进行电路设计时LDO是经常用到的,尤其在为芯片,晶振等敏感电路进行供电时应用更多,下面选取一款比较常用的LDO芯片,一起进行更深入的学习。 SGM2036特点简介 SGM2036,圣邦微一款比较常用的LDO芯片手册 可以先大致看…

面试题-CAS(compare and swap)

1.CAS机制 悲观锁:始终假定会发生并发冲突,因此会屏蔽一切可能违反数据完整性的操作。 乐观锁:假设不会发生并发冲突,因此只在提交操作时检查是否违反数据完整性。 执行CAS操作时,比较内存位置的值(主内存的值)与预期…

fiddle查看请求耗时 设置超时背景

windows 下,打开 fiddler 时直接用 快捷键:CTRL R 打开 或 从路径:Rules -> Customize Rules… 打开 // 显示每行请求的服务端耗时时间 public static BindUIColumn("TimeTaken/ms", 120)function TimeTaken(oS: Session):Stri…

信号与系统实验-实验五 离散时间系统的时域分析

一、实验目的 1、理解离散信号的定义与时域特征,掌握在时域求解信号的各种变换运算; 2、掌握离散系统的单位响应及其 MATLAB 实现的方法; 3、掌握离散时间序列卷积及其 MATLAB 实现的方法; 4、掌握利用 MATLAB 求解微分方程&a…

倍增法找lca——最近公共祖先

对于结点x和y,需要找他们的最近公共祖先 一个最简单的办法就是沿着x和y的父节点一个一个往上找 这样的时间复杂度是o(n),对于较大的数据量会TLE 今天要使用的方法是利用倍增来加速这个找lca的过程 倍增算法: 按2的倍数来往上找&#xff0…

Python 基础 (标准库):堆 heap

1. 官方文档 heapq --- 堆队列算法 — Python 3.12.4 文档 2. 相关概念 堆 heap 是一种具体的数据结构(concrete data structures);优先级队列 priority queue 是一种抽象的数据结构(abstract data structures)&…

C#+uni-app医院HIS预约挂号系统源码 看病挂号快人一步

​​​​​​​ 提到去大型医院机构就诊时,许多人都感到恐惧。有些人一旦走进医院的门诊大厅,就感到迷茫,既无法理解导医台医生的建议,也找不到应该去哪个科室进行检查。实际上,就医也是一门学问,如何优化…

【STM32 RTC实时时钟如何配置!超详细的解析和超简单的配置,附上寄存器操作】

STM32 里面RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。因为系统对后备寄存器和RTC相关寄存器有写保护,所以如果想要对后备寄存器和RTC进行访问,则需要通过操作…

我的3次软考高项通关之旅

1、缘起 初次听说软考是在2022年下半年了,软考的高级分为很多种,我起先想报考高级架构师,但是架构师一年才考一次,如果一次考不过得再准备一年,时间对我来说太长了,于是我决定报考一年考两次的高项。对于国…

10个AI高考上岸朋友圈文案设计

高考是人生中的一个重要时刻,上岸后分享朋友圈的文案可以既表达喜悦,也可以展现对未来的期待。以下是10个不同风格的高考上岸朋友圈文案,供你参考: 1. **梦想成真版**: "十年磨一剑,今朝试锋芒。高…

测试基础16:测试用例设计方法-测试大纲法

课程大纲 1、应用场景 验证页面跳转:有多个窗口/页面,每个窗口/页面有多个动作,每个动作之间有相互的联系的场景。看点击后,页面跳转正确与否。 2、设计步骤 step1.列出大纲:列出涉及的页面和页面可执行的动作。 s…

大厂面试官问我:Redis中热key和大key是怎么解决的?【后端八股文五:Redis热key和大key八股文合集】

往期内容: 大厂面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文一:Redis点赞八股文合集】-CSDN博客 大厂面试官问我:布隆过滤…

2024HW面试真题(三)之看完蓝初变蓝高

以下是部分面试真题记录‍‍ 关于黑客&网络安全学习指南 学好 网络安全不论是就业还是做副业赚钱都不错,但要学会 网络安全 还是要有一个学习规划。最后给大家分享一份全套的 网络安全学习资料,给那些想学习网络安全的小伙伴们一点帮助!…

eventbus和vuex

EventBus和Vuex EventBus 工作原理 创建一个vue实例,然后通过空的vue实例作为组件之间的桥梁,进行通信,利用到的设计模式有发布订阅模式 Vuex 工作原理 维护了一个state树,是独立的状态树,有明显的层级关系。不论…

振兴黄河新生力 打造文旅新地标——全国首家黄河会客厅在山东济南启幕

6月26日,由黄河文化发展工作站组织实施的全国首家黄河会客厅平台发布会暨山东基地启动仪式在济南成功召开。黄河会客厅以“民生黄河、生态动能、中华文明”为核心主题,融汇黄河智库、黄河文明、黄河产域、黄河金融、黄河科创、黄河物贸六大振兴赋能体系&…

Leetcode Hot100之矩阵

1. 矩阵置零 题目描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 解题思路 题目要求进行原地更改,也就是不能使用额外的空间,因此我们可以使用第一行的元素来记录对应的…