客户端负载均衡器
在SpringCloud中Ribbon负载均衡客户端,会从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地。然后在本地实现轮训负载均衡策略。
Ribbon本地负载均衡与Nginx服务器负载均衡区别
- Ribbon本地负载均衡,原理:在调用接口的时候,会在Eureka注册中心上获取注册中心服务列表,获取到之后,缓存到本地。然后本地实现rpc远程调用技术进行调用。是客户端实现负载均衡。
- Nginx是服务器实现负载均衡,客户端所有请求都会交给Nginx,然后再由Nginx实现转发请求。
- Ribbon本地负载均衡适用于微服务rpc远程调用,比如Dubbo、SpringCloud
- Nginx服务器负载均衡适用于针对服务器端,比如tomcat、jetty
原理
当订单服务需要调用会员服务接口的时候
1、先以会员服务别名(app_member)去注册中心上获取对应会员服务实际接口地址(List集合存放,因为可能是集群地址)
2、先获取请求总数和服务器总数量
3、总请求数%服务器数量得到实际下标服务器位置,例如:
List[0] value = 127.0.0.1:8000
List[1] value = 127.0.0.1:8001
然后本地实现rpc远程调用,调用会员服务即可。
@RestController
public class RibbonDemo {
// 可以获取注册中心上的服务列表
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
// 接口的请求总数
// 使用原子计数器 因为线程安全 效率非常高 使用cas 无锁机制
private AtomicInteger reqCount = new AtomicInteger(1);
//获得服务器地址
private String getServiceUrl() {
List<ServiceInstance> instances = discoveryClient.getInstances("eureka-member");
if (instances == null || instances.size() <= 0) {
return null;
}
// 获取服务器集群个数
int instanceSize = instances.size();
int serviceIndex = reqCount.get() % instanceSize;
reqCount.getAndIncrement();
return instances.get(serviceIndex).getUri().toString();
}
@RequestMapping("/ribbonMember")
public String ribbonMember() {
// 1.获取对应服务器远程调用地址
String instancesUrl = getServiceUrl() + "/getMember";
// 2.可以直接使用httpclient技术实现远程调用
String result = restTemplate.getForObject(instancesUrl, String.class);
return result;
}
}