我正在尝试开发我的第一个微服务(演员、电影、用户),我对其概念可能是错误的。
这是我的项目的结构。
project
├── actors/
│ ├── cmd/...
│ ├── internal/
│ │ ├── handlers/handlers.go
│ │ ├── models/models.go
│ │ └── services/services.go
│ └── ...
├── movies/
│ ├── cmd/...
│ ├── internal/
│ │ ├── handlers/handlers.go
│ │ ├── models/models.go
│ │ └── services/services.go
│ └── ...
└── ...
我计划独立运行它们,每个 Docker 容器一个微服务。现在我无法解决相关模型的问题,因为 go 禁止从内部导入,即使我以某种方式导入模型,我也必须将额外的文件复制到容器中(或者这是唯一可能的方法?):
package models
type Actor struct {
ID uint `json:"id"`
Name string `json:"name"`
Gender string `json:"gender"`
Birthdate string `json:"birthdate"`
}
package models
import (
"main/actors/internal/models" // Broken Import!!!
)
type Movie struct {
ID uint `json:"id"`
Name string `json:"name"`
Release string `json:"release"`
Rating uint `json:"rating"`
Actors []models.Actor `json:"actors"`
}
微服务之间共享有一些好的实践吗?
如果您在服务之间共享类型,最好为此创建一个单独的包。让我解释一下。
单独的服务 – 单独的存储库和部署 因此,当您说要独立运行它们时,假设服务是 Git 中的单独存储库,具有单独的版本控制和 CD 管道。
这是一个重要的方面,因为如果你假设有一个单一存储库推荐将会有所不同。
在这种情况下,您需要一个单独的存储库来存储您的域类型以及导入的微服务。这是一个很好的方法,因为您的域模型是版本化的,因此您可以更改模型并逐渐将服务切换到新版本。伴随着通常遵循模式演化的所有后果。
一个存储库
正如我所说,从我的角度来看,这个选项更糟糕,因为实际上您最终会得到单体而不是微服务。但是,如果你仍然喜欢一个想法,我想,一个结构应该是
project
├── cmd
│ ├── actors
│ │ └── internal
│ │ ├── handlers/handlers.go
│ │ └── services/services.go
│ └── movies
│ └── internal
│ ├── handlers/handlers.go
│ └── services/services.go
└── internal
└── domain
└── models/models.go