Go

Dapr 提供了帮助开发 Go 可插拔组件的包。

前期准备

注意

在 Windows 上开发 Dapr 可插拔组件需要 WSL. 并非所有语言和 SDK 都在“本机”Windows 上公开 Unix 域套接字。

应用程序创建

创建一个可插拔组件始于一个空的Go应用程序。

  1. mkdir example
  2. cd component
  3. go mod init example

导入 Dapr 包

导入 Dapr 可插拔组件 SDK 包。

  1. go get github.com/dapr-sandbox/components-go-sdk@v0.1.0

创建 main 包

main.go 中,导入 Dapr 可插拔组件包并运行应用程序。

  1. package main
  2. import (
  3. dapr "github.com/dapr-sandbox/components-go-sdk"
  4. )
  5. func main() {
  6. dapr.MustRun()
  7. }

这将创建一个没有组件的应用程序。 您需要实现并注册一个或多个组件。

实现和注册组件

注意

每种类型的单个组件只能注册到单个服务。 然而,同一类型的多个组件可以分布在多个服务中

在本地测试组件

创建 Dapr 组件的 socket 目录

Dapr通过在一个公共目录中使用Unix域套接字文件与可插拔组件进行通信。 默认情况下,Dapr和可插拔组件都使用/tmp/dapr-components-sockets目录。 如果该目录尚不存在,您应该创建该目录。

  1. mkdir /tmp/dapr-components-sockets

启动可插拔组件

可插拔组件可以通过在命令行上启动应用程序进行测试。

要启动组件,在应用程序目录中执行以下操作:

  1. go run main.go

配置 Dapr 以使用可插拔组件

要配置Dapr使用该组件,请在资源目录中创建一个组件YAML文件。 例如,对于一个状态存储组件:

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: <component name>
  5. spec:
  6. type: state.<socket name>
  7. version: v1
  8. metadata:
  9. - name: key1
  10. value: value1
  11. - name: key2
  12. value: value2

任何metadata属性将在组件实例化时通过其Store.Init(metadata state.Metadata)方法传递给组件。

启动 Dapr

要启动 Dapr(以及可选地使用该服务的服务):

  1. dapr run --app-id <app id> --resources-path <resources path> ...

此时,Dapr sidecar 将已经启动并通过 Unix Domain Socket 连接到组件。 然后你可以通过组件进行交互:

  • 通过使用组件的服务(如果已启动),或者
  • 通过直接使用 Dapr 的 HTTP 或 gRPC API

创建容器

可插拔组件被部署为容器,作为应用程序的 sidecar 运行(如 Dapr 本身)。 创建用于Go应用程序的Dockerfile的典型docker镜像可能如下所示:

  1. FROM golang:1.20-alpine AS builder
  2. WORKDIR /usr/src/app
  3. # Download dependencies
  4. COPY go.mod go.sum ./
  5. RUN go mod download && go mod verify
  6. # Build the application
  7. COPY . .
  8. RUN go build -v -o /usr/src/bin/app .
  9. FROM alpine:latest
  10. # Setup non-root user and permissions
  11. RUN addgroup -S app && adduser -S app -G app
  12. RUN mkdir /tmp/dapr-components-sockets && chown app /tmp/dapr-components-sockets
  13. # Copy application to runtime image
  14. COPY --from=builder --chown=app /usr/src/bin/app /app
  15. USER app
  16. CMD ["/app"]

构建镜像:

  1. docker build -f Dockerfile -t <image name>:<tag> .

注意

在构建镜像时,Dockerfile 中的 COPY 操作的路径是相对于传递的 Docker 上下文的,而 Docker 上下文本身会根据正在构建的应用程序的需求而变化。 在上面的示例中,假设 Docker 上下文是组件应用程序目录。

下一步