客户端负载均衡器

客户端负载均衡器

       在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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值