微服务之间共享模型

问题描述 投票:0回答:1

我正在尝试开发我的第一个微服务(演员、电影、用户),我对其概念可能是错误的。
这是我的项目的结构。

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"`
}

微服务之间共享有一些好的实践吗?

go architecture microservices
1个回答
0
投票

如果您在服务之间共享类型,最好为此创建一个单独的包。让我解释一下。

单独的服务 – 单独的存储库和部署 因此,当您说要独立运行它们时,假设服务是 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
© www.soinside.com 2019 - 2024. All rights reserved.