基础概念
1.Ribbon概念
Ribbon就是负载均衡的工具,工作的时候需要与restTemplate配合使用。其本质就是restTemplate + 负载均衡。
2.负载均衡
- 击中式负载均衡
- 进程内负载均衡
3.Ribbon本地负载均衡客户端VS Nginx服务端负载均衡区别
Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。
Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。
4.它的负载均衡的默认方式是轮询
5.Ribbon架构图
Ribbon在工作时分成两步
第一步先选择EurekaServer ,它优先选择在同一个区域内负载较少的server.
第二步再根据用户指定的策略(轮询,随机等),在从server取到的服务注册列表中选择一个地址。
其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权。
Ribbon的使用
引入了eureka client后它会自动引入Ribbon的依赖
默认是轮询,添加注解@LoadBalanced后就可以使用Ribbon默认的轮询算法:
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
Ribbon自带的负载均衡算法:
如果我们需要自己拓展的话,就实现IRule接口
public interface IRule {
Server choose(Object var1);
void setLoadBalancer(ILoadBalancer var1);
ILoadBalancer getLoadBalancer();
}
需要注意的是@SpringBootApplication注解里面带有@ComponentScan会扫描当前类所在的包及这个包的子包。官方说不能放到启动类和启动类的所在包的子包所以我们需要建一个包, 与启动类包平级。
添加配置类
@Configuration
public class SelfRule {
@Bean
public IRule myRule() {
return new RandomRule();
}
}
然后在主启动类添加注解:
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = SelfRule.class)
拓展知识
负载均衡算法的原理:
rest接口第几次请求参数%服务器集群总数量 = 实际调用服务器下标位置,每次服务重新启动后reset接口计数从1开始。所以先查询服务的list然后取余取出相应的算法。
附带上源码:
RoundRobinRule.class
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;
}
以上部分代码和图片来源于尚硅谷视频教学