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

文章目录

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

go 复制代码
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测试:

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

结果如下:

bash 复制代码
{"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,建立一个 天国,"天国的所有人都不再残缺,他们想要的必定得到满足"。

代码版本

go 复制代码
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()
		})
}

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

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

相关推荐
brzhang几秒前
代码越写越乱?掌握这 5 种架构模式,小白也能搭出清晰系统!
前端·后端·架构
Asthenia04122 分钟前
为什么MySQL关联查询要“小表驱动大表”?深入解析与模拟面试复盘
后端
南雨北斗5 分钟前
分布式系统中如何保证数据一致性
后端
Asthenia04129 分钟前
Feign结构与请求链路详解及面试重点解析
后端
左灯右行的爱情12 分钟前
缓存并发更新的挑战
jvm·数据库·redis·后端·缓存
brzhang16 分钟前
告别『上线裸奔』!一文带你配齐生产级 Web 应用的 10 大核心组件
前端·后端·架构
shepherd11117 分钟前
Kafka生产环境实战经验深度总结,让你少走弯路
后端·面试·kafka
anqi2725 分钟前
如何在 IntelliJ IDEA 中编写 Speak 程序
java·大数据·开发语言·spark·intellij-idea
XuX0329 分钟前
MATLAB小试牛刀系列(1)
开发语言·matlab
袋鱼不重30 分钟前
Cursor 最简易上手体验:谷歌浏览器插件开发3s搞定!
前端·后端·cursor