Kratos框架单体应用实战四


前言

项目框架和基本的逻辑实现后,我们就可以先把项目部署起来,开发的最后一个链路实现。

配置的更改

*项目中使用的时候环境变量,在这里我们改成使用yuml配置文件的方式,也方便后面的内容的进行。

  1. 在根目录创建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
  1. 更改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部署很简单

  1. 安装 Dokcer
  2. 在项目根目录下创建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"]


  1. 执行docker build -t kratos-use . 命令构建镜像
  2. 运行下面命令启动容器
# 挂载配置文件到/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
  1. 通过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都是分开在单独的容器中或购买的单独数据库资源,上述例子只是在开发和测试中使用较多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值