SpringCloud Ribbon是Netfix Ribbon实现的一套客户端 负载均衡的工具。
(负载均衡+RestTemplate调用)
Ribbon 是Netfilx发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。(目前进入了维护模式)
Load Balance(LB)负载均衡:
可以理解为将用户的请求平均分配到多个服务上,从而达到高可用(HA),常见的负载均衡有软件Nginx,LVS,硬件F5等。
LB:
集中式LB:
服务的消费方和提供方之间使用独立的LB设施(可以是硬件,F5,也可以是软件 ,Nginx),通过该设施负责把访问请求通过某种策略转发至服务的提供方
进程内LB:
将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取服务方提供的地址。
eg:看病,选择医院(集中式lB),选择合适医院后,选择科室内的医生(进程内LB)
Ribbon本地负载均衡客户端VS Nginx服务端负载均衡区别
Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡 是由服务端实现的。
Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。
Ribbon在工作的时候分为两步:
1.选择EurekaServer,它优先选择在同一个区域内负载较少的server
2.根据用户指定策略,再从server取到注册列表,在从中选择一个地址
Ribbon的核心组件IRule:根据特定算法中从服务列表中选取一个要访问的服务:
Ribbon自带服务策略有:
1.RoundRobinRule:轮询(默认)
2.RandomRule:随机
3.RetryRule:重试,先按照轮询的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务
4.WeightedResponseTimeRule:对轮询的扩展,响应速度越快的实例选择权重越大,越容易被选择
5.BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
6.AvailabilityFilteringRule:先过滤掉故障实例,然后选择并发较小的实例
7.ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器
Ribbon负载规则替换:
1.自定义配置类
package com.gods.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();//定义为随机
}
}
注:不可以放在@ComponentScan所扫描的当前包下以及子包下,否则这个自定义配置类就会被所有的Ribbon客户端共享,达不到为指定的Ribbon定制配置,而@SpringBootApplication注解里就有@ComponentScan注解,所以不可以放在主启动类所在的包下。(因为Ribbon是客户端(消费者)这边的,所以Ribbon的自定义配置类是在客户端(消费者)添加,不需要在提供者或注册中心添加)
企业微信截图_16310002776494.png
2.启动类
添加@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)
package com.gods.springcloud;
import com.gods.myrule.MyselfRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MyselfRule.class)
//name为指定的服务名(服务名必须与注册中心显示的服务名大小写一致)
//configuration为指定服务使用自定义配置(自定义负载均衡机制)
public class order80 {
public static void main(String[] args) {
SpringApplication.run(order80.class,args);
}
}
网友评论