Ribbon 负载均衡实现
创始人
2024-05-29 15:30:45
0

1. 依赖

org.springframework.cloudspring-cloud-starter-netflix-ribbon

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. 实现

@Configuration
public class MyLoadBalancerConfiguration {@Beanpublic IRule myLoadBalancingRule() {return new MyLoadBalancingRule();}private static class MyLoadBalancingRule extends AbstractLoadBalancerRule {private AtomicInteger nextServerCyclicCounter;public MyLoadBalancingRule() {nextServerCyclicCounter = new AtomicInteger(0);}@Overridepublic Server choose(Object key) {List 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. 发送请求

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

Ps

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

List allServers = getLoadBalancer().getAllServers();if (allServers.isEmpty()) {return null;
}int nextServerIndex = incrementAndGetModulo(allServers.size());
return allServers.get(nextServerIndex);

or

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;
}

相关内容

热门资讯

mapinfo 11破解序列号... 哎呀,今天真是气炸了!我这颗心啊,就像被猫抓了一样,七上八下的。你知道吗,我最近迷上了用MapInf...
进展性卒中时间节点-进展性卒中... 那天,我像往常一样醒来,却发现世界在我的左眼变得模糊。我以为只是疲劳,但很快,不仅仅是视线,我的左手...
polly wolly doo... 哎呀,说起《PollyWollyDoodle》这首歌,真是让人又笑又泪啊!这首歌,简单几句,就能把人...
胃病艾灸患者经验交流-艾灸真的... 哎呀,说到胃病,我这心里就五味杂陈的。你们知道吗,我这胃啊,就像个不听话的小孩,总是闹脾气。吃药、打...
gta5盗版怎么安装-GTA5... 哎呀,说到GTA5盗版安装,我这心情真是五味杂陈啊!首先,我得说,盗版这事儿,不是啥光彩的活儿。但既...
windows linux文件... 哎呀,说到Windows和Linux的文件系统,真是让人头大!你知道吗,这两个操作系统在文件管理上简...
windows pe iso下... 哎呀,说到WindowsPEISO下载,真是让人头疼!你知道吗,有时候电脑出问题了,急得像热锅上的蚂...
范聪聪的身份证号码-范聪聪身份... 你知道范聪聪的身份证号码吗?那串看似普通的数字,背后藏着多少不为人知的故事!每当我想起那串数字,心里...
万家乐燃气热水器怎样-万家乐燃... 大家好,我是一个对生活品质有追求的普通家庭主妇。今天,我要跟大家聊聊我家那位默默无闻却又不可或缺的“...
电子地图是怎么绘制的-探索电子... 嗨,大家好!今天我要带你们一起探索一下那些我们每天都在用的电子地图,到底是怎样神奇地出现在我们的手机...
lol怎么不锁定视角-LOL ... 大家好,我是一个普通的LOL玩家,今天我想吐槽一下这个视角锁定的问题,真是让我每次玩都火大!每次我按...
duetwindows如何下载... 嘿,大家好!今天我要给大家讲讲我最近的一次超级激动人心的冒险——下载DuetWindows!这可不是...
win8系统如何安装pe-Wi... 哎呀,说到这个Win8系统安装PE,真是让我又爱又恨!你知道吗,每次电脑出了问题,我就像热锅上的蚂蚁...
苹果电脑系统卡-苹果电脑卡顿问... 哎哟喂,说到我的苹果电脑,真是让我又爱又恨啊!当初看它那光滑的外表,简洁的界面,还以为它能一直飞快飞...
智能云输入法官方下载-智能云输... 哎呀,说到这个智能云输入法,我可是真的忍不住要大喊一声:“爱了爱了!”每次打开手机,看到那枯燥的传统...
得力考勤机连接失败-得力考勤机... 哎呀,真是让人头大!今天早上一到公司,准备打卡上班,结果那台得力考勤机又开始闹脾气了,死活连不上!这...
小米数据恢复软件:丢失数据的救... 哎呀,真是急死人了!上周末我还兴高采烈地和朋友们出去玩,拍了好多照片,录了好多视频,结果一回家,手机...
net文件怎么打开-探索 Ne... 嘿,亲爱的数字探险家们!今天我们要一起探索一个神秘的领域——Net文件的世界。你们是不是也曾在电脑的...
win8软件限制策略-Win8... 哎呀,说到Win8的软件限制策略,我就一肚子火!你知道吗,这玩意儿有时候真是个“小霸王”,老是限制我...
windows 8.1 小马-... 哎呀,说到Windows8.1,我这心里就五味杂陈的,就像遇到了那个曾经让你心动不已却又不告而别的老...