Ribbon負(fù)載均衡算法原理與使用介紹
負(fù)載均衡算法:rest接口第幾次請求數(shù) % 服務(wù)器集群總數(shù)量 = 實際調(diào)用服務(wù)器位置下標(biāo) ,每次服務(wù)重啟動后rest接口計數(shù)從1開始。
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
如:
List [0] instances = 127.0.0.1:8002
List [1] instances = 127.0.0.1:8001
8001+ 8002 組合成為集群,它們共計2臺機(jī)器,集群總數(shù)為2, 按照輪詢算法原理:
當(dāng)總請求數(shù)為1時: 1 % 2 =1 對應(yīng)下標(biāo)位置為1 ,則獲得服務(wù)地址為127.0.0.1:8001
當(dāng)總請求數(shù)位2時: 2 % 2 =0 對應(yīng)下標(biāo)位置為0 ,則獲得服務(wù)地址為127.0.0.1:8002
當(dāng)總請求數(shù)位3時: 3 % 2 =1 對應(yīng)下標(biāo)位置為1 ,則獲得服務(wù)地址為127.0.0.1:8001
當(dāng)總請求數(shù)位4時: 4 % 2 =0 對應(yīng)下標(biāo)位置為0 ,則獲得服務(wù)地址為127.0.0.1:8002
如此類推......
寫一個本地負(fù)載均衡器
設(shè)現(xiàn)在有倆個服務(wù)端口8001 8002幼由80端口調(diào)動
其中8001 8002 的controller中
@GetMapping(value = "/payment/lb") public String getPaymentLB() { return serverPort; }
80 的一個接口為:
public interface LoadBalancer { ServiceInstance instances(List<ServiceInstance> serviceInstances); }
實現(xiàn)類
@Component public class MyLB implements LoadBalancer { private AtomicInteger atomicInteger = new AtomicInteger(0); public final int getAndIncrement() { int current; int next; do { current = this.atomicInteger.get(); next = current >= 2147483647 ? 0 : current + 1; } while(!this.atomicInteger.compareAndSet(current, next)); System.out.println("*****next: "+next); return next; } @Override public ServiceInstance instances(List<ServiceInstance> serviceInstances) { int index = getAndIncrement() % serviceInstances.size(); return serviceInstances.get(index); } }
調(diào)用 方法
@Resource private RestTemplate restTemplate; //可以獲取注冊中心上的服務(wù)列表 @Resource private DiscoveryClient discoveryClient; @Resource private LoadBalancer loadBalancer; @GetMapping("/consumer/payment/lb") public String getPaymentLB() { List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE"); if(instances == null || instances.size()<=0) { return null; } ServiceInstance serviceInstance = loadBalancer.instances(instances); URI uri = serviceInstance.getUri(); return restTemplate.getForObject(uri+"/payment/lb",String.class); }
ApplicationContextBean去掉注解@LoadBalanced
到此這篇關(guān)于Ribbon負(fù)載均衡算法原理與使用介紹的文章就介紹到這了,更多相關(guān)Ribbon負(fù)載均衡內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring-core組件詳解——PropertyResolver屬性解決器
這篇文章主要介紹了spring-core組件詳解——PropertyResolver屬性解決器,需要的朋友可以參考下2016-05-05常用數(shù)字簽名算法RSA與DSA的Java程序內(nèi)實現(xiàn)示例
這篇文章主要介紹了常用數(shù)字簽名算法RSA與DSA的Java程序內(nèi)實現(xiàn)示例,一般來說DSA算法用于簽名的效率會比RSA要快,需要的朋友可以參考下2016-04-04java中BigDecimal的介紹及使用教程BigDecimal格式化及BigDecimal常見問題
BigDecimal是Java在java.math包中提供的線程安全的API類,用來對超過16位有效位的數(shù)進(jìn)行精確的運(yùn)算,這篇文章主要介紹了java中BigDecimal的介紹及使用,BigDecimal格式化,BigDecimal常見問題,需要的朋友可以參考下2023-08-08