基本负载平衡器带有nginx
#devops #go #nginx #systemdesign

nginx是一个高级的Web浏览器,可以用作反向代理,负载平衡器,邮件代理和缓存机制。在本简短的教程中,我们用Docker-Compose缩放Golang Rest API服务,并将所有负载从客户端分配到这些多个服务实例。

System diagram

客户端对http://localhost:8000/端点进行了API调用,该端点击中了NGINX服务,该服务内部将请求代表了端口8000上运行的REST服务器的3个实例之一。我们将使用Round robin负载平衡技术,该技术可以帮助我们在每个实例上几乎均匀分配负载。

  1. 用dockerfile构建golang服务器图像

    FROM golang:1.18-alpine AS builder
    
    RUN mkdir /app
    WORKDIR /app
    COPY . .
    
    RUN CGO_ENABLED=0 GOOS=linux go build -o app cmd/api/main.go
    
    FROM alpine:latest AS production
    WORKDIR /app
    COPY --from=builder /app/app .
    
    CMD [ "./app" ]
    
  2. docker -compose文件 - 运行Golang服务器和Nginx负载平衡器

    version: "3.8"
    
    services:
      rest_api:
        build:
          context: ./server
          dockerfile: Dockerfile
        environment:
          - PORT=:8000
        networks:
          - server-network
        command: /start
    
      nginx:
        image: nginx:latest
        volumes:
          - ./conf.d/nginx.conf:/etc/nginx/nginx.conf
        depends_on:
          - rest_api
        ports:
          - 8000:8000
        networks:
          - server-network
    
    networks:
      server-network:
        driver: bridge
    
  3. nginx conf文件 - 我们将定义事件并将预期的最大客户端并发连接设置为1024。我们可以定义一组REST服务器(image = rest_api )在上游块内部。我们还可以提及上游块内部的负载平衡方法。 NGINX服务器将在主机的端口8000上侦听。 nginx将代表在/路由到app_servers组的所有请求。

    events {
        worker_connections 1024;
    }
    
    http {
        upstream app_servers {
            # default load balancing method is Round Robin
            # other ex. least_conn, ip_hash, etc
            server rest_api:8000;
        }
    
        server {
            listen 8000;
    
            location / {
                proxy_pass http://app_servers;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
        }
    }
    

现在,我们可以使用以下命令开始多个Golang Rest API服务器的多个实例 -

$ docker-compose up --build --scale rest_api=3

nginx将通过不同的REST服务器实例提供相同的请求 -

Output 1

Output 2

Output 3