Gateway集群部署,配合nacos、nginx实现负载均衡

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

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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值