SpringCloud 网关和应用的负载均衡
1、应用的负载均衡,只要以不同端口号同时启动多个应用,通过SpringGateway自带的Ribbon可以自动实现负载均衡。
配置网关路由uri
的时候使用lb://
协议
例如:
cloud:
gateway:
routes:
- id: websocket_route
uri: lb:ws://wood-system
predicates:
- Path=/webSocket/**
- id: websocket_api
uri: lb:ws://wood-system
predicates:
- Path=/api/webSocket/**
注意:应用需无状态 或 状态做分布式管理。
2、网关的负载均衡
方式一:使用nginx
# 1. 前端资源:通过ngix加载前端静态资源+keepalived实现前端负载
# 2. 反向代理:前端资源指向端口不要指定网关,指向反向代理服务器,反向代理服务器指向后端网关集群,问题是不能高效实现网关的弹性。
# 3. 将前端资源+反向代理整合到一个nginx中,再利用nginx+keepalived实现前端负载+反向代理集群。
问题:关于使用websocket的问题。
WebSocket是端对端的,所以当一个代理服务器从客户端拦截一个Upgrade请求,它需要去发送它自己的Upgrade请求到后端服务器,也包括合适的头。
因为WebSocket是一个长连接,不像HTTP那样是典型的短连接,所以反向代理服务器需要允许连接保持着打开,而不是在它们看起来空闲时就将它们关闭。
其他方式:
方式二:
# 1. lvs
方式三:
# 1. dns
方式四:
# 1. F5
3、使用nginx实现网关的负载均衡,nginx配置
#user nobody;
worker_processes 1;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# websocket 协议升级
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# 负载均衡
upstream balancer {
# ip_hash;
server localhost:9000 weight=1 max_fails=2 fail_timeout=30s;
server localhost:9001 weight=2 max_fails=2 fail_timeout=30s;
}
server {
listen 8812;
server_name localhost;
client_max_body_size 500m;
location / {
proxy_pass http://balancer;
proxy_http_version 1.1;
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 默认情况下,连接将会在无数据传输60秒后关闭,proxy_read_timeout参数可以延长这个时间。
proxy_read_timeout 300s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
server {
listen 8888;
server_name localhost;
location / {
root html/dist_localhost8812;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}