Ribbon使用
-
简介
-
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套 客户端 负载均衡的工具 。
主要功能:提供客户端的软件负载均衡算法和服务调用。 Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
-
作用
一句话就是负载均衡+RestTemplate调用
-
LB(负载均衡)
-
集中式LB:
在服务的消费方和提供方之间使用的独立LB设施(可以是硬件,如F5,也可以是软件,如nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方
-
进程内LB:
将LB逻辑集成到消费方,消费方通过服务注册中心获知哪些地址可用,然后自己再从这些地址中选出一个合适的服务器。
Ribbon属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来回去服务提供方的地址
-
区别:
Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。
Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术
-
-
架构说明
-
Ribbon
负载均衡流程
-
RestTemplata使用
-
ForObejct和ForEntity区别
ForObject:返回对象为响应体中数据转为对象,可以理解为Json
ForEntity:返回对象为ResponseEntity对象,包含响应中一些重要信息,比如响应头,响应状态码,响应体等
-
项目使用
-
引入pom
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
<b>因为spring-cloud-starter-netflix-eureka-client等组件中自带Ribbon所以使用中应查看已引入组件是否保函Ribbon避免重复引入或冲突</b>
-
-
改变负载规则
-
核心组件
IRule
-
-
七大负载规则
- com.netflix.loadbalancer.RoundRobinRule 轮询
- com.netflix.loadbalancer.RandomRule 随机
- com.netflix.loadbalancer.RetryRule 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务
- WeightedResponseTimeRule 对RoundRobinRule的扩展,响应速度越快的实例选择权重越大越容易被选择
- BestAvailableRule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
- AvailabilityFilteringRule 先过滤掉故障实例,再选择并发较小的实例
- ZoneAvoidanceRule 默认规则,复合判断server所在区域的性能和server的可用性选择服务器
-
替换负载规则 (注意注意这是H版本的不要搞错,后续的springcloud 2020版本eureka已经不再集成Ribbon
注意替换的负载规则的自定义配置类不能在@ComponentScan所扫描的当前包下一级其子包下,否则会被所有Ribbon客户端所共享,达不到特殊定制化的目的,(@SpringBootApplication注解中含有@ComponentScan,所以配置类不能在启动类的同一包下)
-
实例:(注意不能在@ComponentScan扫描包下)
@Configuration public class MySelfRule { @Bean public IRule myRule(){ return new RandomRule(); } }
@EnableEurekaClient @SpringBootApplication @RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class) public class OrderMain80 { public static void main(String[] args) { SpringApplication.run(OrderMain80.class,args); } }
-
还有在配置文件中指定服务的更改方式
-
<font color="red">注意:</font>在spingcloud 2020版本中Eureka starter已经不再集成Ribbon改为Loadbalancer所以新版本中不会再使用@RibbonClient(name = ,configuration = ) 以及@RibbonClients
使用@LoadBalancerClient来进行对@LoadBalanced的配置修改(详见帖子:https://blog.csdn.net/Curtain_show01/article/details/116838815)-
实现新版本负载均衡(改随机)
// 官方文档给出的意见是这个类不需要加上@Configuration public class CustomLoadBalancerConfiguration { @Bean ReactorLoadBalancer<ServiceInstance> randomLoadBalancer( Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){ String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new RandomLoadBalancer(loadBalancerClientFactory .getLazyProvider(name,ServiceInstanceListSupplier.class),name); } }
@Configuration @LoadBalancerClient(name = "CLOUD-PAYMENT-SERVICE",configuration = CustomLoadBalancerConfiguration.class) public class ApplicationContextConfig { @Bean @LoadBalanced //@LoadBalanced注解赋予RestTemplate负载均衡的能力 public RestTemplate getRestTemplate(){ return new RestTemplate(); }
@SpringBootApplication @EnableEurekaClient //以前的寻找服务方法在2020版本后会出现找不到服务问题 //@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class) public class OrderMain80 { public static void main(String[] args) { SpringApplication.run(OrderMain80.class,args); } }
-
饥饿加载
-
Ribbon默认采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长,而饥饿加载会在项目启动时创建降低第一次访问的耗时
ribbon: eager-load: enabled: true # 开启饥饿加载 clients: userservice # 指定对userservice这个服务饥饿加载 #clients: 如果是多个这么写 #- userservice #- systemservice
-