Ribbon 负载均衡实现

news/2024/7/10 1:22:27 标签: ribbon, 负载均衡, java

1. 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

2. 配置

my-service:
  ribbon:
    listOfServers: example.com:8080, example.net:8080

常用配置项:
ribbon.eureka.enabled:指定是否启用Ribbon与Eureka服务器集成。默认为true。

ribbon.client.name:指定Ribbon客户端的名称。当使用Spring Cloud Netflix时,该值通常是服务名。

ribbon.NFLoadBalancerRuleClassName:指定负载均衡算法的类名。如果未指定,则使用默认的RoundRobinRule算法。

ribbon.ReadTimeout:指定读取超时时间,以毫秒为单位。如果在此时间内没有收到响应,则请求将被中断。

ribbon.ConnectTimeout:指定连接超时时间,以毫秒为单位。如果在此时间内无法建立连接,则请求将被中断。

ribbon.OkToRetryOnAllOperations:指定在发生故障时是否应重试所有操作。默认为false。

ribbon.MaxAutoRetries:指定自动重试操作的最大次数。默认为0,表示不进行自动重试。

ribbon.MaxAutoRetriesNextServer:指定在下一个服务器上进行自动重试的最大次数。默认为1。

ribbon.ServerListRefreshInterval:指定更新服务器列表的间隔时间,以毫秒为单位。

ribbon.ServerListRefreshInitialDelay:指定在第一次更新服务器列表之前的延迟时间,以毫秒为单位。

ribbon.ServerListClassName:指定服务器列表的实现类。如果未指定,则使用默认的ConfigurationBasedServerList实现。

ribbon.ServerListFilterClassName:指定用于筛选服务器列表的类的名称。如果未指定,则不应用任何过滤器。

ribbon.EnablePrimeConnections:指定是否启用Prime Connections。默认为false。

3. 实现

java">@Configuration
public class MyLoadBalancerConfiguration {
 
    @Bean
    public IRule myLoadBalancingRule() {
        return new MyLoadBalancingRule();
    }
 
    private static class MyLoadBalancingRule extends AbstractLoadBalancerRule {
 
        private AtomicInteger nextServerCyclicCounter;
 
        public MyLoadBalancingRule() {
            nextServerCyclicCounter = new AtomicInteger(0);
        }
 
        @Override
        public Server choose(Object key) {
            List<Server> allServers = getLoadBalancer().getAllServers();
 
            if (allServers.isEmpty()) {
                return null;
            }
 
            int nextServerIndex = incrementAndGetModulo(allServers.size());
            return allServers.get(nextServerIndex);
        }
 
        private int incrementAndGetModulo(int modulo) {
            int current;
            int next;
            do {
                current = nextServerCyclicCounter.get();
                next = (current + 1) % modulo;
            } while (!nextServerCyclicCounter.compareAndSet(current, next));
            return next;
        }
    }
}

4. 发送请求

java">@Service
public class MyService {
 
    @Autowired
    private RestTemplate restTemplate;
 
    public String callMyService() {
        String response = restTemplate.getForObject("http://my-service/path/to/resource", String.class);
        return response;
    }
}

Ps

其中的循环遍历可用代码的服务器列表的代码是

java">List<Server> allServers = getLoadBalancer().getAllServers();

if (allServers.isEmpty()) {
    return null;
}

int nextServerIndex = incrementAndGetModulo(allServers.size());
return allServers.get(nextServerIndex);

or

java">private AtomicInteger nextServerCyclicCounter;

public MyLoadBalancingRule() {
    nextServerCyclicCounter = new AtomicInteger(0);
}

private int incrementAndGetModulo(int modulo) {
    int current;
    int next;
    do {
        current = nextServerCyclicCounter.get();
        next = (current + 1) % modulo;
    } while (!nextServerCyclicCounter.compareAndSet(current, next));
    return next;
}

http://www.niftyadmin.cn/n/124726.html

相关文章

如何用R语言在生物群落生态学中的数据统计分析?

R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。本课程以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线&#xff0c;通过多个来…

第四章 opengl之变换

OpenGL齐次坐标(Homogeneous Coordinates)GLM坐标系统裁剪空间正射投影透视投影组合上述矩阵由2D->3D立体3D补充&#xff1a;Z缓冲很多立方体3D齐次坐标(Homogeneous Coordinates) 向量的w分量也叫齐次坐标。想要从齐次向量得到3D向量&#xff0c;我们可以把x、y和z坐标分别…

【VTK】VTK隐藏vtkOutputWindow窗口的正确方法

VTK隐藏vtkOutputWindow窗口 要求隐藏vtkOutputWindow窗口&#xff0c;但是不能把Warning警告和Error错误的信息都给屏蔽了 网上常见的错误方法&#xff1a; 现在百度搜索出来的方法几乎都是在这样做&#xff1a;在main文件中使用vtkOutputWindow::SetGlobalWarningDisplay(0…

vim-gvim使用教程

gvim和vim的区别&#xff1a; 和Word等富文本编辑器不同的是&#xff0c;vim编辑器的功能没有那么丰富&#xff0c;是贫文本编辑器&#xff0c;且一般应用于Linux环境下&#xff0c;但是由于做了一系列的优化和适配&#xff08;比如不断更新的快捷键、颜色语法标识等&#xff…

“大数据时代下的地理信息可视化:ECharts地图和数据面板实践“

数据可视化是一种数据分析技术&#xff0c;它通过将数据转化为图形或图表等可视化方式&#xff0c;以便更好地理解和解释数据。在实际应用中&#xff0c;数据可视化被广泛用于数据监控、业务分析、决策支持等领域。而ECharts是一款优秀的数据可视化工具&#xff0c;它具有丰富的…

【前缀和】截断数组、K倍区间、激光炸弹

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

33 openEuler使用LVM管理硬盘-管理逻辑卷

文章目录33 openEuler使用LVM管理硬盘-管理逻辑卷33.1 创建逻辑卷33.2 查看逻辑卷33.3 调整逻辑卷大小33.4 扩展逻辑卷33.5 收缩逻辑卷33.6 删除逻辑卷33 openEuler使用LVM管理硬盘-管理逻辑卷 33.1 创建逻辑卷 可在root权限下通过lvcreate命令创建逻辑卷。 # lvcreate [opt…

Win32:C++其实早已支持中文编程

我们以前学习C/C的时候&#xff0c;对于变量和标识符的命名都有如下规则&#xff1a; 变量名必须由字母、数字、下划线构成只能以字母、下划线开头 似乎对中文不太友善啊&#xff0c;于是后来出现了一些中文编程的呼声&#xff0c;甚至还真的出现了一些中文编程语言。 其实在…