nginx是一个高级的Web浏览器,可以用作反向代理,负载平衡器,邮件代理和缓存机制。在本简短的教程中,我们用Docker-Compose缩放Golang Rest API服务,并将所有负载从客户端分配到这些多个服务实例。
客户端对http://localhost:8000/
端点进行了API调用,该端点击中了NGINX服务,该服务内部将请求代表了端口8000
上运行的REST服务器的3个实例之一。我们将使用Round robin负载平衡技术,该技术可以帮助我们在每个实例上几乎均匀分配负载。
-
用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" ]
-
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
-
nginx conf文件 - 我们将定义事件并将预期的最大客户端并发连接设置为1024。我们可以定义一组REST服务器(image = rest_api em> )在上游块内部。我们还可以提及上游块内部的负载平衡方法。 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服务器实例提供相同的请求 -