SpringCloud微服务(九)——Ribbon负载均衡
创始人
2024-02-09 20:55:59

Ribbon负载均衡服务调用

SpringCloud 已停更

github官网:https://github.com/netflix/ribbon

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon实现的工具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要。
Load Balancer(LB)负载均衡,简单轮询、随机连接。

Load Balancer(LB)负载均衡:服务端,集中式LB(服务消费方和提供方之间使用独立的LB设施),将用户的请求平摊的分配到多个服务,实现高可用(HA)。软件nginx,LVS,硬件F5等。

Ribbon本地负载均衡:客户端,进程式LB(多个客户端),在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

依赖

原依赖:

com.netflix.ribbonribbon

eureka client默认有ribbon依赖


org.springframework.cloudspring-cloud-starter-netflix-eureka-client

默认使用

消费者调用服务提供者集群

消费者注入或者启动类注入

@Configuration
public class ApplicationContextConfig {@Bean@LoadBalanced //默认轮询负载均衡public RestTemplate restTemplate() {return new RestTemplate();}
}

使用RestTemplate远程RPC调用。服务提供者默认轮询被访问。

自定义负载均衡算法

Ribbon核心组件IRule,负载均衡算法

在这里插入图片描述

负载规则替换,注意,不能与主启动类在同一个包下!

作用是替换ribbon负载均衡规则

另创建包

package com.wzq.myrule;import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RoundRobinRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 自定义负载均衡路由规则类** @author zzyy* @date 2020/3/6 15:15**/
@Configuration
public class MySelfRule {@Beanpublic IRule myRule() {// 定义为随机return new RandomRule();}}

主启动类添加注释:

@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)

7种负载均衡算法,默认轮询。直接return 算法名字。

在这里插入图片描述

轮询算法原理

rest接口第几次请求次数 % 服务器集群总数量 = 实际调用服务器位置下标,每次服务器重启后,rest接口计数从1开始。

// 服务发现获取服务实例
List instances = discoveryClient.geInstance("CLOUD-PAYMENT-SERVICE");int index = rest接口第几次请求次数 % 服务器集群总数量
// 该请求次数的服务
List

源码:

public RoundRobinRule() {this.nextServerCyclicCounter = new AtomicInteger(0);
}private int incrementAndGetModulo(int modulo) {int current;int next;do {current = this.nextServerCyclicCounter.get();next = (current + 1) % modulo;} while(!this.nextServerCyclicCounter.compareAndSet(current, next));return next;
}//compareAndSet比较错误就换值,CAS
//nextServerCyclicCounter默认0,compareAndSet(期望值,交换值)
//默认值是期望值则不变true,不然变为交换值false

手写一个负载的算法CAS+自旋锁

首先提供者8001、8002服务controller层加上

@GetMapping("/payment/lb")
public String getPaymentLB() {return SERVER_PORT;
}

LoadBalancer接口:

import org.springframework.cloud.client.ServiceInstance;
import java.util.List;/*** @InterfaceName: LoadBalancer* @description:* @author: WZQ* @create: 2020/3/7 15:55**/
public interface LoadBalancer {ServiceInstance instances(List serviceInstances);
}

实现类:

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Component;import java.sql.SQLOutput;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;/*** @ClassName: MyLB* @description:* @author: XZQ* @create: 2020/3/7 15:55**/
@Component
public class MyLB implements LoadBalancer {private AtomicInteger atomicInteger = new AtomicInteger(0);private final int getAndIncrement() {int current;int next;do {current = this.atomicInteger.get();next = current >= Integer.MAX_VALUE ? 0 : current + 1;//当前服务索引//compareAndSet比较,原值是current,则true,否则atomicInteger=next,false} while (!atomicInteger.compareAndSet(current, next));System.out.println("第几次访问,次数next:" + next);return next;
}@Overridepublic ServiceInstance instances(List serviceInstances) {int index = getAndIncrement() % serviceInstances.size();return serviceInstances.get(index);}
}

controller类中添加:

@GetMapping("/consumer/payment/lb")
public String getPaymentLB() {//获取服务实例数List 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);}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...