网关被扫描后会注册四个核心配置类,当然在配置类中仍然有各种流程中需要的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;