本文开始,我们会出一个系列文章跟大家详细展示一个 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 环境要求

GolangEtcdRedisMysqlPrometheusGrafanaJaegerDTM
Docker
DockerWindowsmacOSDocker 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
Dockerfile
go-zerogrpcgrpcprotocgorpc stubprotoc-gen-go
go-zerogoctl
protocprotoc-gen-gogoctlgolang
golangDockerfile
FROM golang:1.17LABEL maintainer="Ving "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
.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
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    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
WindowsShare itWindows

2.5 容器说明

golangapirpcdtmhttpgrpcDockerEtcdhttp apiDockerMysql127.0.0.1:3306Redis127.0.0.1:6379phpMyAdminweb127.0.0.1:1000phpRedisAdminweb127.0.0.1:2000Prometheusweb127.0.0.1:3000Grafanaweb127.0.0.1:4000Jaegerweb127.0.0.1:5000

2.6 访问验证

MysqlRedisPrometheusGrafanaJaeger

项目地址

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

go-zero

微信交流群

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

标签: