Gateway中涉及三大块知识包括Netty、响应式框架Reactor以及Gateway。虽然Gateway集成SpringBoot、SpringCloud等微服务架构,但是利用Netty取代了传统Web框架SpringMvc,所以其启动流程会有很大的差异。本文主要结合启动流程分析Gateway中涉及的事件发布机制,从而对Gateway中动态路由功能有更加直观的感受。
Gateway中触发事件发布机制的核心类为AnnotationConfigReactiveWebServerApplicationContext
。在启动类 ConfigurableApplicationContext#run 中完成初始化。
如图所示:ApplicationContext核心类同时也是一个发布者。
1、EurekaClientAutoConfiguration
借助 EurekaClientAutoConfiguration 心跳机制完成 AnnotationConfigReactiveWebServerApplicationContext
发布者事件的发布。
public EurekaClient eurekaClient(ApplicationInfoManager manager,
EurekaClientConfig config, EurekaInstanceConfig instance,
@Autowired(required = false) HealthCheckHandler healthCheckHandler) {
// content:AnnotationConfigReactiveWebServerApplicationContext
CloudEurekaClient cloudEurekaClient = new CloudEurekaClient(appManager,config, this.optionalArgs, this.context);
}
1.1、CloudEurekaClient
public class CloudEurekaClient extends DiscoveryClient {
public CloudEurekaClient(ApplicationInfoManager applicationInfoManager,
EurekaClientConfig config, AbstractDiscoveryClientOptionalArgs<?> args,
ApplicationEventPublisher publisher) {
super(applicationInfoManager, config, args);//初始化 DiscoveryClient
this.applicationInfoManager = applicationInfoManager;
this.publisher = publisher;// AnnotationConfigReactiveWebServerApplicationContext
this.eurekaTransportField = ReflectionUtils.findField(DiscoveryClient.class,
"eurekaTransport");
ReflectionUtils.makeAccessible(this.eurekaTransportField);
}
protected void onCacheRefreshed() {
super.onCacheRefreshed();
if (this