spring cloud gateway 負載均衡流程


網關被掃描后會注冊四個核心配置類,當然在配置類中仍然有各種流程中需要的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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM