前言

在微服务中,一个服务可能即是服务端也是客户端,当别的服务调用该服务的时候这个服务就是服务端,当这个服务主动调用另外一个服务的时候,那么就是服务端。

作为客户端通过服务注册与发现获取某个服务的注册列表后,那么如何均衡负载呢?前面我们提及到了,那么eureka客户端中自带了均衡负载策略,这个均衡负载组件就是ribbon。

为什么需要一个独立组件来均衡负载呢?一个是均衡负载的算法有很多,比如说轮询算法,但是通用轮询算法也有问题,比如说两台不同量级的机器,如果分配同等的工作量,那么有一个满了,另外一台还是空闲很多。

这里介绍一个ribbon客户端均衡负载的组件,其他的也一样,看文档就好。

正文

首先引入包:

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

然后再订单模块中加入一个请求。

@GetMapping("/consumer/payment/getForEntity/{id}")
public CommonResult<Payment> getPayment2(@PathVariable("id") Long id){
ResponseEntity<CommonResult> entity = restTemplate.getForEntity(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
if (entity.getStatusCode().is2xxSuccessful()){
return entity.getBody();
}else{
return new CommonResult<>(444,"error request for payment");
}
}

然后调用一下:

两次请求都不一样。这里是效果。

查看结构图ribbon 结构图:

从上图可以看出ribbon 有7种方式进行负载均衡方式。

如果是网上有详细介绍的,一般不自己写,这里贴一下别人写好的:

https://blog.csdn.net/whiteBearClimb/article/details/108703356

我们可以根据不同场景进行选择,这些都是看情况讨论。

比如说,4台机器的响应速度和配置都差不多,那么轮询就好,这样开销小,如果是不同,那么可以考虑其他的方式来更大的利用资源。

那么如何替换规则:

自定义一个类:

package myrule;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class MySelfRule {
@Bean
public IRule myRule(){
return new RandomRule();
}
}

然后在启动类上进行声明:

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

效果:两次访问都是8001,随机访问任意一台。

那么这个RibbonClient 是如何实现的呢?

这里直接说原理:RibbonClient 会直接读取eureka的该服务的注册表,通过服务的注册表来实现均衡负载。

打开类继承关系:

在右边找到RoundRobinRule这个,然后就可以看到具体轮询的实现了。

public Server choose(ILoadBalancer lb, Object key) {
if (lb == null) {
log.warn("no load balancer");
return null;
} Server server = null;
int count = 0;
while (server == null && count++ < 10) {
// 获取有效服务
List<Server> reachableServers = lb.getReachableServers();
// 获取全部服务
List<Server> allServers = lb.getAllServers();
int upCount = reachableServers.size();
int serverCount = allServers.size();
// 有效服务为0返回null
if ((upCount == 0) || (serverCount == 0)) {
log.warn("No up servers available from load balancer: " + lb);
return null;
}
// 通过全部服务获取下一个服务
int nextServerIndex = incrementAndGetModulo(serverCount);
server = allServers.get(nextServerIndex); if (server == null) {
/* Transient. */
Thread.yield();
continue;
} if (server.isAlive() && (server.isReadyToServe())) {
return (server);
} // Next.
server = null;
} if (count >= 10) {
log.warn("No available alive servers after 10 tries from load balancer: "
+ lb);
}
return server;
}

实现选择,直接看choose,里面我注释了一部分。

可以看到选择哪个服务其实是通过incrementAndGetModulo 这个方法来选择的。

private int incrementAndGetModulo(int modulo) {
for (;;) {
// 获取当前的值
int current = nextServerCyclicCounter.get();
// 计算获得新的索引
int next = (current + 1) % modulo;
// 更新新的索引
if (nextServerCyclicCounter.compareAndSet(current, next))
return next;
}
}

nextServerCyclicCounter 是new AtomicInteger(0); 这个的实例。

AtomicInteger 是一个原子操作类,至于其原理需要自己去看,效果是原子操作,就是在并发的时候依然可以保持其本来的面目,故而原子。

上面的注释应该很清楚了。原理还是比较简单的。

通过了解上面的选择方式,那么可以自己去实现对应的接口和写相应的code来实现自己特殊业务需要的均衡负载方式。

spring cloud 学习笔记 客户端(本地)均衡负载(三)的更多相关文章

  1. spring cloud学习笔记二 ribbon负载均衡

    Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为.为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求.Ribb ...

  2. Spring Cloud学习笔记【九】配置中心Spring Cloud Config

    Spring Cloud Config 是 Spring Cloud 团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端 ...

  3. spring cloud学习笔记三 Feign与Ribbon负载均衡的区别

    一.Feign的介绍 Feign一般比较书面的解释是:Feign是一个声明式的WebService客户端,使用Feign编写的WebService客户端更加简单,他的使用方法是定义一个接口,然后在上线 ...

  4. Spring Cloud 学习笔记(二)——Netflix

    4 Spring Cloud Netflix Spring Cloud 通过自动配置和绑定到Spring环境和其他Spring编程模型惯例,为Spring Boot应用程序提供Netflix OSS集 ...

  5. Spring Cloud 学习笔记(一)——入门、特征、配置

    [TOC] 0 放在前面 0.1 参考文档 http://cloud.spring.io/spring-cloud-static/Brixton.SR7/ https://springcloud.cc ...

  6. Spring Cloud学习笔记-005

    服务消费者 之前已经搭建好了微服务中的核心组件——服务注册中心(包括单节点模式和高可用模式).也有了服务提供者,接下来搭建一个服务消费者,它主要完成两个目标,发现服务以及消费服务.其中,服务发现的任务 ...

  7. Spring Cloud学习笔记-009

    API网关服务:Spring Cloud Zuul API网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的Façade模式,它的存在就像是整个微服务架构系统的门面一样,所有的外部客户 ...

  8. Spring Cloud学习笔记-011

    分布式配置中心:安全保护 由于配置中心存储的内容比较敏感,做一定的安全处理是必需的.为配置中心实现安全保护的方式有很多,比如物理网络限制.OAuth2授权等.由于微服务应用和配置中心都构建与Sprin ...

  9. Spring Cloud 学习笔记 (一)-- Eureka 服务器

    开局一张图,截取了本人学习资料中的一张图,很好地展示了Eureka的架构. Eureka服务器 管理服务的作用.细分为服务注册,服务发现. 所有的客户端在Eureka服务器上注册服务,再从Eureka ...

  10. Spring Cloud学习笔记-010

    分布式配置中心:Spring Cloud Config Spring Cloud Config是Spring Cloud团队创建的一个全新的项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外 ...

随机推荐

  1. JS-1基本语法

    初识JavaScript JavaScript是一种运行在客户端的脚本语言 脚本语言:不需要编译,运行过程中由js解释器(js引擎)逐行来进行解释并执行 现在也可以基于Node.js技术进行服务器编程 ...

  2. [学习笔记]Linux + Nginx环境下部署 Web 站点

    ​部署后端程序,请阅读: [学习笔记]Linux环境下部署 .Net5 程序 - 林晓lx - 博客园 (cnblogs.com) 打包项目 以Vue项目为例,首先打包站点,前往项目的根目录并键入: ...

  3. gap 单词学习 对标 open

    为什么gap 和 open 联系记忆呢? gap是从行为动作中来 open 中 op 就是 up,是从 单词字母的角度来 但是 本意 这两个单词都差不多 gap gap : 来自PIE*ghai,打呵 ...

  4. 告别繁琐!1分钟带你构建RabbitMQ消息应用

    支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac. RabbitMQ作为一款主流的消息队列工具早已广受欢迎.相比于其它的 ...

  5. Java基础知识篇01——Java基本介绍

    一.什么是 Java Java 是 Sun Microsystems 于 1995 年首次发布的一种编程语言和计算平台.编程语言还是比较好理解的,什么是计算平台呢? 计算平台是电脑中运行应用程序(软件 ...

  6. 高校刮起元宇宙风!3DCAT实时云渲染助力川轻化元校园建设

    元宇宙,是一个虚拟的网络世界,它与现实世界相互连接,为人们提供了一个身临其境的数字体验.元宇宙的概念并不新鲜,早在上个世纪就有科幻作家和电影导演对它进行了想象和创造.但是,随着科技的发展,特别是5G. ...

  7. 虚拟现实(VR)在医疗保健中的5种应用

    医疗保健中的VR虚拟现实 虚拟现实的由来已久,18世纪,法国的医生使用布制的分娩模拟器向助产师和外科医生教授医学技术.在20世纪60年代初,医生一边对心肺复苏学员口述心肺复苏的技巧,一边使用一家塑料玩 ...

  8. 在LabVIEW中编程运行可执行程序

    以下文字来自于 https://knowledge.ni.com/KnowledgeArticleDetails?id=kA03q000000YGhVCAW&l=en-US 翻译来自于Chat ...

  9. Linux_Centos 增加中文字体支持

    宋体黑体为例 1.安装字体库 在CentOS 4.x开始用fontconfig来安装字体库,所以输入以下命令即可: sudo yum -y install fontconfig 这时在/usr/sha ...

  10. [MySQL]流程控制语句

    [版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/17991087 出自[进步*于辰的博客] 参考笔记三,P ...