zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)
    iOS NSArray数组过滤
    App Store2016年最新审核规则
    iOS 根据字符串数目,自定义Label等控件的高度
    iOS 证书Bug The identity used to sign the executable is no longer valid 解决方案
    Entity FrameWork 增删查改的本质
    EF容器---代理类对象
    Entity FrameWork 延迟加载本质(二)
    Entity FrameWork 延迟加载的本质(一)
    Entity FrameWork 增删查改
  • 原文地址:https://www.cnblogs.com/zzq-include/p/12874724.html
Copyright © 2011-2022 走看看