Go-Spring
[小喇叭]招募开发者!
由于 Go-Spring 是由我个人发起的项目,还不是团队作战,而且我在公司的主业务也很忙,所以基本上处于我有时间了就会更新的情况,但长此下去对 Go-Spring 的发展极为不利,也满足不了大家对 Go-Spring 的期待,所以欢迎对 Go-Spring 感兴趣的开发者参与到 Go-Spring 的日常开发和运营中来!
Go-Spring 核心特性
我个人认为目前 Go-Spring 实现了两个非常核心的特性:IoC 容器和开箱即用。
- IoC 容器可以满足对依赖注入、属性绑定、对象初始化的需求;
- 开箱即用可以满足对自动配置、依赖管理、第三方类库集成的需求。
有了这两大基本功能,GoLang 开发基本上算是摆脱了茹毛饮血的初级阶段。随着项目的不断完善,后面 GoLang 开发肯定会进入更高级的层次。
Go-Spring 编程思想
Go-Spring 主推两种编程思想:面向接口编程和面向模块编程。
- Go-Spring 为常见的业务领域提供了一个抽象层,通过抽象层可以屏蔽底层的实现细节,可以灵活的切换底层方案。
- Go-Spring 将不同的业务领域封装成模块,在内部注册模块所需的对象,通过 Starter 机制实现开箱即用的能力。
Go-Spring 项目仓库
Go-Spring 有两个仓库,一个是实现 IoC 容器特性的主项目所在的 didi 仓库,另一个是实现开箱即用特性的 Starters 项目所在的 go-spring仓库。
Go-Spring 1.0 目标
SpringCore: 实现完善的 IoC 容器功能,支持数组对象注入,支持更多类型的属性绑定,可能会支持 Bean 设置顺序;
TODO: 属性绑定支持结构嵌套,功能和设计见下面的详述。
SpringWeb: 目前已经抽象出了一个 SpringWeb 抽象层,并且完成了 gin 和 echo 的适配;
TODO: 中间件。一种方式是利用 gin 和 echo 各自的中间件,但是适配的时候会有问题,两者功能不对齐,难度不小;如果前面的方法不行,就要自己写代码,那么有两种方式,一种是完全自己写,一种是利用(抄)成熟项目的代码,前者就是工作量,但是没有风险,后者就要处理好不要落个抄袭的帽子。
SpringRPC: 目前已经抽象出了一个 SpringRpc 抽象层,并且已经实现了 http-json 的 rpc 功能;
TODO: gRpc。我和 @CoderPoet 已经研究了 gRpc 的集成,目前是通过暴露一个底层 gRpcServer 的方式实现的,但是 context 不能做到统一,但是能用;下一步的想法是 fork grpc 的 go 包 (https://github.com/lonerwolf/grpc-go),在里面实现一个新的 server,然后在 starter 里面做个适配应该就可以。
SpringTrace: 目前已经实现了一个 TraceContext,它是 context.Context 的增强版,具有 trace 和 log 的功能,也会对 context.Context 的功能作出限制,解决 context.Context 自身的一些问题。每个公司可能都会有自己的 log 格式,所以需要根据自己公司的情况进行适配,框架提供了适配的能力。
脚手架: TODO 创建 Go-Spring 推荐的项目结构,仓库地址 https://github.com/lonerwolf/create-go-spring。
TODO
Go-Spring 开发环境
当前请使用 Go1.12 版本进行开发。Go 保持半年一个版本的发布节奏,所以 Go 版本会定期的保持升级,但是一般会低 1~2 个版本。
Go-Spring 代码风格
代码必须使用 goimports
进行格式化,格式化的命令是 goimports -w -format-only *
。如果你使用的是 IDEA 开发工具,请按照以下步骤进行配置:
- Editor -> Code Style -> Go,选中 Imports 标签;
- Sorting type 选择
goimports
;
- 选中
Add parentheses for a single import
;
- 选中
Group stdlib imports
;
- 选中
Move all stdlib imports in a single group
;
- 选中
Move all imports in a single declaration
;
TODO 详述
create-go-spring 工具
语法示例:
create-go-spring -m 'github.com/lonerwolf/create-go-spring' [ web http-rpc redis gorm ... ]
-m 指定项目的 module 名称,存在 -m 标记时表示创建初始化项目,没有 -m 标记时表示给现有项目添加新的 go-spring 模块。
最后面是 go-spring 的模块名,用户选择了什么模块,初始项目中就有那个模块的简单示例;如果什么参数都不加就显示 help 信息,列出所有支持的模块。
属性绑定的嵌套功能说明
现在的样子:
type StreamServerConfig struct {
// RTMP 内网配置
RtmpInnerSecurePort string `value:"${rtmp.inner.secure.port}"`
RtmpInnerInsecurePort string `value:"${rtmp.inner.insecure.port}"`
// RTMP 外网配置
RtmpPublicSecureHost string `value:"${rtmp.public.secure.host}"`
RtmpPublicInsecureHost string `value:"${rtmp.public.insecure.host}"`
// HTTP 内网配置
HttpInnerSecurePort string `value:"${http.inner.secure.port}"`
HttpInnerInsecurePort string `value:"${http.inner.insecure.port}"`
// HTTP 外网配置
HttpPublicSecureHost string `value:"${http.public.secure.host}"`
HttpPublicInsecureHost string `value:"${http.public.insecure.host}"`
}
改造后的样子:
type StreamServer struct {
SecurePort string `value:"${secure.port}"`
SecureHost string `value:"${secure.host:=}"` // 有默认值
InsecurePort string `value:"${insecure.port}"`
InsecureHost string `value:"${insecure.host:=}"`
}
type StreamServerConfig struct {
RtmpInner *StreamServer `value:"${^rtmp.inner}"` // ^ 表示一个属性前缀,不能有默认值
RtmpPublic *StreamServer `value:"${^rtmp.public}"`
HttpInner *StreamServer `value:"${^http.inner}"`
HttpPublic *StreamServer `value:"${^http.public}"`
}
Go-Spring 项目简介
Go-Spring 是模仿 Java 的 Spring 全家桶实现的一套 GoLang 的应用程序框架,遵循“习惯优于配置”的原则,提供了依赖注入、自动配置、开箱即用、丰富的第三方类库集成等功能,能够让程序员少写很多的样板代码。
完整的 go-spring 项目一共包含 6 个模块,当前模块仅实现了基础的 IOC 容器的能力,该模块可以独立使用,但是配合其他模块才能使得效率最大化。其他模块发布在 https://github.com/lonerwolf 仓库下。下面是所有模块的列表:
1、程序启动框架
AppRunner
2、核心功能模块
GoSpring
3、启动器核心组件
GoSpringBoot
4、开源微服务组件
GoSpringCloud
5、多个项目启动器
GoSpringBootStarter
GoSpringCloudStarter
项目特点
- 面向接口编程
- 面向模块化编程
- 简单的启动器框架
- 依赖注入、属性注入
- 项目依赖管理
- 简化的 http test 框架
- 支持多种配置文件格式
- 支持多环境配置文件
- 统一的代码风格
- 自动加载配置、模块
- 丰富的示例,极易上手
代码规范
- 一个单词的包名采用小写格式(Maybe)
- 多个单词的包名使用首字母大写的格式
- HTTP 接口强制使用 POST 方法
- 业务代码允许 panic 中断请求
- 返回值包含详细的错误信息 …
实现原理
- AppRunner
- SpringContext
- Bean 管理
- Bean 注入,autowire
- 属性注入,value
- SpringBootApplication,适配 AppRunner
- 启动器框架,Starters
- 常用模块简介,Web、Redis、Mysql 等
- Spring-Message 框架
- Spring-Check + RPC框架
未来规划
- 继承 Java Spring 全家桶的设计原则,但不照搬照抄,适应 Go 语言
- 形成滴滴的 Go 项目和代码规范
- 完整支持微服务框架,监控、日志跟踪等
- 和 dubbo 协议、框架打通
- 创建新项目的工具软件
- 探索无服务器架构支持
- 管理端点 endpoint
- 更丰富的 debug 信息输出
- 支持用户配置覆盖模块默认配置
- 支持禁用特定的自动配置
- 定制 banner
- 属性支持占位符,松散绑定等高级特性 …
1.0 版本目标
TODO
示例
https://github.com/lonerwolf
相关文档
TODO
项目成员
发起者/负责人
lvan100 (LiangHuan)
如何成为外部贡献者? 提交有意义的PR,并被采纳。
QQ 交流群