Go:具有共享代码的微服务的存储库布局

noa*_*mtm 1 go microservices monorepo

我们最近开始使用 Go 来开发新的微服务。每个微服务都是一个 Go 模块,我们将它们作为单一存储库进行管理:

/
  services/
    s1/
      go.mod
      main.go
    s2/
      go.mod
      main.go
Run Code Online (Sandbox Code Playgroud)

这工作正常,但现在我们需要在s1和之间共享一些代码s2- 两个服务使用的一些结构、上传到 S3 的函数等。

处理这种情况的正确方法是什么?common理想情况下,我会在存储库根目录( 的同级目录)中有一个目录,并将通用代码放在那里 - 但是 Go 在编译和 时services如何从那里获取代码?s1s2

lar*_*sks 5

我认为你问的实际上只是“如何构建 Go 应用程序来生成多个二进制文件? ”的变体。

\n

您可以将您的go.mod目录重命名为顶级目录,以便您拥有以下布局:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 common\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 common.go\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.mod\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 services\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 s1\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.go\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 s2\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.go\n
Run Code Online (Sandbox Code Playgroud)\n

开头是go.mod这样的:

\n
module mymodule\n
Run Code Online (Sandbox Code Playgroud)\n

如果common/common.go看起来像这样:

\n
package common\n\nfunc CommonFunction() string {\n    return "This is a common function"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后在 中services/s1/main.go,您可以导入该common模块:

\n
package main\n\nimport (\n        "mymodule/common"\n        "fmt"\n)\n\nfunc main() {\n        res := common.CommonFunction()\n        fmt.Println(res)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

您将s1像这样构建服务:

\n
go build ./services/s1\n
Run Code Online (Sandbox Code Playgroud)\n

建筑s2类似:

\n
go build ./services/s2\n
Run Code Online (Sandbox Code Playgroud)\n

您通常会拥有一个顶层Makefile来自动构建多个服务。

\n