2.1 环境要求

  • Golang 1.17
  • DTM
  • Etcd
  • Redis
  • Mysql
  • Prometheus
  • Grafana
  • Jaeger

    2.2 Docker 本地开发环境搭建

    为了方便开发调试,我们使用 Docker 构建本地开发环境。Windows 和 macOS 系统可下载 Docker Desktop 安装使用,具体下载安装方法可自行搜索相关教程。
    这里我们使用 Docker Compose 来编排管理我们的容器,创建如下目录: ```bash gonivinck ├── dtm # DTM 分布式事务管理器 │ ├── config.yml # DTM 配置文件 │ └── Dockerfile ├── etcd # Etcd 服务注册发现 │ └── Dockerfile ├── golang # Golang 运行环境 │ └── Dockerfile ├── grafana # Grafana 可视化数据监控 │ └── Dockerfile ├── jaeger # Jaeger 链路追踪 │ └── Dockerfile ├── mysql # Mysql 服务 │ └── Dockerfile ├── mysql-manage # Mysql 可视化管理 │ └── Dockerfile ├── prometheus # Prometheus 服务监控 │ ├── Dockerfile │ └── prometheus.yml # Prometheus 配置文件 ├── redis # Redis 服务 │ └── Dockerfile ├── redis-manage # Redis 可视化管理 │ └── Dockerfile ├── .env # env 配置 └── docker-compose.yml
  1. <a name="VJZWN"></a>
  2. ### 2.2.1 编写 Dockerfile
  3. 在 go-zero 的微服务中采用 grpc 进行服务间的通信,而 grpc 的编写就需要用到 protoc 和翻译成 go 语言 rpc stub 代码的插件 protoc-gen-go。<br />为了提高开发效率,减少代码的出错率,缩短业务开发的工作量,go-zero 还提供了 goctl 代码生成工具。<br />因此,我们需要将 protoc, protoc-gen-go, goctl, 给提前安装到 golang 的容器中,以便后续使用。<br />所以 golang 容器的 Dockerfile 代码如下:
  4. ```dockerfile
  5. FROM golang:1.17
  6. LABEL maintainer="Ving <ving@nivin.cn>"
  7. ENV GOPROXY https://goproxy.cn,direct
  8. # 安装必要的软件包和依赖包
  9. USER root
  10. RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list && \
  11. sed -i 's/security.debian.org/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list && \
  12. sed -i 's/security-cdn.debian.org/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list && \
  13. apt-get update && \
  14. apt-get upgrade -y && \
  15. apt-get install -y --no-install-recommends \
  16. curl \
  17. zip \
  18. unzip \
  19. git \
  20. vim
  21. # 安装 goctl
  22. USER root
  23. RUN GOPROXY=https://goproxy.cn/,direct go install github.com/tal-tech/go-zero/tools/goctl@cli
  24. # 安装 protoc
  25. USER root
  26. RUN curl -L -o /tmp/protoc.zip https://github.com/protocolbuffers/protobuf/releases/download/v3.19.1/protoc-3.19.1-linux-x86_64.zip && \
  27. unzip -d /tmp/protoc /tmp/protoc.zip && \
  28. mv /tmp/protoc/bin/protoc $GOPATH/bin
  29. # 安装 protoc-gen-go
  30. USER root
  31. RUN go get -u github.com/golang/protobuf/protoc-gen-go@v1.4.0
  32. # $GOPATH/bin添加到环境变量中
  33. ENV PATH $GOPATH/bin:$PATH
  34. # 清理垃圾
  35. USER root
  36. RUN apt-get clean && \
  37. rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
  38. rm /var/log/lastlog /var/log/faillog
  39. # 设置工作目录
  40. WORKDIR /usr/src/code
  41. EXPOSE 8000
  42. EXPOSE 8001
  43. EXPOSE 8002
  44. EXPOSE 8003
  45. EXPOSE 9000
  46. EXPOSE 9001
  47. EXPOSE 9002
  48. EXPOSE 9003

其他服务容器 Dockerfile 无需特殊处理,只要基于现有的镜像即可。

服务 基于的镜像
DTM yedf/dtm
Etcd bitnami/etcd
Mysql mysql:5.7
Redis redis:5.0
Mysql Manage phpmyadmin/phpmyadmin
Redis Manage erikdubbelboer/phpredisadmin
Prometheus bitnami/prometheus
Grafana grafana/grafana
Jaeger jaegertracing/all-in-one:1.28

2.2.2 编写 .env 配置文件

  1. # 设置时区
  2. TZ=Asia/Shanghai
  3. # 设置网络模式
  4. NETWORKS_DRIVER=bridge
  5. # PATHS ##########################################
  6. # 宿主机上代码存放的目录路径
  7. CODE_PATH_HOST=./code
  8. # 宿主机上Mysql Reids数据存放的目录路径
  9. DATA_PATH_HOST=./data
  10. # MYSQL ##########################################
  11. # Mysql 服务映射宿主机端口号,可在宿主机127.0.0.1:3306访问
  12. MYSQL_PORT=3306
  13. MYSQL_USERNAME=admin
  14. MYSQL_PASSWORD=123456
  15. MYSQL_ROOT_PASSWORD=123456
  16. # Mysql 可视化管理用户名称,同 MYSQL_USERNAME
  17. MYSQL_MANAGE_USERNAME=admin
  18. # Mysql 可视化管理用户密码,同 MYSQL_PASSWORD
  19. MYSQL_MANAGE_PASSWORD=123456
  20. # Mysql 可视化管理ROOT用户密码,同 MYSQL_ROOT_PASSWORD
  21. MYSQL_MANAGE_ROOT_PASSWORD=123456
  22. # Mysql 服务地址
  23. MYSQL_MANAGE_CONNECT_HOST=mysql
  24. # Mysql 服务端口号
  25. MYSQL_MANAGE_CONNECT_PORT=3306
  26. # Mysql 可视化管理映射宿主机端口号,可在宿主机127.0.0.1:1000访问
  27. MYSQL_MANAGE_PORT=1000
  28. # REDIS ##########################################
  29. # Redis 服务映射宿主机端口号,可在宿主机127.0.0.1:6379访问
  30. REDIS_PORT=6379
  31. # Redis 可视化管理用户名称
  32. REDIS_MANAGE_USERNAME=admin
  33. # Redis 可视化管理用户密码
  34. REDIS_MANAGE_PASSWORD=123456
  35. # Redis 服务地址
  36. REDIS_MANAGE_CONNECT_HOST=redis
  37. # Redis 服务端口号
  38. REDIS_MANAGE_CONNECT_PORT=6379
  39. # Redis 可视化管理映射宿主机端口号,可在宿主机127.0.0.1:2000访问
  40. REDIS_MANAGE_PORT=2000
  41. # ETCD ###########################################
  42. # Etcd 服务映射宿主机端口号,可在宿主机127.0.0.1:2379访问
  43. ETCD_PORT=2379
  44. # PROMETHEUS #####################################
  45. # Prometheus 服务映射宿主机端口号,可在宿主机127.0.0.1:3000访问
  46. PROMETHEUS_PORT=3000
  47. # GRAFANA ########################################
  48. # Grafana 服务映射宿主机端口号,可在宿主机127.0.0.1:4000访问
  49. GRAFANA_PORT=4000
  50. # JAEGER #########################################
  51. # Jaeger 服务映射宿主机端口号,可在宿主机127.0.0.1:5000访问
  52. JAEGER_PORT=5000
  53. # DTM #########################################
  54. # DTM HTTP 协议端口号
  55. DTM_HTTP_PORT=36789
  56. # DTM gRPC 协议端口号
  57. DTM_GRPC_PORT=36790

2.2.3 编写 docker-compose.yml 配置文件

  1. version: '3.5'
  2. # 网络配置
  3. networks:
  4. backend:
  5. driver: ${NETWORKS_DRIVER}
  6. # 服务容器配置
  7. services:
  8. golang: # 自定义容器名称
  9. build:
  10. context: ./golang # 指定构建使用的 Dockerfile 文件
  11. environment: # 设置环境变量
  12. - TZ=${TZ}
  13. volumes: # 设置挂载目录
  14. - ${CODE_PATH_HOST}:/usr/src/code # 引用 .env 配置中 CODE_PATH_HOST 变量,将宿主机上代码存放的目录挂载到容器中 /usr/src/code 目录
  15. ports: # 设置端口映射
  16. - "8000:8000"
  17. - "8001:8001"
  18. - "8002:8002"
  19. - "8003:8003"
  20. - "9000:9000"
  21. - "9001:9001"
  22. - "9002:9002"
  23. - "9003:9003"
  24. stdin_open: true # 打开标准输入,可以接受外部输入
  25. tty: true
  26. networks:
  27. - backend
  28. restart: always # 指定容器退出后的重启策略为始终重启
  29. etcd: # 自定义容器名称
  30. build:
  31. context: ./etcd # 指定构建使用的 Dockerfile 文件
  32. environment:
  33. - TZ=${TZ}
  34. - ALLOW_NONE_AUTHENTICATION=yes
  35. ports: # 设置端口映射
  36. - "${ETCD_PORT}:2379"
  37. networks:
  38. - backend
  39. restart: always
  40. mysql:
  41. build:
  42. context: ./mysql
  43. environment:
  44. - TZ=${TZ}
  45. - MYSQL_USER=${MYSQL_USERNAME} # 设置 Mysql 用户名称
  46. - MYSQL_PASSWORD=${MYSQL_PASSWORD} # 设置 Mysql 用户密码
  47. - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} # 设置 Mysql root 用户密码
  48. volumes:
  49. - ${DATA_PATH_HOST}/mysql:/var/lib/mysql # 引用 .env 配置中 DATA_PATH_HOST 变量,将宿主机上存放 Mysql 数据的目录挂载到容器中 /var/lib/mysql 目录
  50. ports:
  51. - "${MYSQL_PORT}:3306" # 设置容器3306端口映射指定宿主机端口
  52. networks:
  53. - backend
  54. restart: always
  55. redis:
  56. build:
  57. context: ./redis
  58. environment:
  59. - TZ=${TZ}
  60. volumes:
  61. - ${DATA_PATH_HOST}/redis:/data # 引用 .env 配置中 DATA_PATH_HOST 变量,将宿主机上存放 Redis 数据的目录挂载到容器中 /data 目录
  62. ports:
  63. - "${REDIS_PORT}:6379" # 设置容器6379端口映射指定宿主机端口
  64. networks:
  65. - backend
  66. restart: always
  67. mysql-manage:
  68. build:
  69. context: ./mysql-manage
  70. environment:
  71. - TZ=${TZ}
  72. - PMA_ARBITRARY=1
  73. - MYSQL_USER=${MYSQL_MANAGE_USERNAME} # 设置连接的 Mysql 服务用户名称
  74. - MYSQL_PASSWORD=${MYSQL_MANAGE_PASSWORD} # 设置连接的 Mysql 服务用户密码
  75. - MYSQL_ROOT_PASSWORD=${MYSQL_MANAGE_ROOT_PASSWORD} # 设置连接的 Mysql 服务 root 用户密码
  76. - PMA_HOST=${MYSQL_MANAGE_CONNECT_HOST} # 设置连接的 Mysql 服务 host,可以是 Mysql 服务容器的名称,也可以是 Mysql 服务容器的 ip 地址
  77. - PMA_PORT=${MYSQL_MANAGE_CONNECT_PORT} # 设置连接的 Mysql 服务端口号
  78. ports:
  79. - "${MYSQL_MANAGE_PORT}:80" # 设置容器80端口映射指定宿主机端口,用于宿主机访问可视化web
  80. depends_on: # 依赖容器
  81. - mysql # 在 Mysql 服务容器启动后启动
  82. networks:
  83. - backend
  84. restart: always
  85. redis-manage:
  86. build:
  87. context: ./redis-manage
  88. environment:
  89. - TZ=${TZ}
  90. - ADMIN_USER=${REDIS_MANAGE_USERNAME} # 设置 Redis 可视化管理的用户名称
  91. - ADMIN_PASS=${REDIS_MANAGE_PASSWORD} # 设置 Redis 可视化管理的用户密码
  92. - REDIS_1_HOST=${REDIS_MANAGE_CONNECT_HOST} # 设置连接的 Redis 服务 host,可以是 Redis 服务容器的名称,也可以是 Redis 服务容器的 ip 地址
  93. - REDIS_1_PORT=${REDIS_MANAGE_CONNECT_PORT} # 设置连接的 Redis 服务端口号
  94. ports:
  95. - "${REDIS_MANAGE_PORT}:80" # 设置容器80端口映射指定宿主机端口,用于宿主机访问可视化web
  96. depends_on: # 依赖容器
  97. - redis # 在 Redis 服务容器启动后启动
  98. networks:
  99. - backend
  100. restart: always
  101. prometheus:
  102. build:
  103. context: ./prometheus
  104. environment:
  105. - TZ=${TZ}
  106. volumes:
  107. - ./prometheus/prometheus.yml:/opt/bitnami/prometheus/conf/prometheus.yml # 将 prometheus 配置文件挂载到容器里
  108. ports:
  109. - "${PROMETHEUS_PORT}:9090" # 设置容器9090端口映射指定宿主机端口,用于宿主机访问可视化web
  110. networks:
  111. - backend
  112. restart: always
  113. grafana:
  114. build:
  115. context: ./grafana
  116. environment:
  117. - TZ=${TZ}
  118. ports:
  119. - "${GRAFANA_PORT}:3000" # 设置容器3000端口映射指定宿主机端口,用于宿主机访问可视化web
  120. networks:
  121. - backend
  122. restart: always
  123. jaeger:
  124. build:
  125. context: ./jaeger
  126. environment:
  127. - TZ=${TZ}
  128. ports:
  129. - "${JAEGER_PORT}:16686" # 设置容器16686端口映射指定宿主机端口,用于宿主机访问可视化web
  130. networks:
  131. - backend
  132. restart: always
  133. dtm:
  134. build:
  135. context: ./dtm
  136. environment:
  137. - TZ=${TZ}
  138. entrypoint:
  139. - "/app/dtm/dtm"
  140. - "-c=/app/dtm/configs/config.yaml"
  141. volumes:
  142. - ./dtm/config.yml:/app/dtm/configs/config.yaml # 将 dtm 配置文件挂载到容器里
  143. ports:
  144. - "${DTM_HTTP_PORT}:36789"
  145. - "${DTM_GRPC_PORT}:36790"
  146. networks:
  147. - backend
  148. restart: always

2.2.4 构建与运行

  • 使用 docker-compose 命令来构建和启动运行我们的服务容器,在根目录执行如下命令:

    1. $ docker-compose up -d
  • 容器构建中

2 环境搭建 - 图1

  • 在 Windows 系统容器构建中出现如下图所示,请选择 Share it 这将允许 Windows 的文件目录挂载到容器目录中。

2 环境搭建 - 图2

  • 容器已启动运行

2 环境搭建 - 图3
2 环境搭建 - 图4

2.2.5 容器说明

容器名称 暴露端口 host地址 说明
golang 8000:8000
8001:8001
8002:8002
8003:8003
9000:9000
9001:9001
9002:9002
9003:9003
golang 在生产环境中微服务一般都是集群部署,可能一个微服务一台服务器,也可能一个微服务一个容器。为了方便开发调试,我们将在 golang 容器中启动所有微服务,并为它们分配监听不同的端口号以示区分。
80:开头的端口号我们将用于 api 服务
90:开头的端口号我们将用于 rpc 服务
dtm 36789:36789
36790:36790
dtm dtm 的 http 协议和 grpc 协议服务端口号,供客户端交互使用。
此项目中我们只在 Docker 内部容器之间访问使用,所以也可以不暴露端口号给宿主机
etcd 2379:2379 etcd Etcd http api 服务端口号,供客户端交互使用。
此项目中我们只在 Docker 内部容器之间访问使用,所以也可以不暴露端口号给宿主机
mysql 3306:3306 mysql Mysql 服务默认端口号,宿主机可通过 127.0.0.1:3306 进行数据库的连接
redis 6379:6379 redis Redis 服务默认端口号,宿主机可通过 127.0.0.1:6379 进行数据库的连接
mysql-manage 1000:80 mysql-manage phpMyAdmin web 服务端口号,可以在宿主机 127.0.0.1:1000 访问
redis-manage 2000:80 redis-manage phpRedisAdmin web 服务端口号,可以在宿主机 127.0.0.1:2000 访问
prometheus 3000:9090 prometheus Prometheus web 服务端口号,可以在宿主机 127.0.0.1:3000 访问
grafana 4000:3000 grafana Grafana web 服务端口号,可以在宿主机 127.0.0.1:4000 访问
jaeger 5000:16686 jaeger Jaeger web 服务端口号,可以在宿主机 127.0.0.1:5000 访问

2.2.6 访问验证

  • Mysql 访问验证

2 环境搭建 - 图5

  • Redis 访问验证

2 环境搭建 - 图6

  • Prometheus 访问验证

2 环境搭建 - 图7

  • Grafana 访问验证

2 环境搭建 - 图8

  • Jaeger 访问验证

2 环境搭建 - 图9
项目地址:github