gin + es 实践 05

部署指南

本文档提供了 Go-ES 项目的完整部署指南,包括环境准备、应用构建、数据库和 Elasticsearch 设置以及服务启动流程。

环境要求

部署 Go-ES 项目需要以下软件环境:

  • Go 1.21 或更高版本
  • MySQL 5.7 或更高版本
  • Elasticsearch 8.x
  • Docker 和 Docker Compose(可选,用于容器化部署)

部署前准备

1. 安装 Go 环境

访问 Go 官方网站 下载并安装适合您操作系统的 Go 版本。

安装完成后,验证安装:

go version

2. 安装 MySQL

可以通过以下方式安装 MySQL:

  • 在 Linux 上使用包管理器安装
  • 在 Windows 或 macOS 上使用官方安装程序
  • 使用 Docker 运行 MySQL 容器

启动 MySQL 服务后,创建数据库:

CREATE DATABASE go_es CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3. 安装 Elasticsearch

本项目提供了一个便捷的脚本 es.sh 用于使用 Docker 快速部署 Elasticsearch 和 Kibana:

# 赋予脚本执行权限
chmod +x es.sh

# 运行脚本
./es.sh

该脚本会:

  • 检查 Docker 和 Docker Compose 是否已安装
  • 创建必要的目录结构
  • 生成 Docker Compose 配置文件
  • 启动 Elasticsearch 和 Kibana 容器

如果您希望手动安装 Elasticsearch,可以参考 Elasticsearch 官方文档

应用部署

1. 获取源代码

从 Git 仓库克隆项目:

git clone https://github.com/saixiaoxi/go-es.git
cd go-es

2. 配置应用

复制示例配置文件并修改:

cp config.example.yaml config.yaml

编辑 config.yaml 文件,配置应用参数:

# 应用配置
app:
  env: production   # 设置环境为生产环境
  port: 8080        # 应用端口

# 数据库配置 
database:
  host: localhost   # 修改为您的数据库主机
  port: 3306        # 数据库端口
  user: root        # 数据库用户名
  password: your_password # 修改为您的数据库密码
  name: go_es       # 数据库名称

# Elasticsearch 配置
elasticsearch:
  addresses:        # 修改为您的 ES 地址
    - http://localhost:9200
  username: ""      # 如果有认证,填写用户名
  password: ""      # 如果有认证,填写密码
  index_prefix: go_es_  # 索引前缀

3. 构建应用

在项目根目录下构建应用:

# 下载依赖
go mod tidy

# 构建应用
go build -o bin/go-es cmd/api/main.go

4. 启动应用

# 直接运行
./bin/go-es

# 或者在开发环境直接使用 go run
go run cmd/api/main.go

应用启动后,将在配置的端口上运行,并自动连接数据库和 Elasticsearch:

  • API 服务地址:http://localhost:8080/api/v1
  • Swagger 文档地址:http://localhost:8080/swagger/index.html

容器化部署

为简化部署流程,我们提供了使用 Docker 和 Docker Compose 的完整部署方案。

创建 Dockerfile

在项目根目录创建 Dockerfile

# 构建阶段
FROM golang:1.21-alpine AS builder

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY go.mod go.sum ./

# 下载依赖
RUN go mod download

# 复制源代码
COPY . .

# 构建应用
RUN CGO_ENABLED=0 GOOS=linux go build -o go-es cmd/api/main.go

# 运行阶段
FROM alpine:latest

# 安装 CA 证书
RUN apk --no-cache add ca-certificates

# 设置工作目录
WORKDIR /app

# 从构建阶段复制二进制文件
COPY --from=builder /app/go-es .

# 复制配置文件
COPY config.example.yaml config.yaml

# 暴露端口
EXPOSE 8080

# 运行应用
CMD ["./go-es"]

创建 Docker Compose 配置

创建 docker-compose.yml 文件,包含完整的应用栈:

version: '3'

services:
  # MySQL 服务
  mysql:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: go_es
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-ppassword"]
      interval: 5s
      timeout: 5s
      retries: 5

  # Elasticsearch 服务
  elasticsearch:
    image: elasticsearch:8.12.2
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "discovery.type=single-node"
      - "ELASTIC_PASSWORD=elastic_password"
      - "xpack.security.enabled=true"
    ports:
      - "9200:9200"
    volumes:
      - es-data:/usr/share/elasticsearch/data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9200"]
      interval: 30s
      timeout: 10s
      retries: 5

  # Kibana 服务
  kibana:
    image: kibana:8.12.2
    environment:
      - "ELASTICSEARCH_HOSTS=http://elasticsearch:9200"
      - "I18N_LOCALE=zh-CN"
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch

  # 应用服务
  app:
    build: .
    restart: always
    ports:
      - "8080:8080"
    depends_on:
      - mysql
      - elasticsearch
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./config.yaml:/app/config.yaml
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/api/v1/health"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  mysql-data:
  es-data:

启动容器化应用

使用 Docker Compose 启动整个应用栈:

# 构建并启动服务
docker-compose up -d

# 查看容器状态
docker-compose ps

# 查看应用日志
docker-compose logs -f app

生产环境部署建议

对于生产环境,我们建议以下部署实践:

1. 使用反向代理

在前端放置 Nginx 反向代理,提供以下功能:

  • TLS 终止 (HTTPS)
  • 负载均衡
  • 静态资源服务
  • 请求限流

Nginx 配置示例:

server {
    listen 80;
    server_name api.example.com;
    
    # 重定向到 HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name api.example.com;
    
    # SSL 配置
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    
    # 反向代理到应用
    location /api/ {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    
    # Swagger 文档
    location /swagger/ {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

2. 数据库优化

对于生产环境 MySQL,建议:

  • 启用连接池
  • 优化 MySQL 配置参数
  • 设置适当的缓存大小
  • 配置定期备份策略

3. Elasticsearch 集群

对于生产环境 Elasticsearch,建议:

  • 部署至少 3 节点的集群
  • 使用专用主节点和数据节点
  • 配置索引生命周期管理
  • 配置安全认证和授权

4. 监控和日志

建立完善的监控和日志系统:

  • 使用 Prometheus + Grafana 监控应用指标
  • 使用 ELK 栈收集和分析日志
  • 设置合适的告警阈值和通知渠道

故障排查

常见问题解决

  1. 应用无法连接数据库

    • 检查数据库连接参数
    • 确认数据库服务运行状态
    • 检查防火墙或网络限制
  2. 应用无法连接 Elasticsearch

    • 检查 Elasticsearch 地址和认证信息
    • 确认 Elasticsearch 服务运行状态
    • 检查 Elasticsearch 日志是否有错误
  3. API 请求返回 500 错误

    • 检查应用日志查找详细错误信息
    • 验证请求参数是否正确
    • 确保数据库和 Elasticsearch 可用
  4. 搜索结果不准确

    • 检查索引映射和分析器配置
    • 尝试重建索引(POST /api/v1/products/reindex
    • 验证搜索查询参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值