在K8S上部署使用NATS消息传递的Go应用程序

8,577次阅读
没有评论

共计 3708 个字符,预计需要花费 10 分钟才能阅读完成。

Kubernetes,NATS 消息传递,部署 Go 应用程序,Docker 容器化

在 K8S 上部署使用 NATS 消息传递的 Go 应用程序

前提条件

在开始之前,请确保您满足以下:

步骤 1:编写部署 YAML 文件

首先,我们需要为 Go 应用程序和 NATS 消息传递系统定义部署 YAML 文件。让我们创建以下 YAML 文件:

app-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-go-img-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app-go
  template:
    metadata:
      labels:
        app: app-go
    spec:
      containers:
        - name: app-go-container
          image: app-go
          imagePullPolicy: Never
          ports:
            - containerPort: 8080

nats-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nats
spec:
  replicas: 1
  strategy: {}
  selector:
    matchLabels:
      app: nats
  template:
    metadata:
      labels:
        app: nats
    spec:
      containers:
        - name: nats
          image: nats:2.7.0-alpine
          ports:
            - containerPort: 4222
              targetPort: 4222

nats-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nats-service
spec:
  selector:
    app: nats
  ports:
    - name: client
      port: 4222
      targetPort: 4222
      protocol: TCP

步骤 2:编写 Go 应用程序代码

接下来,我们需要编写 Go 应用程序的代码。创建一个名为 `main.go` 的文件,并添加以下代码:

package main
import (
"fmt"
"log"
"os"
"time"
"github.com/nats-io/nats.go"
)
func main() {url := os.Getenv("NATS_URL")
if url == "" {
url = nats.DefaultURL
// url = "nats://nats-service.default.svc.cluster.local:4222"
// works fine in case of interpod communication
// another way is to use the service-url directly
url = "nats-service:4222"
}
nc, err := nats.Connect(url)
if err != nil {log.Fatalln(err)
}
defer nc.Drain()
nc.Publish("greet.joe", []byte("hello"))
sub, _ := nc.SubscribeSync("greet.*")
msg, _ := sub.NextMsg(10 * time.Millisecond)
fmt.Println("subscribed after a publish...")
fmt.Printf("msg is nil? %vn", msg == nil)
nc.Publish("greet.joe", []byte("hello"))
nc.Publish("greet.pam", []byte("hello"))
msg, _ = sub.NextMsg(10 * time.Millisecond)
fmt.Printf("msg data: %q on subject %qn", string(msg.Data), msg.Subject)
msg, _ = sub.NextMsg(10 * time.Millisecond)
fmt.Printf("msg data: %q on subject %qn", string(msg.Data), msg.Subject)
nc.Publish("greet.bob", []byte("hello"))
msg, _ = sub.NextMsg(10 * time.Millisecond)
fmt.Printf("msg data: %q on subject %qn", string(msg.Data), msg.Subject)
}

该代码将连接到 NATS 消息传递系统,发布和订阅消息,并演示了基本功能。

步骤 3:构建 Docker 镜像

现在,让我们构建 Go 应用程序的 Docker 镜像。我们将使用多阶段的 Dockerfile 来确保获得一个轻量且优化的镜像。创建一个名为 `Dockerfile` 的文件,并添加以下代码:

### 阶段 1:构建 Go 二进制文件
FROM golang:1.17 AS builder
### 在容器内设置工作目录
WORKDIR /app
### 复制 Go 模块文件并下载依赖项
COPY go.mod go.sum ./
RUN go mod download
### 将应用程序源代码复制到容器中
COPY . .
### 构建 Go 应用程序
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
# 阶段 2:创建最终镜像
FROM alpine:latest
# 在容器内设置工作目录
WORKDIR /app
# 从构建阶段复制 Go 二进制文件
COPY --from=builder /app/main .
# 暴露应用程序监听的端口
EXPOSE 8080
# 定义容器启动时运行应用程序的命令
CMD ["./main"]

在 Mac 上构建镜像,请执行以下命令:

docker buildx build --platform linux/amd64 -t app-go-container .

完成后,您的文件夹结构应如下所示:

- app-deployment.yaml
- nats-deployment.yaml
- nats-service.yaml
- main.go
- Dockerfile

步骤 4:在 Kubernetes 上部署应用程序

有了我们准备好的 Docker 镜像,让我们使用 Minikube 在 Kubernetes 上部署应用程序。

首先,执行以下命令确保 Minikube 正在运行:

minikube start

接下来,将 Docker 镜像加载到 Minikube 的镜像存储库中:

minikube image load app-go-container

最后,应用部署和服务的 YAML 文件以在 Kubernetes 上创建所需的资源:

kubectl apply -f app-deployment.yaml
kubectl apply -f nats-deployment.yaml
kubectl apply -f nats-service.yaml

文章总结

本文介绍了如何在 Kubernetes 上部署使用 NATS 消息传递的 Go 应用程序。

我们涵盖了编写部署 YAML 文件、编写 Go 应用程序代码、构建 Docker 镜像以及使用 Minikube 在 Kubernetes 上部署应用程序的过程。

通过按照这些步骤,您可以轻松地在 Kubernetes 集群上部署使用 NATS 消息传递的 Go 应用程序,充分利用容器化和编排的强大功能。

请随意根据您的特定需求自定义配置并扩展本文介绍的概念。 文章来源地址 https://www.toymoban.com/diary/golang/663.html

到此这篇关于在 K8S 上部署使用 NATS 消息传递的 Go 应用程序的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!

原文地址:https://www.toymoban.com/diary/golang/663.html

如若转载,请注明出处:如若内容造成侵权 / 违法违规 / 事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计3708字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)