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

2024-06-20 12:12

本文主要是介绍Gone——golang依赖注入框架介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 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 mainimport ("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 标记,匿名嵌入后,一个结构体就实现了Gonergone.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参数Toreq *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%ADcemetery.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 mainimport ("fmt""github.com/gone-io/gone"
)// Worker 接口
type Worker interface {Do()
}
type Boss struct {gone.Flagworkers []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.//注册BossBury(&Boss{}).//注册多个Worker GonersBury(&WorkerX{}).Bury(&WorkerX{}).Bury(&WorkerX{})return nil}).//Goner启动Run(func(boss *Boss) { //Run 方法中的参数被自动注入boss.Do()})
}

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

关于Logo

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

这篇关于Gone——golang依赖注入框架介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1078098

相关文章

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

python中poetry安装依赖

《python中poetry安装依赖》本文主要介绍了Poetry工具及其在Python项目中的安装和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前言1. 为什么pip install poetry 会造成依赖冲突1.1 全局环境依赖混淆:1

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte