本文开始,咱们会出一个系列文章跟大家具体展现一个 go-zero 微服务示例,整个系列分十篇文章,目录构造如下:

  1. 环境搭建(本文)
  2. 服务拆分
  3. 用户服务
  4. 产品服务
  5. 订单服务
  6. 领取服务
  7. RPC 服务 Auth 验证
  8. 服务监控
  9. 链路追踪
  10. 分布式事务

冀望通过本系列带你在本机利用 Docker 环境利用 go-zero 疾速开发一个商城零碎,让你疾速上手微服务。

残缺示例代码:https://github.com/nivin-studio/go-zero-mall

1 环境要求

  • Golang 1.15+
  • Etcd
  • Redis
  • Mysql
  • Prometheus
  • Grafana
  • Jaeger
  • DTM

2 Docker 本地开发环境搭建

为了不便开发调试,咱们应用 Docker 构建本地开发环境。WindowsmacOS 零碎可下载 Docker Desktop 装置应用,具体下载安装办法可自行搜寻相干教程。

这里咱们应用 Docker Compose 来编排治理咱们的容器,创立如下目录:

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

2.1 编写 Dockerfile

go-zero 的微服务中采纳 grpc 进行服务间的通信,而 grpc 的编写就须要用到 protoc 和翻译成 go 语言 rpc stub 代码的插件 protoc-gen-go

为了进步开发效率,缩小代码的出错率,缩短业务开发的工作量,go-zero 还提供了 goctl 代码生成工具。

因而,咱们须要将 protoc, protoc-gen-go, goctl, 给提前装置到 golang 的容器中,以便后续应用。

所以 golang 容器的 Dockerfile 代码如下:

FROM golang:1.17LABEL maintainer="Ving <ving@nivin.cn>"ENV GOPROXY https://goproxy.cn,direct# 装置必要的软件包和依赖包USER rootRUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list && \    sed -i 's/security.debian.org/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list && \    sed -i 's/security-cdn.debian.org/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list && \    apt-get update && \    apt-get upgrade -y && \    apt-get install -y --no-install-recommends \    curl \    zip \    unzip \    git \    vim # 装置 goctlUSER rootRUN GOPROXY=https://goproxy.cn/,direct go install github.com/tal-tech/go-zero/tools/goctl@cli# 装置 protocUSER rootRUN curl -L -o /tmp/protoc.zip https://github.com/protocolbuffers/protobuf/releases/download/v3.19.1/protoc-3.19.1-linux-x86_64.zip && \    unzip -d /tmp/protoc /tmp/protoc.zip && \    mv /tmp/protoc/bin/protoc $GOPATH/bin# 装置 protoc-gen-goUSER rootRUN go get -u github.com/golang/protobuf/protoc-gen-go@v1.4.0# $GOPATH/bin增加到环境变量中ENV PATH $GOPATH/bin:$PATH# 清理垃圾USER rootRUN apt-get clean && \    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \    rm /var/log/lastlog /var/log/faillog# 设置工作目录WORKDIR /usr/src/codeEXPOSE 8000EXPOSE 8001EXPOSE 8002EXPOSE 8003EXPOSE 9000EXPOSE 9001EXPOSE 9002EXPOSE 9003

其余服务容器 Dockerfile 无需非凡解决,只有基于现有的镜像即可。

服务基于的镜像
DTMyedf/dtm
Etcdbitnami/etcd
Mysqlmysql:5.7
Redisredis:5.0
Mysql Managephpmyadmin/phpmyadmin
Redis Manageerikdubbelboer/phpredisadmin
Prometheusbitnami/prometheus
Grafanagrafana/grafana
Jaegerjaegertracing/all-in-one:1.28

2.2 编写 .env 配置文件

# 设置时区TZ=Asia/Shanghai# 设置网络模式NETWORKS_DRIVER=bridge# PATHS ########################################### 宿主机上代码寄存的目录门路CODE_PATH_HOST=./code# 宿主机上Mysql Reids数据寄存的目录门路DATA_PATH_HOST=./data# MYSQL ########################################### Mysql 服务映射宿主机端口号,可在宿主机127.0.0.1:3306拜访MYSQL_PORT=3306MYSQL_USERNAME=adminMYSQL_PASSWORD=123456MYSQL_ROOT_PASSWORD=123456# Mysql 可视化治理用户名称,同 MYSQL_USERNAMEMYSQL_MANAGE_USERNAME=admin# Mysql 可视化治理用户明码,同 MYSQL_PASSWORDMYSQL_MANAGE_PASSWORD=123456# Mysql 可视化治理ROOT用户明码,同 MYSQL_ROOT_PASSWORDMYSQL_MANAGE_ROOT_PASSWORD=123456# Mysql 服务地址MYSQL_MANAGE_CONNECT_HOST=mysql# Mysql 服务端口号MYSQL_MANAGE_CONNECT_PORT=3306# Mysql 可视化治理映射宿主机端口号,可在宿主机127.0.0.1:1000拜访MYSQL_MANAGE_PORT=1000# REDIS ########################################### Redis 服务映射宿主机端口号,可在宿主机127.0.0.1:6379拜访REDIS_PORT=6379# Redis 可视化治理用户名称REDIS_MANAGE_USERNAME=admin# Redis 可视化治理用户明码REDIS_MANAGE_PASSWORD=123456# Redis 服务地址REDIS_MANAGE_CONNECT_HOST=redis# Redis 服务端口号REDIS_MANAGE_CONNECT_PORT=6379# Redis 可视化治理映射宿主机端口号,可在宿主机127.0.0.1:2000拜访REDIS_MANAGE_PORT=2000# ETCD ############################################ Etcd 服务映射宿主机端口号,可在宿主机127.0.0.1:2379拜访ETCD_PORT=2379# PROMETHEUS ###################################### Prometheus 服务映射宿主机端口号,可在宿主机127.0.0.1:3000拜访PROMETHEUS_PORT=3000# GRAFANA ######################################### Grafana 服务映射宿主机端口号,可在宿主机127.0.0.1:4000拜访GRAFANA_PORT=4000# JAEGER ########################################## Jaeger 服务映射宿主机端口号,可在宿主机127.0.0.1:5000拜访JAEGER_PORT=5000# DTM ########################################## DTM HTTP 协定端口号DTM_HTTP_PORT=36789# DTM gRPC 协定端口号DTM_GRPC_PORT=36790

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

version: '3.5'# 网络配置networks:  backend:    driver: ${NETWORKS_DRIVER}# 服务容器配置services:  golang:                                # 自定义容器名称    build:      context: ./golang                  # 指定构建应用的 Dockerfile 文件    environment:                         # 设置环境变量      - TZ=${TZ}    volumes:                             # 设置挂载目录      - ${CODE_PATH_HOST}:/usr/src/code  # 援用 .env 配置中 CODE_PATH_HOST 变量,将宿主机上代码寄存的目录挂载到容器中 /usr/src/code 目录    ports:                               # 设置端口映射      - "8000:8000"      - "8001:8001"      - "8002:8002"      - "8003:8003"      - "9000:9000"      - "9001:9001"      - "9002:9002"      - "9003:9003"    stdin_open: true                     # 关上规范输出,能够承受内部输出    tty: true    networks:      - backend    restart: always                      # 指定容器退出后的重启策略为始终重启  etcd:                                  # 自定义容器名称    build:      context: ./etcd                    # 指定构建应用的 Dockerfile 文件    environment:      - TZ=${TZ}      - ALLOW_NONE_AUTHENTICATION=yes      - ETCD_ADVERTISE_CLIENT_URLS=http://etcd:2379    ports:                               # 设置端口映射      - "${ETCD_PORT}:2379"    networks:      - backend    restart: always  mysql:    build:      context: ./mysql    environment:      - TZ=${TZ}      - MYSQL_USER=${MYSQL_USERNAME}                  # 设置 Mysql 用户名称      - MYSQL_PASSWORD=${MYSQL_PASSWORD}              # 设置 Mysql 用户明码      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}    # 设置 Mysql root 用户明码    volumes:      - ${DATA_PATH_HOST}/mysql:/var/lib/mysql        # 援用 .env 配置中 DATA_PATH_HOST 变量,将宿主机上寄存 Mysql 数据的目录挂载到容器中 /var/lib/mysql 目录    ports:      - "${MYSQL_PORT}:3306"                          # 设置容器3306端口映射指定宿主机端口    networks:      - backend    restart: always  redis:    build:      context: ./redis    environment:      - TZ=${TZ}    volumes:      - ${DATA_PATH_HOST}/redis:/data                 # 援用 .env 配置中 DATA_PATH_HOST 变量,将宿主机上寄存 Redis 数据的目录挂载到容器中 /data 目录    ports:      - "${REDIS_PORT}:6379"                          # 设置容器6379端口映射指定宿主机端口    networks:      - backend    restart: always  mysql-manage:    build:      context: ./mysql-manage    environment:      - TZ=${TZ}      - PMA_ARBITRARY=1      - MYSQL_USER=${MYSQL_MANAGE_USERNAME}               # 设置连贯的 Mysql 服务用户名称      - MYSQL_PASSWORD=${MYSQL_MANAGE_PASSWORD}           # 设置连贯的 Mysql 服务用户明码      - MYSQL_ROOT_PASSWORD=${MYSQL_MANAGE_ROOT_PASSWORD} # 设置连贯的 Mysql 服务 root 用户明码      - PMA_HOST=${MYSQL_MANAGE_CONNECT_HOST}             # 设置连贯的 Mysql 服务 host,能够是 Mysql 服务容器的名称,也能够是 Mysql 服务容器的 ip 地址      - PMA_PORT=${MYSQL_MANAGE_CONNECT_PORT}             # 设置连贯的 Mysql 服务端口号    ports:      - "${MYSQL_MANAGE_PORT}:80"                         # 设置容器80端口映射指定宿主机端口,用于宿主机拜访可视化web    depends_on:                                           # 依赖容器      - mysql                                             # 在 Mysql 服务容器启动后启动    networks:      - backend    restart: always  redis-manage:    build:      context: ./redis-manage    environment:      - TZ=${TZ}      - ADMIN_USER=${REDIS_MANAGE_USERNAME}           # 设置 Redis 可视化治理的用户名称      - ADMIN_PASS=${REDIS_MANAGE_PASSWORD}           # 设置 Redis 可视化治理的用户明码      - REDIS_1_HOST=${REDIS_MANAGE_CONNECT_HOST}     # 设置连贯的 Redis 服务 host,能够是 Redis 服务容器的名称,也能够是 Redis 服务容器的 ip 地址      - REDIS_1_PORT=${REDIS_MANAGE_CONNECT_PORT}     # 设置连贯的 Redis 服务端口号    ports:      - "${REDIS_MANAGE_PORT}:80"                     # 设置容器80端口映射指定宿主机端口,用于宿主机拜访可视化web    depends_on:                                       # 依赖容器      - redis                                         # 在 Redis 服务容器启动后启动    networks:      - backend    restart: always  prometheus:    build:      context: ./prometheus    environment:      - TZ=${TZ}    volumes:      - ./prometheus/prometheus.yml:/opt/bitnami/prometheus/conf/prometheus.yml  # 将 prometheus 配置文件挂载到容器里    ports:      - "${PROMETHEUS_PORT}:9090"                     # 设置容器9090端口映射指定宿主机端口,用于宿主机拜访可视化web    networks:      - backend    restart: always  grafana:    build:      context: ./grafana    environment:      - TZ=${TZ}    ports:      - "${GRAFANA_PORT}:3000"                        # 设置容器3000端口映射指定宿主机端口,用于宿主机拜访可视化web    networks:      - backend    restart: always  jaeger:    build:      context: ./jaeger    environment:      - TZ=${TZ}    ports:      - "${JAEGER_PORT}:16686"                        # 设置容器16686端口映射指定宿主机端口,用于宿主机拜访可视化web    networks:      - backend    restart: always  dtm:    build:      context: ./dtm    environment:      - TZ=${TZ}    entrypoint:      - "/app/dtm/dtm"      - "-c=/app/dtm/configs/config.yaml"    volumes:      - ./dtm/config.yml:/app/dtm/configs/config.yaml # 将 dtm 配置文件挂载到容器里    ports:      - "${DTM_HTTP_PORT}:36789"      - "${DTM_GRPC_PORT}:36790"    networks:      - backend    restart: always

2.4 构建与运行

  • 应用 docker-compose 命令来构建和启动运行咱们的服务容器,在根目录执行如下命令:
$ docker-compose up -d
  • 容器构建中
  • Windows 零碎容器构建中呈现如下图所示,请抉择 Share it 这将容许 Windows 的文件目录挂载到容器目录中。
  • 容器已启动运行

2.5 容器阐明

容器名称裸露端口host地址阐明
golang8000:8000
8001:8001
8002:8002
8003:8003
9000:9000
9001:9001
9002:9002
9003:9003
golang在生产环境中微服务个别都是集群部署,可能一个微服务一台服务器,也可能一个微服务一个容器。为了不便开发调试,咱们将在 golang 容器中启动所有微服务,并为它们调配监听不同的端口号以示辨别。
80:结尾的端口号咱们将用于 api 服务
90:结尾的端口号咱们将用于 rpc 服务
dtm36789:36789
36790:36790
dtmdtmhttp 协定和 grpc 协定服务端口号,供客户端交互应用。
此我的项目中咱们只在 Docker 外部容器之间拜访应用,所以也能够不裸露端口号给宿主机
etcd2379:2379etcdEtcd http api 服务端口号,供客户端交互应用。
此我的项目中咱们只在 Docker 外部容器之间拜访应用,所以也能够不裸露端口号给宿主机
mysql3306:3306mysqlMysql 服务默认端口号,宿主机可通过 127.0.0.1:3306 进行数据库的连贯
redis6379:6379redisRedis 服务默认端口号,宿主机可通过 127.0.0.1:6379 进行数据库的连贯
mysql-manage1000:80mysql-managephpMyAdmin web 服务端口号,能够在宿主机 127.0.0.1:1000 拜访
redis-manage2000:80redis-managephpRedisAdmin web 服务端口号,能够在宿主机 127.0.0.1:2000 拜访
prometheus3000:9090prometheusPrometheus web 服务端口号,能够在宿主机 127.0.0.1:3000 拜访
grafana4000:3000grafanaGrafana web 服务端口号,能够在宿主机 127.0.0.1:4000 拜访
jaeger5000:16686jaegerJaeger web 服务端口号,能够在宿主机 127.0.0.1:5000 拜访

2.6 拜访验证

  • Mysql 拜访验证
  • Redis 拜访验证
  • Prometheus 拜访验证
  • Grafana 拜访验证
  • Jaeger 拜访验证

我的项目地址

https://github.com/zeromicro/go-zero

欢送应用 go-zerostar 反对咱们!

微信交换群

关注『微服务实际』公众号并点击 交换群 获取社区群二维码。