负载均衡组件Ribbon的使用

1 什么是负载均衡

负载均衡不是特指某一种技术,而是一种访问服务器的方法
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
通俗的讲,负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行.
在这里插入图片描述

2 自定义实现负载均衡

2.1 创建服务的提供者

拷贝nacos_provider:
在这里插入图片描述

2.2 编写application.yml文件

server:
  port: 9090 #自定义端口号,避免端口冲突
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.65.132:8848 #填写注册中心的地址
  application:
    name: ribbon-provider #填写注册到nacos的服务名
server:
  port: 9091 #自定义端口号,避免端口冲突
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.65.132:8848 #填写注册中心的地址
  application:
    name: ribbon-provider #填写注册到nacos的服务名

2.3 创建服务的消费者

拷贝nacos_consumer:
在这里插入图片描述

2.4 编辑消费者的application.yml

server:
  port: 9093
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.65.132:8848 #注册中心的地址
  application:
    name: ribbon-consumer #注册的名字

2.5 编辑controller

@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {
	
	@Autowired
	private RestTemplate restTemplate;

	@Autowired
	private DiscoveryClient discoveryClient;

	private int currentIndex;

	@RequestMapping(value="/getUserById/{id}")
	public User getUserById(@PathVariable Integer id){
		List<ServiceInstance> serviceList = 
            				discoveryClient.getInstances("ribbon-provider");

		//随机方式获得服务
		//int currentIndex = new Random().nextInt(serviceList.size());
		//轮询方式获得服务
		currentIndex = (currentIndex + 1) % serviceList.size();
		
		ServiceInstance instance = serviceList.get(currentIndex);
		String serviceUrl = instance.getHost() + ":" + instance.getPort();
        System.out.println("serviceUrl:"+serviceUrl);
		String url = "http://"+serviceUrl+"/provider/getUserById/"+id;
		return restTemplate.getForObject(url, User.class);
	}
}

使用轮询策略和随机策略分别调用服务器
轮询策略:可以使用一个数字取余服务组的size方式来达到轮询的方式
轮询策略就是每个服务都访问一遍
随机策略:随机策略是使用Random获取随机数,再根据服务名获取服务组的size属性,使随机数小于size数,就可以随机
随机策略就是随机访问一个服务,在极端的情况下很有可能一直访问一个服务,达不到负载均衡的目的

3 Ribbon的介绍

3.1 什么是Ribbon

Ribbon是一个为客户端提供负载均衡功能的服务,它内部提供了一个叫做ILoadBalance的接口代表负载均衡器的操作,比如有添加服务器操作、选择服务器操作、获取所有的服务器列表、获取可用的服务器列表等等
Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中Load Balancer后面的所有机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法。
在这里插入图片描述
我们在使用的时候不用去引入ribbon的依赖,因为在nacos依赖中已经继承了ribbon,Ribbon默认提供 很多种负载均衡算法,例如轮询、随机 等等
在这里插入图片描述

3.2 负载均衡策略

负载均衡接口:`com.netflix.loadbalancer.IRule
在这里插入图片描述

3.2.1 随机策略

com.netflix.loadbalancer.RandomRule:该策略实现了从服务清单中随机选择一个服务实例的功能
在这里插入图片描述
可以看到Ribbon的随机策略底层调用的也是随机数,范围是服务组的size

3.2.2 轮询策略

com.netflix.loadbalancer.RoundRobinRule:该策略实现按照线性轮询的方式依次选择实例的功能。具体实现如下,在循环中增加了一个count计数变量,该变量会在每次轮询之后累加并求余服务总数
在这里插入图片描述

基于Ribbon实现负载均衡

在消费者模块中添加config包和Configbean

@Configuration
public class ConfigBean {

	@Bean
	/**
	 * 添加了@LoadBalanced注解之后,Ribbon会给restTemplate请求添加一个拦截器,在拦截器中获取
	 * 注册中心的所有可用服务,通过获取到的服务信息(ip,port)替换 serviceId 实现负载请求。
	 */
	//@LoadBalanced //开启负载均衡
	public RestTemplate getRestTemplate(){
		return new RestTemplate();
	}

	//随机策略
	@Bean
	public IRule iRule() {
		return new RandomRule();
	}
}

由于Ribbon底层可以通过服务名获取到服务的Ip地址以及端口,解决了Ip地址和端口的硬编码问题,此时调用只需要把服务名拼接到URL里即可

@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/getUserById/{id}")
    public User getUserById(@PathVariable Integer id) {
        //不使用ribbon:ip:port
        //String serviceUrl = "127.0.0.1:9090";
        //使用ribbon:不再使用ip:port的方式,而是改成了serviceId(即Nacos中注册的服务名称)
        String serviceUrl = "ribbon-provider";
        return restTemplate.getForObject("http://" + serviceUrl + 
                                         "/provider/getUserById/" + id, User.class);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值