SpringCloud Gateway基于静态URL的Ribbon负载均衡

前言

SpringCloud Gateway是Netflix旗下开源的API网关,项目比较新,网上资源也比较少,因此坑比较多吧。说到SpringCloud Gateway,肯定都会与Zuul进行对比。Zuul分为Zuul1和Zuul2两个版本,Zuul1是采用同步阻塞的方式,使用多线程来实现,而Zuul2则是采用异步非阻塞的事件驱动。SpringCloud Gateway与Zuul2一样,基于异步非阻塞的事件驱动。

而SpringCloud Zuul则是采用的Zuul1这个同步阻塞的方式,可能是由于Zuul2出来比较慢,Netflix等不及了,就自己搞了一个异步非阻塞的SpringCloud Gateway。有人在Github提问,SpringCloud 后续是否会集成Zuul2,官方给了否定答复。既然都有了异步非阻塞的Gateway,那么也就没必要再集成Zuul2到SpringCloud了。两者的性能对比(zuul1和Gateway),https://github.com/spencergibb/spring-cloud-gateway-bench

ProxyAvg LatencyAvg Req/Sec/Thread
gateway6.61ms3.24k
linkered7.62ms2.82k
zuul12.56ms2.09k
none2.09ms11.77k

需求

1、根据配置,将指定源IP路由到某台特定的服务器,以便灰度发布验证。
2、采用Web端进行路由配置更新。
3、默认规则,采用IP Hash路由到固定服务器。

根据以上三个需求点,只需要使用API网关与负载均衡器,不需要服务注册与发现组件,因此需要采用静态URL进行路由配置。根据多方面权衡以及业务可行性分析,技术栈决定采用SpringCloud Gateway。
原因有以下几点:
1、Gateway支持 RemoteAddr Route Predicate Factory,可以满足需求点1。
2、Gateway支持 Actuator API,支持RestFul刷新路由配置,可以满足需求点2。
3、采用Ribbon,自定义路由规则,以及支持静态服务器地址配置,可以满足需求点3。

实现

application.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
spring:
cloud:
gateway:
routes:
-id: wpstan
uri: lb://customRibbon
predicates:
-RemoteAddr=99.6.150.163
ribbon:
eureka:
enabled: false //必须要关闭eureka的服务注册与发现
customRibbon:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule //随机规则
listOfServers: http://99.12.98.215:8080,http://99.12.98.215:8081,http://99.12.98.215:8082

management:
endpoints:
web:
exposure:
include: '*'//配置actuator api使用,暴露端点

第六行的lb表示匹配规则为loadBalance负载均衡,规则名为customRibbon。第十二行表示该负载均衡规则采用Ribbon,后面就是Ribbon的配置。主要就是listOfServers这个静态URL配置,由于我不需要去动态获取服务注册与发现,因此可以在此写死。需要注意的就是必须要把ribbon.eureka.enabled置为false。