spring cloud gateway自定义负载均衡, 优先转发到指定IP

这篇具有很好参考价值的文章主要介绍了spring cloud gateway自定义负载均衡, 优先转发到指定IP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

示例为优先将请求分配到指定IP, 如果指定IP没有服务, 则随机分配.

GatewayLoadBalancerConfiguration.java

挂载配置类, 可以通过@org.springframework.boot.autoconfigure.condition.ConditionalOnXXX或者@Profile注解或者@ComponentScan过滤等方式来配置是否启用

在任意一个@Configuration注解的类上配置均可

import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
import org.springframework.context.annotation.Configuration;

@Configuration
@LoadBalancerClients(defaultConfiguration = {LyLoadBalancerClientConfiguration.class})
public class GatewayLoadBalancerConfiguration {
}

LyLoadBalancerClientConfiguration.java

配置类, 用于配置自定义负载均衡策略

import kim.nzxy.gateway.loadbalance.IpPriorityLoadBalancer;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

/**
 * @author ly-chn
 */
public class LyLoadBalancerClientConfiguration {
    @Bean
    public ReactorLoadBalancer<ServiceInstance> customLoadBalancer(Environment environment,
                                                                   LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new IpPriorityLoadBalancer(name,
            loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class));
    }
}

IpPriorityLoadBalancer.java

自定义负载均衡实现方式, 如果请求头中包含client-ip, 并且某个服务注册地址匹配, 则转到此服务, 否则转发到随机一个服务, 参考: org.springframework.cloud.loadbalancer.core.RandomLoadBalancer

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.*;
import org.springframework.cloud.loadbalancer.core.NoopServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer;
import org.springframework.cloud.loadbalancer.core.SelectedInstanceCallback;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import reactor.core.publisher.Mono;

import java.util.List;
import java.util.Objects;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 优先匹配指定系统IP
 *
 * @author ly-chn
 */
@Slf4j
@AllArgsConstructor
public class IpPriorityLoadBalancer implements ReactorServiceInstanceLoadBalancer {

    private final String serviceId;
    private final ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;


    @Override
    public Mono<Response<ServiceInstance>> choose(Request request) {
        // 建议将"client-ip"设定为常量
        List<String> clientIpList = ((RequestDataContext) request.getContext()).getClientRequest().getHeaders().get("client-ip");
        String clientIp = CollectionUtils.isNotEmpty(clientIpList) ? clientIpList.get(0) : null;
        ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider.getIfAvailable(NoopServiceInstanceListSupplier::new);
        return supplier.get(request).next().map(serviceInstances -> processInstanceResponse(supplier, serviceInstances, clientIp));
    }

    private Response<ServiceInstance> processInstanceResponse(ServiceInstanceListSupplier supplier,
                                                              List<ServiceInstance> serviceInstances, String clientIp) {
        Response<ServiceInstance> serviceInstanceResponse = getInstanceResponse(serviceInstances, clientIp);
        if (supplier instanceof SelectedInstanceCallback && serviceInstanceResponse.hasServer()) {
            ((SelectedInstanceCallback) supplier).selectedServiceInstance(serviceInstanceResponse.getServer());
        }
        return serviceInstanceResponse;
    }

    private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances, String clientIp) {
        if (instances.isEmpty()) {
            if (log.isWarnEnabled()) {
                log.warn("No servers available for service: " + serviceId);
            }
            return new EmptyResponse();
        }
        if (StringUtils.isEmpty(clientIp)) {
            return new DefaultResponse(instances.get(ThreadLocalRandom.current().nextInt(instances.size())));
        }
        for (ServiceInstance instance : instances) {
            if (Objects.equals(clientIp, instance.getHost())) {
                return new DefaultResponse(instance);
            }
        }
        return new DefaultResponse(instances.get(ThreadLocalRandom.current().nextInt(instances.size())));
    }

}

前端使用时:

GET http://网关IP:网关端口/目标资源
client-ip: 192.168.1.168

此时请求将优先转发到192.168.1.168上文章来源地址https://www.toymoban.com/news/detail-728081.html

到了这里,关于spring cloud gateway自定义负载均衡, 优先转发到指定IP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nacos 自定义负载均衡,优先使用同IP服务(本地服务优先调用)

    在微服务开发过程中,随着微服务数量越来越多,不可能将所有的微服务都在本地启用然后进行调试。最好的方式是需要调试那个服务就启动那个服务,所有的服务都使用开发Nacos,本地需要搭建nacos。 使用nacos在开发微服务的过程中,如果多人同时开发使用同一台服务就会导

    2024年01月19日
    浏览(44)
  • 三分钟了解Spring Cloud Gateway路由转发之自动路由

    大家好,我是冰点,今天和大家分享一下关于Spring Cloud Gateway 利用服务注册与发现实现自动路由的原理和源码解读。希望对大家有所帮助。 今天有个新同学,问我 为什么我们的网关服务Spring Cloud Gateway,没有配置路由就可以将请求到路由服务 ,说他们之前的项目的网关是将

    2024年02月08日
    浏览(36)
  • Spring Cloud Ribbon:负载均衡

    1. 介绍 Spring Cloud Ribbon 1.1 什么是 Spring Cloud Ribbon Spring Cloud Ribbon是Netflix开源的负载均衡器,它为分布式服务提供了客户端负载均衡的功能。Ribbon可以根据一系列的负载均衡算法和配置策略,将客户端的请求动态分发到多个服务实例上,以实现高可用性和性能优化。 1.2 负载均

    2024年02月19日
    浏览(43)
  • 【Spring Cloud 四】Ribbon负载均衡

    【Spring Cloud一】微服务基本知识 【Spring Cloud 三】Eureka服务注册与服务发现 目前公司项目使用的注册中心主要是Spring Cloud Alibaba的Nacos做的注册中心和配置中心。并且Nacos使用了Ribbon作为默认的负载均衡器。但是相当于将Ribbon的负载均衡给透明化了,日常开发明面上是看不到

    2024年02月14日
    浏览(50)
  • Spring Cloud - Ribbon 负载均衡原理、负载策略、懒加载

    目录 ​编辑 一、Ribbon 负载均衡原理 1.1、前言 1.2、负载均衡的工作流程 二、负载均衡策略 2.1、策略原理 2.2、负载均衡自定义方式 三、Ribbon 加载方式 ps:案例是上一章所讲的 “根据订单id查询订单的同时,把订单所属的用户信息一起返回”  。 上一章我们讲到 order-servi

    2024年02月09日
    浏览(37)
  • 聊聊spring-cloud的负载均衡

    在微服务架构中,负载均衡是非常重要的一个环节,可以有效地提高系统的可用性和稳定性。在Spring Cloud中,提供了多种负载均衡组件和算法,本文将详细介绍如何减少负载均衡对系统性能的影响。 在选择负载均衡算法时,需要根据实际情况进行选择。常用的负载均衡算法有

    2024年02月16日
    浏览(31)
  • Spring cloud负载均衡 @LoadBalanced注解原理

    接上一篇文章,案例代码也在上一篇文章的基础上。 在上一篇文章的案例中,我们创建了作为Eureka server的Eureka注册中心服务、作为Eureka client的userservice、orderservice。 orderservice引入RestTemplate,加入了@LoadBalanced注解,代码如下: 从而,我们实现了基于Eureka注册中心的微服务治

    2024年02月05日
    浏览(47)
  • Spring Cloud中的服务路由与负载均衡

    本文将讨论Spring Cloud中的服务路由问题,包括服务发现、服务注册、服务消费、服务提供以及服务路由实现。 在微服务架构中往往需要根据服务名来调用服务。此时服务发现就变得非常重要。在Spring Cloud中可以通过在 pom.xml 文件中引入 spring-cloud-starter-netflix-eureka-server 依赖来

    2024年02月06日
    浏览(39)
  • Spring Cloud LoadBalancer 负载均衡策略与缓存机制

    目录 1. 什么是 LoadBalancer ? 2. 负载均衡策略的分类 2.1 常见的负载均衡策略 3. 为什么要学习 Spring Cloud Balancer ? 4. Spring Cloud LoadBalancer 内置的两种负载均衡策略 4.1 轮询负载均衡策略(默认的) 4.2 随机负载均衡策略 4.2.1 创建随机负载均衡策略  4.2.2 设置随机负载均衡策略

    2024年01月21日
    浏览(55)
  • Spring Cloud之负载均衡与服务调用(Ribbon)

    目录 Ribbon 简介 负载均衡 简介 负载均衡方式 服务端负载均衡 工作原理 特点 客户端负载均衡 工作原理 特点 对比 实现 负载均衡策略 切换负载均衡策略 定制负载均衡策略 超时与重试 单个服务配置 全局配置 服务调用 示例         Ribbon 是 Netflix 公司发布的开源组件,其

    2024年02月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包