本文开始,我们会出一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下:
- 环境搭建(本文)
- 服务拆分
- 用户服务
- 产品服务
- 订单服务
- 支付服务
- RPC 服务 Auth 验证
- 服务监控
- 链路追踪
- 分布式事务
期望通过本系列带你在本机利用 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
服务 | 基于的镜像 |
---|---|
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 |
.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
微信交流群
关注『微服务实践』公众号并点击 交流群 获取社区群二维码。
标签: