Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
This repository was archived by the owner on Dec 29, 2024. It is now read-only.
/go-springPublic archive

基于 IoC 的 Go 后端一站式开发框架 ( All-in-One Development Framework on IoC for Go ) 🚀

License

NotificationsYou must be signed in to change notification settings

go-spring/go-spring

Repository files navigation

logo
licensego-versionrelease

如果你想参与 Go-Spring 项目的研发和管理,欢迎加入项目团队,你可以是擅长编码的技术极客,可以是擅长项目管理的沟通达人,可以是擅长撰写文档的文字高手,Go-Spring 项目团队都热切欢迎你的加入!

如果你觉得 Go-Spring 项目很棒,但是没有时间亲身加入,你也可以通过捐赠的方式助力和守护 Go-Spring 项目的成长,所有捐赠的资金都将透明地用于 Go-Spring 项目团队的人员激励和项目推广。

最后,欢迎 🌟 本项目,你的关注是我和团队继续前进的动力!破釜沉舟,百二秦关终属楚;卧薪尝胆,三千越甲可吞吴!

Go-Spring 的愿景是让 Go 程序员也能用上如 Java Spring 那般威力强大的编程框架,立志为用户提供简单、安全、可信赖的编程体验。

其特性如下:

  1. 提供了完善的 IoC 容器,支持依赖注入、属性绑定;
  2. 提供了强大的启动器框架,支持自动装配、开箱即用;
  3. 提供了常见组件的抽象层,支持灵活地替换底层实现;
    3.1 抽象 web 框架,echo 和 gin 可以灵活替换。
    3.2 抽象 redis 框架,redigo 和 go-redis 可以灵活替换。
  4. 遵循最小依赖原则,部分组件零依赖,避免依赖地狱;
    4.1 提供 assert 包,满足日常测试断言的需求。
    4.2 提供 cast 包,满足日常数据转换的需求。
    4.3 提供 atomic 包,方便并发安全的存取数据。
  5. 首创基于框架的流量录制和回放技术,让测试更简单;
  6. 实现 Log4J 的日志架构,让日志管理更简单、更强大;

Go-Spring 当前使用 Go1.14 进行开发,使用 Go Modules 进行依赖管理。

项目列表

路线图

  • 完善 Base 基础库的能力。
    • 实现 assert 包常用的断言能力。
    • 实现 atomic 包常用原子操作的封装。
    • 实现 cast 包常用的类型转换。
    • 实现上下文缓存组件包 knife。
    • 实现进程内缓存组件包 cache。
    • 实现 jsonpath 操作 json 数据的能力。
  • 实现基本完善的 IoC 和 Boot 框架。
    • 实现读取应用程序配置的组件。
    • 实现 IoC 依赖注入框架。
    • 实现 Boot 自动装配框架。
  • 实现 Log4J 风格的日志框架。
  • 实现 Web 框架以及对 Echo 和 Gin 的适配。
    • 实现 Web 服务器以及中间件能力。
    • 实现 Echo 适配以及开箱即用的能力。
    • 实现 Gin 适配以及开箱即用的能力。
  • 实现 Redis 框架以及对 Redigo 和 Go-Redis 的适配。
    • 实现 Redis 客户端以及中间件能力。
    • 实现 Redigo 适配以及开箱即用的能力。
    • 实现 Go-Redis 适配以及开箱即用的能力。
  • 实现 MyBatis 风格的 SQL 框架。
  • 实现 MQ 框架以及对 RabbitMQ 和 RocketMQ 的适配。
    • 实现 MQ 服务器和客户端能力。
    • 实现 RabbitMQ 适配以及开箱即用的能力。
    • 实现 RocketMQ 适配以及开箱即用的能力。
  • 实现 go-mongo 开箱即用的能力。
  • 实现 gorm 开箱即用的能力。
  • 实现基本完善的流量录制和回放框架。
  • 实现 Web 组件的流量录制和回放。
  • 实现 Redis 组件的流量录制和回放。
  • 实现 Gorm 组件的流量录制和回放。
  • 实现 MQ 组件的流量录制和回放。
  • 实现前后端分离的应用程序组织标准。

优秀教程

《Go-Spring 学习笔记》

《Go-Spring 入门篇》

《从零构建 Go-Spring 项目》

IoC 容器

Go-Spring 不仅实现了如 Java Spring 那般功能强大的 IoC 容器,还扩充了 Bean 的概念。在 Go 中,对象(即指针)、数组、Map、函数指针,这些都是 Bean,都可以放到 IoC 容器里。

常用的 Java Spring 注解对应的 Go-Spring 实现
@Valuevalue:"${}"
@Autowired@Qualifier@Requiredautowire:"?"
@ConfigurableWireBean()
@ProfileConditionOnProfile()
@PrimaryPrimary()
@DependsOnDependsOn()
@ConstructorBindingRegisterBeanFn()
@ComponentScan@IndexedPackage Import
@ConditionalNewConditional()
@ConditionalOnExpressionNewExpressionCondition()
@ConditionalOnPropertyNewPropertyValueCondition()
@ConditionalOnBeanNewBeanCondition()
@ConditionalOnMissingBeanNewMissingBeanCondition()
@ConditionalOnClassDon't Need
@ConditionalOnMissingClassDon't Need
@Lookup——

属性绑定

Go-Spring 不仅支持对普通数据类型进行属性绑定,也支持对自定义值类型进行属性绑定,而且还支持对结构体属性的嵌套绑定。

type DB struct {UserName string `value:"${username}"`Password string `value:"${password}"`Url      string `value:"${url}"`Port     string `value:"${port}"`DB       string `value:"${db}"`}type DbConfig struct {DB []DB `value:"${db}"`}

上面这段代码可以通过下面的配置进行绑定:

db:  -    username: root    password: 123456    url: 1.1.1.1    port: 3306    db: db1  -    username: root    password: 123456    url: 1.1.1.1    port: 3306    db: db2

Boot 框架

Go-Spring 提供了一个功能强大的启动器框架,不仅实现了自动加载、开箱即用,而且可以非常容易的开发自己的启动器模块,使得代码不仅仅是库层面的复用。

快速示例

下面的示例使用 v1.1.0-rc2 版本测试通过。

import ("fmt""github.com/go-spring/spring-core/gs""github.com/go-spring/spring-core/web"_ "github.com/go-spring/starter-echo")func init() {gs.Object(new(Controller)).Init(func(c *Controller) {gs.GetMapping("/", c.Hello)})}type Controller struct {GOPATH string `value:"${GOPATH}"`}func (c *Controller) Hello(ctx web.Context) {ctx.String("%s - hello world!", c.GOPATH)}func main() {fmt.Println(gs.Run())}

启动上面的程序,控制台输入curl http://localhost:8080/, 可得到如下结果:

/Users/didi/go - hello world!

更多示例:https://github.com/go-spring/go-spring/tree/master/examples

普通路由

package mainimport ("fmt""github.com/go-spring/spring-core/gs""github.com/go-spring/spring-core/web"_ "github.com/go-spring/starter-echo")func main() {gs.GetMapping("/a/b/c", func(ctx web.Context) {ctx.String("OK")})fmt.Println(gs.Run())}
➜ curl http://127.0.0.1:8080/a/b/cOK

java 风格路由

package mainimport ("fmt""github.com/go-spring/spring-core/gs""github.com/go-spring/spring-core/web"_ "github.com/go-spring/starter-echo")func main() {gs.GetMapping("/:a/b/:c/{*:d}", func(ctx web.Context) {ctx.String("a=%s b=%s *=%s\n", ctx.PathParam("a"), ctx.PathParam("c"), ctx.PathParam("*"))ctx.String("a=%s b=%s *=%s\n", ctx.PathParam("a"), ctx.PathParam("c"), ctx.PathParam("d"))})fmt.Println(gs.Run())}
➜ curl http://127.0.0.1:8080/a/b/c/da=a b=c *=da=a b=c *=d

echo 风格路由

package mainimport ("fmt""github.com/go-spring/spring-core/gs""github.com/go-spring/spring-core/web"_ "github.com/go-spring/starter-echo")func main() {gs.GetMapping("/:a/b/:c/*", func(ctx web.Context) {ctx.String("a=%s c=%s *=%s", ctx.PathParam("a"), ctx.PathParam("c"), ctx.PathParam("*"))})fmt.Println(gs.Run())}
➜ curl http://127.0.0.1:8080/a/b/c/da=a c=c *=d

gin 风格路由

package mainimport ("fmt""github.com/go-spring/spring-core/gs""github.com/go-spring/spring-core/web"_ "github.com/go-spring/starter-echo")func main() {gs.GetMapping("/:a/b/:c/*d", func(ctx web.Context) {ctx.String("a=%s b=%s *=%s\n", ctx.PathParam("a"), ctx.PathParam("c"), ctx.PathParam("*"))ctx.String("a=%s b=%s *=%s\n", ctx.PathParam("a"), ctx.PathParam("c"), ctx.PathParam("d"))})fmt.Println(gs.Run())}
➜ curl http://127.0.0.1:8080/a/b/c/da=a b=c *=da=a b=c *=d

文件服务器

package mainimport ("fmt""net/http""github.com/go-spring/spring-core/gs""github.com/go-spring/spring-core/web"_ "github.com/go-spring/starter-echo")func main() {gs.HandleGet("/public/*", web.WrapH(http.StripPrefix("/public/", http.FileServer(http.Dir("public")))))fmt.Println(gs.Run())}

然后在项目下创建一个 public 目录,里面创建一个内容为 hello world! 的 a.txt 文件。

➜ curl http://127.0.0.1:8080/public/a.txthello world!

BIND 模式

package mainimport ("context""fmt""github.com/go-spring/spring-core/gs""github.com/go-spring/spring-core/web"_ "github.com/go-spring/starter-echo")type HelloReq struct {Name string `form:"name"`}type HelloResp struct {Body string `json:"body"`}func main() {gs.GetBinding("/hello", func(ctx context.Context, req *HelloReq) *web.RpcResult {return web.SUCCESS.Data(&HelloResp{Body: "hello " + req.Name + "!"})})fmt.Println(gs.Run())}
➜ curl 'http://127.0.0.1:8080/hello?name=lvan100' {"code":200,"msg":"SUCCESS","data":{"body":"hello lvan100!"}}

中间件

Basic Auth

package mainimport ("fmt""github.com/go-spring/spring-core/gs""github.com/go-spring/spring-core/web""github.com/go-spring/spring-echo"_ "github.com/go-spring/starter-echo""github.com/labstack/echo""github.com/labstack/echo/middleware")func main() {gs.Provide(func( /* 可以通过配置将用户名密码传进来 */ ) web.Filter {m := middleware.BasicAuth(func(u string, p string, e echo.Context) (bool, error) {if u == "lvan100" && p == "123456" {return true, nil}return false, nil})return SpringEcho.Filter(m)})gs.GetMapping("/hello", func(ctx web.Context) {ctx.String("hello %s!", ctx.QueryParam("name"))})fmt.Println(gs.Run())}
➜ curl 'http://127.0.0.1:8080/hello?name=lvan100'Unauthorized➜ curl 'http://127.0.0.1:8080/hello?name=lvan100' -H'Authorization: Basic bHZhbjEwMDoxMjM0NTY='{"code":200,"msg":"SUCCESS","data":{"body":"hello lvan100!"}}

详细文档

https://docs.lavend.net/

项目成员

发起者

@lvan100 (LiangHuan)

贡献者

特别鸣谢

@shenqidebaozi

如何成为贡献者?提交有意义的 PR 或者需求,并被采纳。

QQ 交流群


QQ群号:721077608

微信公众号

支持我们!

为了更好地吸引和激励开发者,我们需要您的捐赠,帮助项目快速发展。

特别鸣谢!

感谢 JetBrains 公司的 IntelliJ IDEA 产品提供方便快捷的代码编辑和测试环境。

License

The Go-Spring is released under version 2.0 of the Apache License.


[8]ページ先頭

©2009-2025 Movatter.jp