最近业务上遇到一个需求,其它系统因业务校验需要调用上级系统进行数据发送或校验,如果上级系统停机维护,其它下级系统发送的http通讯会丢失,还要一次次补发数据,耗费人工与时间。使用nginx+反向代理解决了部分需求。
目标:当服务A停机维护,其它系统会调用服务B进行http通讯。
加入代理配置,上级系统配置nginx.conf文件。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream linuxidc {
ip_hash;
server 127.0.0.1:7080 weight=3;
server 127.0.0.1:7081 weight=2;
}
server {
listen 8812;
server_name localhost;
location /{
proxy_pass http://linuxidc/;
rewrite ^/api$ /$1 break;
client_max_body_size 300M;
}
}
}
踩坑点:记得加上proxy_pass 最后这个“/”,特此注意。
proxy_pass http://linuxidc/;
upstream设备上的状态设置
1、weight:默认为1.weight越大,负载的权重就越大。
2、ip_hash:nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,一个服务挂掉,需重新登录获取session。
因此ip_hash是有缺陷的,不能在一些情况下使用:
2-1、 nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址。
2-2、nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求不能定位到同一台session应用服务器上。
未解决的问题
以上只是处理了,一个服务挂掉,另外一个服务继续接收通讯,并没有负载每次请求,且没有处理session或token共享问题。咨询了一下大佬,解决这个问题登录的时候需要把session或token放入redis,每次去调用接口,带着session或token一起请求,这样每次的请求会负载到不同的服务中。