route通过注册中心Eureka自动加载配置
配置
- gateway及后端微服务引入注册中心客户端eureka-client
<!-- 引入 Spring Cloud Netflix Eureka Client 相关依赖,将 Eureka 作为注册中心的客户端,并实现对其的自动配置 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- eureka-client starter的引入,会同时引入ribbon,作为后续请求,负载均衡的实现

spring.cloud.gateway.discovery.locator.enabled设为true,启用服务发现的DiscoveryClientRouteDefinitionLocator
spring:
cloud:
# Spring Cloud Gateway 配置项,对应 GatewayProperties 类
gateway:
discovery:
locator:
enabled: true # default fase,设为true开启
@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(value = "spring.cloud.discovery.reactive.enabled",//fzb 默认使用响应式的方式
matchIfMissing = true)
public static class ReactiveDiscoveryClientRouteDefinitionLocatorConfiguration {
@Bean//fzb spring.cloud.gateway.discovery.locator.enabled配为true时,才开启DiscoveryClientRouteDefinitionLocator
@ConditionalOnProperty(name = "spring.cloud.gateway.discovery.locator.enabled")
public DiscoveryClientRouteDefinitionLocator discoveryClientRouteDefinitionLocator(
ReactiveDiscoveryClient discoveryClient,//响应式的客服端 Eureka就是 EurekaReactiveDiscoveryClient
DiscoveryLocatorProperties properties) {
return new DiscoveryClientRouteDefinitionLocator(discoveryClient, properties);
}
}
- eureka-client的引入,会开启TimedSupervisorTask执行HeartbeatThread的心跳任务, 默认每隔30s一次
RouteRefreshListener 每隔30s接收到HeartBeatEvent事件,同时会发送RefreshRoutes事件


CachingRouteLocator 收到RefreshRoutesEvent事件,重新获取路由时会发现多了一个DiscoveryClientRouteDefinitionLocator (负责从注册中心获取新路由配置)

验证
http://localhost:7070/ORDER/order/get 前边ORDER为eureka-client从eureka-server获取的服务名,
LoadBalancerClientFilter在NettyRoutingFilter之前通过ribbon执行负载均衡策略,选择一个服务实例

总结
- springgateway 接收注册中心心跳事件,发送路由刷新事件,
- CachingRouteLocator 最终调用DiscoveryClientRouteDefinitionLocator#getRouteDefinitions 获取注册中心最新的路由
代码实现:https://github.com/fengzhenbing/spring-cloud-gateway-demo.git