结果直接跳转至配置后查看。

主线任务:给特定接口走单独的集群轮询策略。

假设接口为: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

推荐阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。