Ribbon

Ribbon

  • 服务器端负载均衡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();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值