”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 带有 go 工作区的 Golang 微服务模块化架构

带有 go 工作区的 Golang 微服务模块化架构

发布于2024-11-08
浏览:619

可扩展的代码库基础设施

Golang 在后端开发、并发操作方面表现出色,是构建可扩展和高性能后端应用程序的完美套件。由于缺乏围绕 Go 工作区的微服务架构的帖子,这是通过不同服务共享模块化代码的令人难以置信的工具,我决定分享我的实现。

项目设置

Golang microservice modular architecture with go workspace

mkdir docker

touch docker/Dockerfile.authentication

touch docker/Dockerfile.users

mkdir -p services/authentication

mkdir -p services/users

mkdir -p shared/utils

touch docker-compose.yml

以下 shell 命令将生成以下文件夹树结构

Golang microservice modular architecture with go workspace

设置 go 工作区

在项目的根目录下,只需使用简单的命令 go work init 创建一个 go 工作区,这将生成 go.work 文件

接下来,初始化所有能够保存依赖项的不同 go 项目,并运行代码库。

cd services/authentication && go mod init github.com/LegationPro/ms/services/authentication

cd ../.. && cd services/users && go mod init github.com/LegationPro/ms/services/users

cd ../.. && cd shared && go mod init github.com/LegationPro/ms/shared

运行以下命令后,您的项目应如下所示

Golang microservice modular architecture with go workspace

接下来,我们将填充 go 工作区,并通过运行以下命令告诉它工作区的一部分是什么

去工作使用 ./services/authentication ./services/users ./shared

这将填充 go.work 文件

go 1.23.1

use (
    ./services/authentication
    ./services/users
    ./shared
)

使用 Docker 进行设置

让我们先看一下 docker-compose.yml。

您的 docker-compose.yml 文件应如下所示

services:
  authentication:
    build:
      context: .
      dockerfile: docker/Dockerfile.authentication
    volumes:
      - ./services/authentication:/app/authentication
      - ./shared:/app/shared
    ports:
      - "8081:8081"

  users:
    build:
      context: .
      dockerfile: docker/Dockerfile.users
    volumes:
      - ./services/users:/app/users
      - ./shared:/app/shared
    ports:
      - "8082:8082"

我们告诉 docker-compose 使用以下服务,即身份验证和用户。

我们给出的是根上下文,因此我们可以访问根级别的文件和文件夹。

提供 dockerfile 位置。

定义容器的给定体积,并在最后公开容器运行的端口。

设置 Dockerfile

设置 Dockerfile 非常简单且直接。

我们拉取最新的 golang alpine 镜像,分配一个工作目录,移动一些代码,调整它以适应 go 工作空间结构,然后简单地运行它。

docker/Dockerfile.authentication

# Pull golang image
FROM golang:1.23-alpine

# Switch to /app as the working directory
WORKDIR /app

# Copy the authentication codebase over to our container
COPY ./services/authentication /app/authentication/

# Copy the shared codebase and libraries that are shared across our apps inside the container
COPY ./shared /app/shared

# Initialize go workspace inside of our container
RUN go work init

# Assign different codebases to go workspaces
RUN go work use ./authentication ./shared

# Simply run our service with this simple command
CMD ["go", "run", "./authentication"]

Dockerfile.users

# Pull golang image
FROM golang:1.23-alpine

# Switch to /app as the working directory
WORKDIR /app

# Copy the authentication codebase over to our container
COPY ./services/users /app/users/

# Copy the shared codebase and libraries that are shared across our apps inside the container
COPY ./shared /app/shared

# Initialize go workspace inside of our container
RUN go work init

# Assign different codebases to go workspaces
RUN go work use ./users ./shared

# Simply run our service with this simple command
CMD ["go", "run", "./users"]

编写我们的服务代码

services/authentication/main.go

package main

import (
    "fmt"

    "github.com/LegationPro/ms/shared/utils"
)

func main() {
    fmt.Println(utils.SomeAuthFunc())
}

services/users/main.go

package main

import (
    "fmt"

    "github.com/LegationPro/ms/shared/utils"
)

func main() {
    fmt.Println(utils.SomeUserFunc())
}

共享/utils/utils.go

package utils

func SomeAuthFunc() string {
    return "Some auth func"
}

func SomeUserFunc() string {
    return "Some user func"
}

现在的结构应该是这样的

Golang microservice modular architecture with go workspace

在 docker 容器内运行应用程序

docker-compose up --build

为了确保一切正常,输出应如下所示:

Golang microservice modular architecture with go workspace

就是这样,您就拥有了一个功能齐全的 Go Workspace 模块化微服务架构设置! ??

源代码:https://github.com/LegationPro/go-microservice-modular-docker-setup

谢谢

感谢您阅读我的博文,希望这对您有所帮助❤️!

版本声明 本文转载于:https://dev.to/legationpro/golang-microservice-modular-architecture-with-go-workspace-44db?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何监控 Guzzle Http 客户端 – PHP 快速提示
    如何监控 Guzzle Http 客户端 – PHP 快速提示
    Guzzle 是一款流行的 PHP HTTP 客户端,可以轻松发送 HTTP 请求和创建 Web 服务库。最流行的 PHP 框架提供了内部 Http Client 服务,它们只是 Guzzle Http Client 的定制实现: Laravel Http 客户端 Symfony Http 客户端 ...
    编程 发布于2024-11-08
  • 为什么 Python 在方法中需要显式的“Self”参数?
    为什么 Python 在方法中需要显式的“Self”参数?
    揭秘Python方法中的“Self”参数与某些编程语言不同,对象引用是用“this”关键字隐式定义的, Python 要求在方法定义中显式包含“self”参数。这种设计决策提出了一个问题:它是故意的还是实现限制的问题。在 Python 中,“self”参数显式地建立了方法与其类实例之间的关系。它提供...
    编程 发布于2024-11-08
  • 使用 Gin/Golang 时如何处理空请求主体:绑定和调试技术指南
    使用 Gin/Golang 时如何处理空请求主体:绑定和调试技术指南
    Gin/Golang 中请求正文为空使用 Gin 处理 POST 请求时,偶尔可能会遇到请求正文显示为空的问题是空的。这可能会令人沮丧,尤其是当您希望从客户端接收数据时。此问题的一个常见原因是尝试直接打印正文。Gin 将请求正文表示为接口类型 ReadCloser。但打印该接口的字符串值并不会泄露实...
    编程 发布于2024-11-08
  • Python 列表理解
    Python 列表理解
    Python 最酷的事情之一是列表推导式如何让在一行代码中创建和操作列表变得非常容易。列表理解是一种通过转换和过滤现有列表中的元素来构建新列表的简洁方法。这个特性是 Python 使代码更具可读性和高效性的众多方法之一,对于初学者来说是一个很好的学习工具。在这里阅读更多示例...... 奥利弗 |图...
    编程 发布于2024-11-08
  • 如何在 Gin 中组织路由:分组路由定义指南?
    如何在 Gin 中组织路由:分组路由定义指南?
    如何在 Gin 中组织路由为了避免路由定义使主文件混乱,您可以将路由分组到单独的文件中。这种方法可以实现更好的代码组织和可维护性。要创建嵌套路由分组,您可以将路由器变量存储在结构体或全局变量中。然后,各个文件可以将处理程序添加到此共享路由器实例。示例实现routes.gopackage app im...
    编程 发布于2024-11-08
  • Leetcode链表问题
    Leetcode链表问题
    反向链表(LeetCode #206) 难度:简单 概念:迭代和递归方法。 合并两个排序列表 (LeetCode #21) 难度:简单 概念:链表遍历和合并技术。 从列表末尾删除第 N 个节点 **(LeetCode #19) **难度:中等 概念:两指针技术(慢指针和快指针)。 链表循环 **(...
    编程 发布于2024-11-08
  • 如何在 C++ 容器中存储异构对象:boost::any 或自定义实现?
    如何在 C++ 容器中存储异构对象:boost::any 或自定义实现?
    在 C 容器中存储异构对象C 容器通常需要同质元素,这意味着它们只能保存单一类型的对象。但是,在某些情况下,您可能需要一个可以容纳混合数据类型的容器。本文探讨了如何使用 boost::any 库和自定义方法来实现此目的。使用 boost::anyboost::any 是一个模板类可以容纳任何 C 类...
    编程 发布于2024-11-08
  • 使用 Pandas 掌握数据分析:从数据中释放洞察力
    使用 Pandas 掌握数据分析:从数据中释放洞察力
    数据分析是数据科学的核心,Python 的 Pandas 库是一个强大的工具,可以使这项任务变得更轻松、更高效。无论您使用简单的电子表格还是大型数据集,Pandas 都可以让您像专业人士一样灵活地操作、分析和可视化数据。在本文中,我们将深入探讨 Pandas 的基础知识,涵盖从数据操作到高级分析技术...
    编程 发布于2024-11-08
  • 最佳免费开源图标库 4
    最佳免费开源图标库 4
    In 2024, finding the best free icon library can significantly enhance the visual appeal of your websites, apps, or digital projects. Whether you're a ...
    编程 发布于2024-11-08
  • React Part 组件、State 和 Props 入门
    React Part 组件、State 和 Props 入门
    欢迎回到我们的 React.js 之旅!在上一篇文章中,我们介绍了 React 的基础知识,强调了它作为构建动态用户界面的库的优势。今天,我们将深入探讨创建 React 应用程序所必需的三个基本概念:组件、状态和属性。让我们详细探讨这些概念! 什么是 React 组件? React ...
    编程 发布于2024-11-08
  • 如何利用原生 ES6 Promises 有效地链接异步 jQuery 函数?
    如何利用原生 ES6 Promises 有效地链接异步 jQuery 函数?
    JavaScript 的互操作性承诺实现异步 jQuery 函数的高效链接链接异步 jQuery 函数时,通常需要避免 jQuery 的内置函数Promises 功能并使用原生 ES6 Promises 代替。这种互操作性允许 jQuery 操作和您想要的 Promise 实现之间的无缝集成。使用 ...
    编程 发布于2024-11-08
  • 在 Python 中使用 ElementTree 的“find”和“findall”方法时如何忽略 XML 命名空间?
    在 Python 中使用 ElementTree 的“find”和“findall”方法时如何忽略 XML 命名空间?
    在 ElementTree 的“find”和“findall”方法中忽略 XML 命名空间使用 ElementTree 模块解析和定位 XML 文档中的元素时,命名空间会带来复杂性。下面介绍了如何在 Python 中使用“find”和“findall”方法时忽略命名空间。当 XML 文档包含命名空间...
    编程 发布于2024-11-08
  • Bitbucket 综合指南:功能、集成和最佳实践
    Bitbucket 综合指南:功能、集成和最佳实践
    Bitbucket简介 Bitbucket 是 Atlassian 旗下基于 Git 的源代码存储库托管服务,以其强大的集成能力和强大的协作功能而闻名。它适合各种规模的团队,提供可简化开发工作流程、提高生产力并确保安全代码管理的解决方案。无论您是小型团队还是大型企业的一部分,Bitbucket 都...
    编程 发布于2024-11-08
  • 如何在 Python 中用逗号连接列表中的字符串?
    如何在 Python 中用逗号连接列表中的字符串?
    从列表中用逗号连接字符串将字符串列表映射到逗号分隔的字符串是编程中的常见任务。可以采用各种方法来实现此目标,每种方法都有自己的优点和缺点。一种流行的方法是将 join 方法与映射函数结合使用。此方法需要创建一个中间字符串,用作各个字符串之间的分隔符。例如:my_list = ['a', 'b', '...
    编程 发布于2024-11-08
  • 如何处理 AngularJS 应用程序中的锚点哈希链接?
    如何处理 AngularJS 应用程序中的锚点哈希链接?
    AngularJS 中的锚点哈希处理使用锚点浏览网页是一种常见的做法,特别是对于具有多个部分的长页面。然而,在 AngularJS 应用程序中,锚链接处理可能会出现问题。当单击 AngularJS 中的锚链接时,默认行为是拦截单击并将用户重定向到不同的页面。为了解决这个问题,AngularJS 提供...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3