学习spring cloud记录5-Ribbon负载均衡
前言
在上次记录中,后台调用的http://demo-user/demouser/user/test并不是一个直接可用的地址,Ribbon将其拦截拉取eureka的服务列表,然后选择其中一个地址进行请求。
负载均衡流程
当接口调用通过@LoadBalanced注解是,会进入RibbonLoadBalancerClient,向DynamicServerListLoadBalancer传服务的id(服务名),然后从eureka注册中心拉取服务列表,DynamicServerListLoadBalancer获取服务列表后通过IRule的策略选择一条返回给RibbonLoadBalancerClient,然后修改最初的url为ip和port的形式进行请求提供方。
负载均衡策略
内置负载均衡 | 规则描述 |
RoundRobinRule | 简单轮询服务列表。他是Ribbon默认的负载均衡规则。 |
AvailabilityFilteringRule |
对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,着他服务器就会被设置为“短路”状态。短路状态将持续30s,如果再次连接失败,短路的持续时间就会几何级的增加. (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了此规则将会被忽略。并发连接数上限,可以由客户端的<clientName><cllientConfigNameSpace>ActiveConnetionsLimit属性进行配置。 |
WeightedResponseTimeRule | 为每一个服务器授予一个权重值。服务器的响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。 |
ZoneAvoidanceRule(默认) | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房,一个机架等,然后对Zone里面的呢多个服务进行轮询 |
BestAvailableRule | 忽略那些短路的服务器,并选择并发数低的服务器。 |
RandomRule | 随机选择一个可用的服务器。 |
RetryRule | 重试机制的选择逻辑。 |
调整负载均衡的规则
代码实现
在代码中定义新的IRule,过程中发现IRule引入失败,需要在pom中添加以下依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.netflix.ribbon/ribbon -->
<dependency>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon</artifactId>
<version>2.7.18</version>
</dependency>
如果将默认策略设置为随机策略,则在启动类中完成以下代码:
@Bean
public IRule randomRule(){
return new RandomRule();
}
这种方案作用于全局
配置文件实现
在application中配置如下:
demo-user: #服务名
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #策略
然后将启动类的代码注释,重启order服务,当调用接口是报错java.lang.NoSuchMethodError,因为之前IRule没有引入成功,所以在pom中另外引用了ribbon依赖,所以现在在匹配配置文件时出现冲突,此时代码不需要此依赖,将上方的依赖删除即可成功。
这种方案作用域单独的服务。
饥饿加载
Ribbon默认采用懒加载,即第一次访问时创建LoadBalanceClient,请求时间过长。
饥饿加载会在项目启动时创建,降低第一次访问的耗时,通过以下配置开启饥饿加载:
ribbon:
eager-load:
enabled: true
clients:
- demo-user
结语
配置可能不生效,因为依赖引不进来
和springboot以及cloud版本有关,可以试试这对版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
<relativePath/>
</parent>
...
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR10</version>
<type>pom</type>
<scope>import</scope>
</dependency>
学习spring cloud记录5-Ribbon负载均衡的更多相关文章
- Spring Cloud微服务Ribbon负载均衡/Zuul网关使用
客户端负载均衡,当服务节点出现问题时进行调节或是在正常情况下进行 服务调度.所谓的负载均衡,就是当服务提供的数量和调用方对服务进行 取舍的调节问题,在spring cloud中是通过Ribbon来解决 ...
- spring cloud: zuul(三): ribbon负载均衡配置
zuul的routes配置下path/url组合不支持负载均衡 下面介绍zuul的routes配置下的path/serviceId负载均衡配置 spring-boot-user微服务开启了:7901, ...
- 使用 Spring Cloud LoadBalancer 实现客户端负载均衡
使用 Spring Cloud LoadBalancer 实现客户端负载均衡 作者:Grey 原文地址: 博客园:使用 Spring Cloud LoadBalancer 实现客户端负载均衡 CSDN ...
- Spring Cloud 客服端负载均衡 Ribbon
一.简介 Spring Cloud Ribbon 是一个基于Http和TCP的客服端负载均衡工具,它是基于Netflix Ribbon实现的.它不像服务注册中心.配置中心.API网关那样独立部署, ...
- SpringCloud学习笔记(2):使用Ribbon负载均衡
简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具,在注册中心对Ribbon客户端进行注册后,Ribbon可以基于某种负载均衡算法,如轮询(默认 ...
- SpringCloud的入门学习之概念理解、Ribbon负载均衡入门
1.Ribbon负载均衡,Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端.负载均衡的工具. 答:简单的说,Ribbon是Netflix发布的开源项目,主要功能 ...
- spring cloud学习笔记三 Feign与Ribbon负载均衡的区别
一.Feign的介绍 Feign一般比较书面的解释是:Feign是一个声明式的WebService客户端,使用Feign编写的WebService客户端更加简单,他的使用方法是定义一个接口,然后在上线 ...
- 2.【Spring Cloud Alibaba】实现负载均衡-Ribbon
负载均衡的两种方式 如何实现负载均衡 目前已经实现让A总能找到B,如何实现负载均衡 负载均衡的两种方式 服务器端负载均衡 客户端负载均衡 使用Ribbo实现负载均衡 Ribbon是什么 ==Netfl ...
- Spring Cloud ---- 服务消费与负载均衡(Rest + Ribbon )
上一篇主要写了基于Eurake的服务的注册,主要就是创建注册中心,创建服务者,将服务者注册到注册中心,完成服务的暴露.这一篇主要写服务的消费与服务消费的负载均衡. 服务的调用方式有两种,Rest + ...
- 4.Spring Cloud初相识--------Feign负载均衡
前言: 在上一节里,我们学习了ribbon的使用. 我们了解到ribbon是一个客户端负载均衡机制. 而我们今天要讲的Feign呢,也是一款客户端负载均衡机制. 或者这样说,Feign封装了ribbo ...
随机推荐
- 航天信息诺税通SAAS接口封装DLL
项目中需要对接航天信息的诺税通接口开具电子发票,为此将功能封装到了DLL中,其他项目也可以方便的引用. Delphi调用示例: 有需要可以和我联系:yzqnet(微信)
- C中输入输出
引入一个概念,对于计算机来说,外来数据都是输入,经过计算机处理的结果并进行显示的就是输出.在linux里面,一切都是文件,就连输入输出,都可以划归到"文件"一类,而为了管理这些文件 ...
- unity prefab
1.修改prefab原始资源某组件为enabled或disabled,实例如果起初和原始资源是一样的状态那么修改原始资源会作用到实例上,如果发现不一样那么原始资源的修改不会作用到实例上,而且以后都不会 ...
- jmeter返回值作为参数传给后面的步骤使用的方法
如,系统返回data 通过正则获取data后的数据,且名称定义为id 然后通过${id}的方式传参给需要使用的地方
- thinkphp里__PUBLIC__的使用
1.默认值 __PUBLIC__常量默认指向当前项目根目录下的pulic目录, 例如:www下有一个blog项目目录,blog下一般有application.Home.public.Thinkphp ...
- 数据库事务回滚:FastAPI中的存档与读档大法
title: 数据库事务回滚:FastAPI中的存档与读档大法 date: 2025/05/10 00:18:52 updated: 2025/05/10 00:18:52 author: cmdra ...
- 5个让你眼前一亮的JavaScript装饰器技巧
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- 第六章: SEO与交互指标
第6章: SEO与交互指标 在当今的SEO环境中,Google越来越重视用户交互指标,如页面停留时长.交互性能等.本章将深入探讨如何优化网页速度和用户交互体验,以提升SEO效果和用户满意度. 1. G ...
- 操作系统:Linux如何获取所有设备信息
本节了解下Linux是如何管理设备的,将从Linux如何组织设备开始,然后研究设备相关的数据结构,最后写一个Linux设备驱动实例. 感受一下Linux下的设备信息 Linux的设计哲学是一起皆是文件 ...
- RPC实战与核心原理之分布式环境下如何快速定位问题
分布式环境下如何快速定位 回顾 如何建立可靠的安全体系,关键点就是"鉴权",我们可以通过统一的鉴权服务动态生成秘钥,提高 RPC 调用的安全性. 分布式环境下定位问题有哪些困难 举 ...