Spring Cloud Gateway学习笔记

前言

Spring Cloud Gateway 版本 Hoxton.SR6

路由

Route类是最终执行依赖的类,RouteDefine类是路由规则定义的类。Spring Cloud Gateway会将RouteDefine转换成Route以供程序使用。RouteDefineLocator接口定义了RouteDefine类的来源。
PropertiesRouteDefinitionLocator解析GatewayProperties中的路由定义,也就是yml配置中的路由定义。RouteDefinitionRepository接口继承RouteDefinitionLocatorRouteDefinitionWriterRouteDefinitionWriter接口中有两个方法:增加和删除路由定义。InMemoryRouteDefinitionRepository路由定义来源于内存,可以通过actuator新增删除路由。
Package route.png

ribbon的listOfServers

在zuul网关中,我们可以使用ribbon来做客户端负载均衡。假如后端服务列表是固定的,不需要采用服务注册与发现组件,那么我们就可以在ribbon中给service配置listOfServers属性。

1
2
3
service:
ribbon:
listOfServers: localhost:8080,localhost:8081

当我们使用Spring Cloud GatewaySpring Cloud loadbalancer来做负载均衡时,我们同样可以脱离服务注册与发现组件,将静态服务列表配置到properties文件中:

1
2
3
4
spring.cloud.discovery.client.simple.instances.service1[0].uri=http://s11:8080
spring.cloud.discovery.client.simple.instances.service1[1].uri=https://s12:8443
spring.cloud.discovery.client.simple.instances.service2[0].uri=https://s21:8080
spring.cloud.discovery.client.simple.instances.service2[1].uri=https://s22:443

这种方式是采用的SimpleDiscoveryClient做服务发现客户端。

后端实例健康检查

在ribbon中,我们可以使用ServerStats来维护后端状态,负载均衡器在选择后端实例的时候可以根据状态来实现断路操作。同样,在SpringCloud loadbalancer中,可以通过HealthCheckServiceInstanceListSupplier来维护后端实例的状态。
采用HealthCheckServiceInstanceListSupplier的方式,特别适用SimpleDiscoveryClient这种将后台服务地址固定写在properties文件中的情况。因为如果采用外部服务发现的情况下,例如Eureka、Nacos、Consul等,是可以剔除失效服务的。
LoadBalancerClientConfiguration类中中可以看到如下配置:

1
2
3
4
5
6
7
8
9
10
@Bean
@ConditionalOnBean({ReactiveDiscoveryClient.class})
@ConditionalOnMissingBean
@ConditionalOnProperty(
value = {"spring.cloud.loadbalancer.configurations"},
havingValue = "health-check"
)
public ServiceInstanceListSupplier healthCheckDiscoveryClientServiceInstanceListSupplier(ConfigurableApplicationContext context) {
return ServiceInstanceListSupplier.builder().withDiscoveryClient().withHealthChecks().withCaching().build(context);
}