SpringCloudAlibaba基础分享(三)

56 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

image.png

调用微服务中使用了,负载均衡轮训算法

从注册中心获取到的服务集群列表中,选择一个

策略模式

轮训算法:访问次数%2

1%2=1

2%2=0

3%2=1

访问次数取余,只能会有0,1的两种可能,轮训变化,利用原子类AtomicInteger计数,取余服务集合的size()个数,每次atomicInteger加一,个数不变,就形成了轮训的效果。

image.png 微服务中注册中心:管理我们服务接口地址,从而能够实现都动态的调用。

本地负载均衡器

什么是本地负载均衡器:我们的消费者从我们的注册中心上获取接口调用地址列表,本地实现负载均衡算法(轮训、随机、hash一致性、权重)等

原理:获取接口地址列表,采用算法获取选择一个接口地址地址实现本地rpc远程调用。

本地负载均衡器有那些:自己写,ribbon(第一代)、loadbalancer(第二代)

如何进行选择?

SpringCloud Rest或者Openfeign都是默认ribbon

本地负载均衡器与Nginx实现负载均衡器有那些区别呢?

Nginx属于服务器负载均衡器,客户端所有的请求都统一交给我们的Nginx,在由我们的nginx转发到我们的真实服务实现负载均衡。

本地负载均衡器:属于客户端负载均衡。

Nginx实现负载均衡与本地负载均衡器应用场景?

Nginx实现对我们服务器实现负载均衡器 一般用于tomcat/jetty服务器。

本地负载均衡器属于客户端负载均衡器 一般用于微服务rpc远程调用 比如dubbo、rest模版、openfeign或者rpc远程调用框架。

加上@LoadBalanced注解就可以实现本地负载均衡

SpringCloud rest或者openfeign客户端默认都是ribbon实现调用。

@loadbalancer实际上是我们的springcloud自己写。

/**
 * Annotation to mark a RestTemplate bean to be configured 
 * to use a LoadBalancerClient
 * @author Spencer Gibb
 */
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {
}

loadBalancerClientSpringCloud 根据服务id获取负载均衡器rpc地址,获取到负载均衡的结果。

ServiceInstance choose = loadBalancerClient.choose("nacos-member");

ribbon实现的loadBalancerClient接口