本文开始,咱们会出一个系列文章跟大家具体展现一个 go-zero 微服务示例,整个系列分十篇文章,目录构造如下:
- 环境搭建(本文)
- 服务拆分
- 用户服务
- 产品服务
- 订单服务
- 领取服务
- RPC 服务 Auth 验证
- 服务监控
- 链路追踪
- 分布式事务
冀望通过本系列带你在本机利用 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
构建本地开发环境。Windows
和 macOS
零碎可下载 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.17
LABEL maintainer="Ving <ving@nivin.cn>"
ENV GOPROXY https://goproxy.cn,direct
# 装置必要的软件包和依赖包
USER root
RUN 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
# 装置 goctl
USER root
RUN GOPROXY=https://goproxy.cn/,direct go install github.com/tal-tech/go-zero/tools/goctl@cli
# 装置 protoc
USER root
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 && \
unzip -d /tmp/protoc /tmp/protoc.zip && \
mv /tmp/protoc/bin/protoc $GOPATH/bin
# 装置 protoc-gen-go
USER root
RUN go get -u github.com/golang/protobuf/protoc-gen-go@v1.4.0
# $GOPATH/bin 增加到环境变量中
ENV PATH $GOPATH/bin:$PATH
# 清理垃圾
USER root
RUN apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && \
rm /var/log/lastlog /var/log/faillog
# 设置工作目录
WORKDIR /usr/src/code
EXPOSE 8000
EXPOSE 8001
EXPOSE 8002
EXPOSE 8003
EXPOSE 9000
EXPOSE 9001
EXPOSE 9002
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 编写 .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=3306
MYSQL_USERNAME=admin
MYSQL_PASSWORD=123456
MYSQL_ROOT_PASSWORD=123456
# Mysql 可视化治理用户名称,同 MYSQL_USERNAME
MYSQL_MANAGE_USERNAME=admin
# Mysql 可视化治理用户明码,同 MYSQL_PASSWORD
MYSQL_MANAGE_PASSWORD=123456
# Mysql 可视化治理 ROOT 用户明码,同 MYSQL_ROOT_PASSWORD
MYSQL_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 地址 | 阐明 |
---|---|---|---|
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.6 拜访验证
Mysql
拜访验证Redis
拜访验证Prometheus
拜访验证Grafana
拜访验证Jaeger
拜访验证
我的项目地址
https://github.com/zeromicro/go-zero
欢送应用 go-zero
并 star 反对咱们!
微信交换群
关注『微服务实际 』公众号并点击 交换群 获取社区群二维码。