乐趣区

关于golang:学习笔记带你十天轻松搞定-Go-微服务系列一

1、学习课程

带你十天轻松搞定 Go 微服务系列(一)

2、集体环境

Ubuntu 20.04.4
docker-compose version 1.21.2, build a133471

3、步骤

3.1 装置 Docker Compose

apt install docker-compose

3.2 创立目录 mkdir 与 touch 命令

创立如下目录:

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

mkdir 新建文件夹,touch 新建文件

cd 目录(你放我的项目的目录)mkdir gonivinck
cd gonivinck
mkdir dtm
cd dtm
touch config.yml
touch Dockerfile

其余目录同上,返回下级目录 cd ../

3.3 编写 Dockerfile

以 golang 容器的 Dockerfile 代码为例:

cd golang(进 golang 文件夹)touch Dockerfile(新建 Dockerfile 文件)vi Dockerfile(编辑 Dockerfile 文件)

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/zeromicro/go-zero/tools/goctl@latest
# 装置 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
例子:/gonivinck/dtm/Dockerfile

FROM yedf/dtm

LABEL maintainer="Ving <ving@nivin.cn>"

其余和 dtm/Dockerfile 差不多,依此类推,批改 FROM 前面的镜像就能够了

3.4 编写 .env 配置文件

这里配置了 redis-manage 等等的账号密码,当前会用到

# 设置时区
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

3.5 编写 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

3.6 构建运行

docker-compose up -d

运行时会报 Timeout


这种状况翻就解决了,如果翻了也 timeout,关了再跑 docker-compose up -d,也会解决(我印象中运行 golang 不能翻,mysql 也不能翻,其余如同都得翻)

好几次 docker-compose up -d 后,运行胜利,我在我的 Ubuntu 虚拟机启动了


docker ps

3.7 顺次去拜访 1000 2000 3000 4000 5000

3.7.1 Mysql 拜访验证

3.7.2 Redis 拜访验证

这里就用到 .env 配置的账号密码登录

3.7.3 Prometheus 拜访验证

3.7.4 Grafana 拜访验证

3.7.5 Jaeger 拜访验证

退出移动版