Go 项目结构组织

Web后端项目结构组织#

要点:

  • 使用modelservice,而不是modlesservices。差别不大,节约一个字母,更加简洁。
  • 如果是企业内部的微服务,基本不会、极少把部分的功能以library的形式开放出去,internal目录在这个时候就略显鸡肋,可以省略。

备注:

  • xxx、yyy代表大块的业务区分:如用户、订单、支付
  • aaa、bbb代表小块的业务区分:如(用户的)登录、注册、查询

方案一:多业务模块通过文件名区分,不分子包#

适用于小型项目

注:handler、model、service要留意方法、结构体、接口的命名,避免冲突

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
example/
|-- cmd/
| |-- example-server/
| |-- example-server.go (start gin app, manage handler, middleware)
|-- pkg/
| |-- handler/
| |-- aaa_handler.go
| |-- bbb_handler.go
| |-- middleware/
| |-- aaa_middleware.go
| |-- bbb_middleware.go
| |-- model/
| |-- aaa_model.go
| |-- bbb_model.go
| |-- service/
| |-- aaa_service.go
| |-- bbb_service.go
| |-- ignite/
| |-- ignite.go
| |-- ignite_test.go
| |-- influx/
| |-- influx.go
| |-- influx_test.go
|-- docker-build/
| |-- scripts/
| |-- start.sh
|-- Dockerfile

方案二:多业务模块通过包名区分,但不拆分model和service#

方案二更适用于由多个小模块组合而成的项目,每个小模块不会太大,复用度较高。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
example/
|-- cmd/
| |-- example-server/
| |-- example-server.go (start gin app, manage handler, middleware)
|-- pkg/
| |-- handler/
| |-- xxx/
| |-- xxx_aaa_handler.go
| |-- xxx_bbb_handler.go
| |-- yyy/
| |-- yyy_aaa_handler.go
| |-- yyy_bbb_handler.go
| |-- middleware/
| |-- xxx/
| |-- xxx_aaa_middleware.go
| |-- yyy/
| |-- yyy_bbb_middleware.go
| |-- xxx/
| |-- xxx_aaa_model.go
| |-- xxx_aaa_service.go
| |-- yyy/
| |-- yyy_bbb_model.go
| |-- yyy_bbb_service.go
| |-- ignite/
| |-- ignite.go
| |-- ignite_test.go
| |-- influx/
| |-- influx.go
| |-- influx_test.go
|-- docker-build/
| |-- scripts/
| |-- start.sh
|-- Dockerfile

方案三:多业务模块通过包名区分,并在下层拆分model和service#

方案三更适用于由多个大模块组合而成的项目,每个大模块都很大,复用度较低,较少的互相调用。

方案三在service依赖多个service的情况下,会发生命名冲突。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
example/
|-- cmd/
| |-- example-server/
| |-- example-server.go (start gin app, manage handler, middleware)
|-- pkg/
| |-- handler/
| |-- xxx/
| |-- xxx_aaa_handler.go
| |-- yyy/
| |-- yyy_bbb_handler.go
| |-- middleware/
| |-- xxx/
| |-- xxx_aaa_middleware.go
| |-- yyy/
| |-- yyy_bbb_middleware.go
| |-- xxx/
| |-- model/
| |-- xxx_aaa_model.go
| |-- service/
| |-- xxx_aaa_service.go
| |-- yyy/
| |-- model/
| |-- yyy_bbb_model.go
| |-- service/
| |-- yyy_bbb_service.go
| |-- ignite/
| |-- ignite.go
| |-- ignite_test.go
| |-- influx/
| |-- influx.go
| |-- influx_test.go
|-- docker-build/
| |-- scripts/
| |-- start.sh
|-- Dockerfile