前言
项目框架和基本的逻辑实现后,我们就可以先把项目部署起来,开发的最后一个链路实现。
配置的更改
*项目中使用的时候环境变量,在这里我们改成使用yuml配置文件的方式,也方便后面的内容的进行。
- 在根目录创建configs文件夹,用来存放配置文件config.yaml,文件中配置用到的内容
server:
http:
addr: 0.0.0.0:8000
timeout: 0s
data:
database:
driver: mysql
source: root:123456@tcp(127.0.0.1:3306)/kratos-use?charset=utf8mb4&parseTime=True&loc=Local
log:
out_type: console
- 更改main.go,注释掉环境变量设置的代码
func init() {
flag.StringVar(&flagconf, "conf", "../../configs/config.yaml", "config path, eg: -conf config.yaml")
}
func main() {
flag.Parse()
c := config.New(
config.WithSource(
//env.NewSource(""),
file.NewSource(flagconf),
),
)
//setConfig(c, &bc)
}
单体应用的简单部署方式
对于项目前期应用量不大,一台16G 8核的Linux服务器运行简单的web应用,就能轻轻松松满足500到1000甚至更高的QPS,因为本身go程序编译后并不依赖任何其他外部内容,也没必要引入dokcer保证环境的统一,足以保证初期项目的开发,测试和生产的运行,除非是有宣传或引流的渠道,QPS可能会很高,这样生产部署的时候最好还是上docker,扩展比较方便。
使用的部署工具
单体应用单台服务器部署,我这边使用的是supervider工具,ubuntu上可以使用sudo apt install supervisor安装,使用supervisorctl status查看服务状态,由于我们没有配置服务,服务列表显示空。
在/etc/supervisor/conf.d下面创建kratos-use.conf文件,简单的内容如下:
[program:kratos-use]
command=/bin/bash -c "cd /home/user/kratos-use && ./server -conf ./configs/config.yaml"
logfile=/data/logs/supervisord_file_log.log
stdout_logfile=/data/logs/supervisord_stdout.log
stderr_logfile=/data/logs/supervisord_stdout.log
autorestart=true
然后使用supervisorctl update根据配置文件更新程序。其他常用的命令如下:
# 修改supervisorctl配置后,执行
sudo supervisorctl update
# 启动/重启 服务
sudo supervisorctl start/restart server
# 启动失败后查看日志
sudo supervisorctl tail server stdout
# 停止服务
sudo supervisorctl stop server server2
# 开启服务
sudo supervisorctl start server server2
Docker方式部署
为了后面学习容器化的内容,我这边使用Docker方式部署单体项目,Dokcer部署很简单
- 安装 Dokcer
- 在项目根目录下创建Dockerfile文件,其中make build的执行的命令在Makefile下的build节点,也就是构建可执行程序。
FROM golang:1.23 AS builder
COPY . /src
WORKDIR /src
RUN GOPROXY=https://goproxy.cn make build
FROM debian:stable-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
netbase \
&& rm -rf /var/lib/apt/lists/ \
&& apt-get autoremove -y && apt-get autoclean -y
COPY --from=builder /src/bin /app
WORKDIR /app
EXPOSE 8000
VOLUME /data/conf
CMD ["./server", "-conf", "/data/conf"]
- 执行docker build -t kratos-use . 命令构建镜像
- 运行下面命令启动容器
# 挂载配置文件到/data/conf下,这样在启动的时候就能找到配置文件,因为我们在dockerfile中设置了
docker run --rm -p 8000:8000 -v ./configs:/data/conf kratos-use
# 如果本地测试想访问宿主机,需要加上--add-host host.docker.internal:host-gateway, window路径中可能需要写成.\configs\
docker run --add-host host.docker.internal:host-gateway --rm -p 8000:8000 -v ./configs:/data/conf kratos-use
- 通过Apifox工具访问接口查看是否成功。
Docker Compose
Docker自身的容器编排工具,用于在单台机器上运行多个容器,使用场景大多数是轻量级的单体应用开发,常常用于开发测试阶段,可以帮助开发者快速启动应用程序的多个服务,例如我的项目中依赖Mysql,Redis,或者我还需要调用另一个服务获取数据,这样我们可以将这些服务编排在一起作为一个独立可运行的项目,帮助我们更好的开发和测试。
生产环境中的容器编排一般使用K8s,专注于大规模集群管理。可以在多个节点上协调、调度和管理容器,适合复杂分布式系统的生产部署。
我们在根目录下创建docker-compose.yml文件,将Mysql和Redis集成到compose文件中
services:
web:
build: .
ports:
- "8000:8000"
environment:
- env=dev
volumes:
- ./configs:/data/conf
depends_on:
- mysql
- redis
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: Passw0rd
MYSQL_DATABASE: kratos_use
ports:
- "3307:3306"
volumes:
- ../mysql_data:/var/lib/mysql
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
- ../redis_data:/data
volumes:
mysql_data:
redis_data:
上面的文件也好理解
- services节点是服务配置
- web,mysql,redis这些是服务的名称
- depends_on是依赖的服务,优先启动好依赖的服务后再启动自身。
其他一些字段都很好理解,更多的配置可以参考官方提供的文档说明,需要注意的是在应用程序配置文件,连接mysql和redis需要改为服务名+端口号的形式,如下:
root:Passw0rd@tcp(mysql:3306)/kratos_use?charset=utf8mb4&parseTime=True&loc=Local
配置好后,参考下面命令使用docker-compose
# 如果不存在,则构建镜像,挂在卷等操作后,启动容器; 存在则直接启动
docker-compose up
# 强制构建,然后启动
docker-compose up --build
# 后台启动
docker-compose up -d
# 启动/停止/重启,与up区别在于start不会构建,仅会启动已经构建好的服务
docker-compose start/stop/restart
# 停止并删除所有涉及的容器,并不会删除卷和镜像
docker-compose down
# 停止并删除所有涉及的容器,删除卷
docker-compose down --volumes
# 停止并删除所有涉及的容器,删除镜像
docker-compose down --rmi all
# 当dockerfile 修改时,重新构建服务镜像,然后启动特定的服务即可
docker-compose build
docker-compose restart [服务名称]
# 查看服务容器日志输出
docker-compose logs
# 特定的服务日志
docker-compose logs [服务名称]
# 查看实时日志
docker-compose logs -f [服务名称]
# 在正在运行的容器中执行命令
docker-compose exec [服务名称] [要执行的命令]
# 列出所有的容器
docker-compose ps
# 查看合并后的compoose配置
docker-compose config
通过Apifox工具访问接口查看是否成功。
总结
本篇文章主要是介绍利用单体应用如何在单台服务器上部署的方式,可以使用supervisor工具,dockerfile文件,docker-compose文件等方式部署,一般来说,mysql和redis都是分开在单独的容器中或购买的单独数据库资源,上述例子只是在开发和测试中使用较多。