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;
  • 相关阅读:
    配置支持Basler的API函数的开发环境
    调用约定
    进程间通讯之 命名管道
    进程间通讯。
    使用结构体返回多个参数。
    目的:让目标程序在内存中只有一个实例
    数学问题
    机试二
    pycharm安装TensorFlow
    机器学习一
  • 原文地址:https://www.cnblogs.com/zzq-include/p/12874724.html
Copyright © 2011-2022 走看看