赞
踩
服务器端负载均衡Nginx
nginx是客户端所有请求统一交给nginx,由nginx进行实现负载均衡转发请求,属于服务器端负载均衡。
即请求有nginx服务器端进行转发
客户端负载均衡Ribbon
Ribbon是从eureka注册中心服务器端上获取服务注册信息列表,缓存在JVM本地,之后使用本地实现RPC远程调用技术进行调用。
即使客户端实现负载均衡
应用场景区别
1. Nginx服务器负载均衡,适合于针对与服务器端,比如Tomcat、jetty
2. Ribbon适合于在微服务中RPC远程调用实现本地服务负载均衡,比如Dubbo、SpringCloud
Ribbon(本地)客户端负载均衡器执行流程
当订单服务需要调用会员服务接口时,现在以会员别名(app_member)去注册中心上获取对应会员实际接口地址,订单服务获取到 地址之后,缓存到本地(JVM客户端),然后在本地实现远程的RPC调用
订单服务以会员别名获取对应的服务接口地址的时候,接口地址可能会是多个。存放采用List接口
本地客户端负载均衡指的,本地从eureka上获取对应信息列表,获取到信息列表之后,然后本地实现负载均衡
负载均衡的算法
List[0] value = 127.0.0.1:8000
List[1] value = 127.0.0.1:8010
接口总请求%服务器数量得到实际下标服务位置
1 % 2 = 1 对应下标位置为1
2 % 2 = 0 对应下标位置为0
3 % 2 = 1 对应下标位置为1
手写Ribbon实现
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ExtRibbonController {
@Autowired
private RestTemplate restTemplate;
//获取注册中心上的服务对象列表
@Autowired
private DiscoveryClient discoveryClient;
//接口请求总数
private int reqCount = 1;
//纯手写Ribbon本地负载均衡效果
@RequestMapping("ribbonMember")
public String ribbonMember(){
//1.获取对应服务器远程调用地址
String instanceUrl = getInstances()+"getMember";
System.out.println("instanceUrl"+instanceUrl);
//2.再使用rest方式发送请求,可以直接使用httpclient技术实现远程调用
String result = restTemplate.getForObject(instanceUrl, String.class);
return result;
}
private String getInstances(){
List<ServiceInstance> instances = discoveryClient.getInstances("app-dawn-member"); //服务名
if(instances==null || instances.size()<=0){
return null;
}
//获取服务器集群个数
int instanceSize = instances.size();
int serviceIndex = reqCount%instanceSize;
reqCount++;
return instances.get(serviceIndex).getUri().toString();
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。