0、索引
go-zero docker-compose 搭建课件服务(一):编写服务api和proto
go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务
go-zero docker-compose 搭建课件服务(三):编写courseware api服务
go-zero docker-compose 搭建课件服务(四):生成Dockerfile并在docker-compose中启动
go-zero docker-compose 搭建课件服务(五):欠缺user服务
go-zero docker-compose 搭建课件服务(六):欠缺jwt鉴权和返回构造
go-zero docker-compose 搭建课件服务(七):prometheus+grafana服务监控
0.1源码地址
https://github.com/liuyuede123/go-zero-courseware
1、目前的目录文件构造
目前只是创立好了courseware服务,这一章节我咱们先在docker-compose跑通课件服务
.├── courseware│ ├── api│ │ ├── courseware.api│ │ ├── courseware.go│ │ ├── etc│ │ │ └── courseware.yaml│ │ └── internal│ │ ├── config│ │ │ └── config.go│ │ ├── handler│ │ │ ├── coursewareaddhandler.go│ │ │ ├── coursewaredeletehandler.go│ │ │ ├── coursewaregethandler.go│ │ │ ├── coursewareupdatehandler.go│ │ │ └── routes.go│ │ ├── logic│ │ │ ├── coursewareaddlogic.go│ │ │ ├── coursewaredeletelogic.go│ │ │ ├── coursewaregetlogic.go│ │ │ └── coursewareupdatelogic.go│ │ ├── svc│ │ │ └── servicecontext.go│ │ └── types│ │ └── types.go│ ├── go.mod│ ├── go.sum│ └── rpc│ ├── courseware│ │ ├── courseware.pb.go│ │ └── courseware_grpc.pb.go│ ├── courseware.go│ ├── courseware.proto│ ├── coursewareclient│ │ └── courseware.go│ ├── etc│ │ └── courseware.yaml│ ├── internal│ │ ├── config│ │ │ └── config.go│ │ ├── logic│ │ │ ├── addlogic.go│ │ │ ├── deletelogic.go│ │ │ ├── getlogic.go│ │ │ └── updatelogic.go│ │ ├── server│ │ │ └── coursewareserver.go│ │ └── svc│ │ └── servicecontext.go│ └── model│ ├── courseware.sql│ ├── coursewaremodel.go│ ├── coursewaremodel_gen.go│ └── vars.go└── user ├── api │ └── user.api └── rpc └── user.proto
2、我的项目根目录下创立依赖的服务
创立etcd Dockerfile
mkdir etcdvim etcd/Dockerfile
Dockerfile中的内容,保留并退出
FROM bitnami/etcd:latestLABEL maintainer="liuyuede123 <liufutianoppo@163.com>"
创立etcd-manage Dockerfile
mkdir etcd-managevim etcd-manage/Dockerfile
Dockerfile中的内容,保留并退出
FROM evildecay/etcdkeeperLABEL maintainer="liuyuede123 <liufutianoppo@163.com>"
3、courseware api和rpc生成Dockerfile
到courseware/api目录下生成Dockerfile
cd courseware/apigoctl docker -go courseware.go
FROM golang:alpine AS builderLABEL stage=gobuilderENV CGO_ENABLED 0ENV GOPROXY https://goproxy.cn,directRUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositoriesRUN apk update --no-cache && apk add --no-cache tzdataWORKDIR /buildADD go.mod .ADD go.sum .RUN go mod downloadCOPY . .COPY api/etc /app/etcRUN go build -ldflags="-s -w" -o /app/courseware api/courseware.goFROM scratchCOPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crtCOPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/ShanghaiENV TZ Asia/ShanghaiWORKDIR /appCOPY --from=builder /app/courseware /app/coursewareCOPY --from=builder /app/etc /app/etcCMD ["./courseware", "-f", "etc/courseware.yaml"]
到courseware/rpc目录下生成Dockerfile
cd ../rpcgoctl docker -go courseware.go
FROM golang:alpine AS builderLABEL stage=gobuilderENV CGO_ENABLED 0ENV GOPROXY https://goproxy.cn,directRUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositoriesRUN apk update --no-cache && apk add --no-cache tzdataWORKDIR /buildADD go.mod .ADD go.sum .RUN go mod downloadCOPY . .COPY rpc/etc /app/etcRUN go build -ldflags="-s -w" -o /app/courseware rpc/courseware.goFROM scratchCOPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crtCOPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/ShanghaiENV TZ Asia/ShanghaiWORKDIR /appCOPY --from=builder /app/courseware /app/coursewareCOPY --from=builder /app/etc /app/etcCMD ["./courseware", "-f", "etc/courseware.yaml"]
4、创立docker-compose.yml文件
到我的项目根目录
touch docker-compose.yml
version: '3.5'# 网络配置networks: backend: driver: bridge# 服务容器配置services: etcd: # 自定义容器名称 build: context: etcd # 指定构建应用的 Dockerfile 文件 environment: - TZ=Asia/Shanghai - ALLOW_NONE_AUTHENTICATION=yes - ETCD_ADVERTISE_CLIENT_URLS=http://etcd:2379 ports: # 设置端口映射 - "2379:2379" networks: - backend restart: always etcd-manage: build: context: etcd-manage environment: - TZ=Asia/Shanghai ports: - "7000:8080" # 设置容器8080端口映射指定宿主机端口,用于宿主机拜访可视化web depends_on: # 依赖容器 - etcd # 在 etcd 服务容器启动后启动 networks: - backend restart: always courseware-rpc: # 自定义容器名称 build: context: courseware # 指定构建应用的 Dockerfile 文件 dockerfile: rpc/Dockerfile environment: # 设置环境变量 - TZ=Asia/Shanghai privileged: true ports: # 设置端口映射 - "9400:9400" # 课件服务rpc端口 stdin_open: true # 关上规范输出,能够承受内部输出 tty: true networks: - backend restart: always # 指定容器退出后的重启策略为始终重启 courseware-api: # 自定义容器名称 build: context: courseware # 指定构建应用的 Dockerfile 文件 dockerfile: api/Dockerfile environment: # 设置环境变量 - TZ=Asia/Shanghai privileged: true ports: # 设置端口映射 - "8400:8400" # 课件服务api端口 stdin_open: true # 关上规范输出,能够承受内部输出 tty: true networks: - backend restart: always # 指定容器退出后的重启策略为始终重启
而后我的项目根目录执行:
docker-compose up -dCreating go-zero-courseware_courseware-rpc_1 ... doneCreating go-zero-courseware_etcd_1 ... doneCreating go-zero-courseware_courseware-api_1 ... doneCreating go-zero-courseware_etcd-manage_1 ... done
这时候课件服务就跑起来了。
而后测试下接口是否可用:
http://localhost:8400/api/courseware/get{ "id": 1}http://localhost:8400/api/courseware/add{ "name": "多媒体课件11", "code": "CH500", "type": 4}http://localhost:8400/api/courseware/update{ "id" : 1, "name": "多媒体课件1133", "code": "CH500", "type": 4}http://localhost:8400/api/courseware/delete{ "id": 1