结果直接跳转至配置后查看。
主线任务:给特定接口走单独的集群轮询策略。
假设接口为:http://192.168.0.1/api/reportOffice/office/db2021/test
api和reportOffice都是前端请求拼的前缀,实际接口是office/db2021/test
心路历程非常艰苦!
①先从nginx配置文件开始分析,最初想法,给特定接口单独更换前缀,通过过滤前缀进行转发到指定office服务集群中,后来发现问题,此做法跳过了gateway,可能会出现其他问题(可能会有session问题),所以pass。
②所以换思路,把目标转移到了gateway的配置文件上,gateway通过配置也可以实现过滤接口,所以设计过滤特殊接口,然后想让这个接口单独走自己的集群轮询策略,理论上是可以实现,但实际并不可行,此处并没有找到原因,猜测是一个gateway服务共享一个nacos服务列表,特殊的接口会受到原有服务内其他接口的影响,并不能单独走轮询,会与原服务内其他接口一起走轮询,此处并没有发现gateway用什么去标记轮询的标记,所以猜想公用nacos服务列表,所以又pass。
③好好好~这么玩是吧,我开始把矛头指向了gateway的源码,查资料看了一下gateway默认有一个轮询机制,看看他是怎么实现的,不就是看源码吗,我库库看,我库库就是看不懂,这个阶段的出现了各种工厂模式,监听器,过滤器全在我知识盲区。我看谁不emo,不过也大致了解到gateway默认轮询是怎么回事,gateway初始化的时候回去获取nacos服务列表,然后会有一个指针标记服务,过一个请求指针就下移不断循环实现轮询,当然期间gateway也会定时去重新获取nacos服务列表来进行同步。ok除了头痛问题还是没解决。
④最后,救星出现了,跟一位大佬沟通了我的需求,他帮我分析并给我指明了一条路,重点在于把gateway做成集群,能get到痛点吗哈哈哈。这篇文章链接:
GateWay集群部署,windows下配合nacos、Nginx实现负载均衡-CSDN博客
这篇文章说的是gateway有默认的集群轮询机制,所以我们可以再起一个gateway服务去单独处理我们的特殊接口,也就是通过nginx过滤分发到我们新配置的gateway服务上。说干就干,已自测方法可行!!!
先看一下项目原有配置:
nginx的配置文件(nginx.conf)
转发到192.168.33.16:9527,也就是全都交给192.168.33.16服务器上9527这个端口对应的gateway。
upstream dbpt_servers {
server 192.168.33.16:9527;
}
server {
listen 80;
server_name localhost;
location / {
root html;
try_files $uri $uri/ /index.html
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ^~ /api/ {
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://dbpt_servers/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60;
proxy_send_timeout 1200;
proxy_read_timeout 1200;
}
location ^~ /dfs/ {
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
add_header Content-Disposition "attachment;filename=$arg_zsname";
proxy_pass http://192.168.24.15/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 404 /404.html;
location = /404.html {
root /usr/local/nginx/404;
}
}
gateway的配置文件(.yml),主要看office模块。
uri: lb://dbpt-report-office这种映射写法用的gateway的动态路由,gateway会去nacos获取对应服务的列表。
gateway默认有一个集群服务轮询策略。
server:
port: 9527
spring:
application:
name: dbpt-gateway
devtools:
restart:
enabled: true
profiles:
active: dev
cloud:
nacos:
config:
server-addr: http://address:8848
file-extension: yml
discovery:
server-addr: http://address:8848
gateway:
discovery:
locator:
lowerCaseServiceId: true
enabled: true
routes:
#...(省略)
#office 模块
- id: dbpt-report-office
uri: lb://dbpt-report-office
predicates:
- Path=/reportOffice/**
filters:
- StripPrefix=1
#...(省略)
feign:
hystrix:
enabled: true
client:
config:
default:
connectTimeout: 10000
readTimeout: 600000
hystrix:
command:
default:
execution:
timeout:
enabled: false
logging:
level:
org.springframework.cloud.gateway: DEBUG
再看一下nacos的服务列表。office模块可以看到有两个服务被注册上去,也就是集群状态。
看完原有配置之后,开始解决主线任务。
修改后配置:
nginx配置文件如下,修改部分为新增一个upstream dbpt_office虚拟主机,并指向新启的gateway服务上。
upstream dbpt_servers {
server 192.168.33.16:9527;
}
upstream dbpt_office {
server 192.168.20.76:9528;
}
server {
listen 80;
server_name localhost;
location / {
root html;
try_files $uri $uri/ /index.html
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ^~ /api/ {
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://dbpt_servers/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60;
proxy_send_timeout 1200;
proxy_read_timeout 1200;
}
location ^~ /office/ {
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://dbpt_office/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 60;
proxy_send_timeout 1200;
proxy_read_timeout 1200;
}
location ^~ /dfs/ {
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
add_header Content-Disposition "attachment;filename=$arg_zsname";
proxy_pass http://192.168.24.15/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 404 /404.html;
location = /404.html {
root /usr/local/nginx/404;
}
}
在原有gateway的服务基础上,我们在启一个gateway服务。如图的话33.16:9527是最开始的gateway服务,新增一台20.76:9528来处理特殊的接口轮询。
所以最终这个接口会先被nginx拦截,然后分发到新增的gateway(20.76:9528),之后会有这个gateway默认的轮询策略,去动态路由对应服务的集群。
over over