Spring Cloud Gateway负载均衡
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Gateway负载均衡相关的知识,希望对你有一定的参考价值。
参考技术A我们都知道Spring Cloud Gateway是一个基于Spring Boot、Spring WebFlux、Project Reactor构建的高性能网关,旨在提供简单、高效的API路由。Spring Cloud Gateway基于Netty运行,因此在传统Servlet容器中或者打成war包是不能正常运行的。
Gateway有两种客户端负载均衡器, LoadBalancerClientFilter 和 ReactiveLoadBalancerClientFilter 。 LoadBalancerClientFilter 使用一个Ribbon的阻塞式 LoadBalancerClient ,Gateway建议使用 ReactiveLoadBalancerClientFilter 。可以通过设置 spring.cloud.loadbalancer.ribbon.enabled=false ,切换到 ReactiveLoadBalancerClientFilter 。无论使用Ribbon还是LoadBalancer,在Route中配置的lb是一样的
官网The LoadBalancerClient Filter
如果URI以lb开头,比如如上配置中的 lb://user-service ,Spring Cloud Gateway会用 ReactiveLoadBalancerClientFilter 解析服务名为 user-service 的实例对应的实际host和端口,并做集群负载均衡。
官网说用 lb://lakerservice 形式即可,但是配置完成后,并未生效。这个官网没有详细说明,查资料也没有,最后发现必须加入依赖:
Client ----> gateway ----> Ribbion负载均衡 取一个服务A ---->转发到服务A
Spring Cloud Ribbon 在高版本移除了
RouteRecordGlobalFilter 这个全局过滤器我们主要用来记录路由后的实际代理地址,以及调用耗时。我们看下RouteToRequestUrlFilter的描述会发现实际路由地址会通过ServerWebExchange中名为 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR 的属性保存。
gateway中的自动配置类GatewayLoadBalancerClientAutoConfiguration。
该自动配置类需要在RibbonAutoConfiguration自动配置类之后执行,该类是 spring-cloud-netflix-ribbon 的自动配置类,因此需要引入下面的jar包依赖
使用默认的ribbon,则ribbon的配置如下
官网Spring Cloud LoadBalancer
Spring Cloud Load Balancer并不是一个独立的项目,而是spring-cloud-commons其中的一个模块,因此很多配置和类可以在spring-cloud-common中找到。gateway中的自动配置类GatewayReactiveLoadBalancerClientAutoConfiguration
Spring Cloud提供了自己的客户端负载均衡器抽象和实现。对于负载平衡机制,ReactiveLoadBalancer已添加了接口,并为其提供了基于Round-Robin和Random的实现。为了获得实例以从反应式中进行选择ServiceInstanceListSupplier 。当前,我们支持基于服务发现的实现,ServiceInstanceListSupplier 该实现使用类路径中可用的发现客户端从服务发现中检索可用实例。
引入依赖:
配置如下:
从配置文件中读取服务,而不是从服务注册中心自动发现服务
注意:如果在项目的类路径下存在Spring Cloud Ribbon相关的类,需要通过配置关闭Ribbon功能,因为Spring Cloud默认优先使用Ribbon,因此spring.cloud.loadbalancer.ribbon.enabled禁用调Ribbon,这也是上面刚提到过的。
官网SimpleDiscoveryClient
SimpleDiscoveryClient可以结合注册中心使用,也可以静态配置。如果在类路径中没有支持从注册中心发现服务的DiscoveryClient实例,则将使用SimpleDiscoveryClient实例,该实例使用SimpleDiscoveryProperties来获取有关服务和实例的信息。参考上面的配置文件中的配置。
SimpleDiscoveryProperties 服务实例的属性配置
DefaultServiceInstance默认的服务实例定义
ReactiveLoadBalancer默认情况下使用的实现是RoundRobinLoadBalancer。要针对选定的服务或所有服务切换到不同的实现,可以使用自定义LoadBalancer配置机制。例如,可以通过@LoadBalancerClient注释传递以下配置以切换为使用RandomLoadBalancer:
Instance Health-Check for LoadBalancer官网
可以为LoadBalancer启用计划健康检查。为此提供了HealthCheckServiceInstanceListSupplier。它定期验证委托ServiceInstanceListSupplier提供的实例是否仍然存在,并且只返回健康的实例,除非没有实例—然后返回所有检索到的实例。
在使用SimpleDiscoveryClient时,这种机制特别有用。对于由实际服务注册中心支持的客户端,不需要使用它,因为我们在查询外部ServiceDiscovery之后已经获得了健康的实例。
对于每个服务只有少量实例的设置,也建议使用此供应商,以避免重试调用失败的实例。
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
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()); }
以上是关于Spring Cloud Gateway负载均衡的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud Gateway——2020.x以上版本HTTP 503 或 NoLoadBalancer[负载均衡]解决方案
Spring Cloud Gateway——2020.x以上版本HTTP 503 或 NoLoadBalancer[负载均衡]解决方案
Spring Cloud Gateway——2020.x以上版本HTTP 503 或 NoLoadBalancer[负载均衡]解决方案