網關被掃描后會注冊四個核心配置類,當然在配置類中仍然有各種流程中需要的bean后面會詳細解釋。
l GatewayAutoConfiguration 網關基礎配置類,當中承載着核心的配置邏輯
l GatewayClassPathWarningAutoConfiguration 網關類加載配置類,就是用於校驗是否加載的時webFlux依賴,而不是普通的web依賴。
l GatewayLoadBalancerClientAutoConfiguration 網關客戶端負載均衡配置類
l GatewayRedisAutoConfiguration 網關限流器配置類
我們先回過頭,假如你已經搭建了一個gateway的demo,那么在網關中進行負載均衡,會添加注解如下:
@RibbonClient(name = "pay-server", configuration = {IRule2.class})
@Configuration @ConditionalOnClass({LoadBalancerClient.class, RibbonAutoConfiguration.class, DispatcherHandler.class}) @AutoConfigureAfter(RibbonAutoConfiguration.class) public class GatewayLoadBalancerClientAutoConfiguration { // GlobalFilter beans @Bean @ConditionalOnBean(LoadBalancerClient.class) public LoadBalancerClientFilter loadBalancerClientFilter(LoadBalancerClient client) { return new LoadBalancerClientFilter(client); } }
RibbonClientConfigurationRegistrar中注冊@RibbonClient中的configuration到Spring的BeanDefinition,bean的名稱是注解中標識的name
private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name, Object configuration) { BeanDefinitionBuilder builder = BeanDefinitionBuilder .genericBeanDefinition(RibbonClientSpecification.class); builder.addConstructorArgValue(name); builder.addConstructorArgValue(configuration); registry.registerBeanDefinition(name + ".RibbonClientSpecification", builder.getBeanDefinition()); }
Map<String, Object> client = metadata.getAnnotationAttributes( RibbonClient.class.getName(), true); String name = getClientName(client); if (name != null) { registerClientConfiguration(registry, name, client.get("configuration")); }//這部分為注冊代碼,代碼都在RibbonClientConfigurationRegistrar中
我們在LoadBalancerClientFilter中看到了內層包裝了一個LoadBalancerClient,而該client默認實現就是RibbonLoadBalancerClient,內部調用getServer方法的時候是負載均衡的核心關鍵點。負載均衡實體類是:BaseLoadBalancer
想到這里在解釋下:LoadBalancerClientFilter就是一個全局的filter,只是它的order比較靠后:
public static final int LOAD_BALANCER_CLIENT_FILTER_ORDER = 10100;