负载均衡Ribbon

本文介绍了Ribbon作为客户端负载均衡器的基本概念,通过实例展示了如何自定义实现负载均衡,包括随机策略和轮询策略,并详细讲解了在Spring Cloud中基于Ribbon的配置和使用。同时,文章指出了Ribbon存在的问题,如URL拼接效率低和无法自动剔除故障服务等。
摘要由CSDN通过智能技术生成

目录

一、简介

1.什么是ribbon?

2.什么是负载均衡

二、ribbon入门

1.自定义实现负载均衡

 2.负载均衡策略

1. 随机策略

 2.轮询策略

3.基于ribbon实现负载均衡

1.开启ribbon负载均衡:默认是轮询策略

2.指定负载均衡策略

3.修改ribbon_consumer服务消费者模块

三、ribbon的问题


一、简介

1.什么是ribbon?

ribbon是基于netflix ribbon实现的一个工作在consumer端的负载均衡工具(言外之意是工作在消费端的),提供了很多负载均衡策略:轮询、随机...

我们不需要去引入ribbon的依赖,因为在nacos里面已经集成了ribbon的依赖:

2.什么是负载均衡

通俗的讲,负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。

二、ribbon入门

1.自定义实现负载均衡

分别创建服务提供者两个模块

 配置文件application.yml中分别设置不同的端口号:

server:
  port: 9090
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.238.132:8848
  application:
    name: ribbon-provider
server:
  port: 9091
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.238.132:8848
  application:
    name: ribbon-provider

两个服务提供者的controller分别为:

@RestController
@RequestMapping("/provider")
public class ProviderController {
    @Autowired
    private UserService userService;
    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
        return userService.getUserById(id);
    }
}

两个服务提供者的service分别为以下内容,名字:

public interface UserService {
    User getUserById(Integer id);
}

service实现层分别为:


@Service
public class UserServiceImpl implements UserService {

    @Override
    public User getUserById(Integer id) {
        return new User(id,"王小-1",18);
    }
}


@Service
public class UserServiceImpl implements UserService {

    @Override
    public User getUserById(Integer id) {
        return new User(id,"王小-2",18);
    }
}

在创建一个服务消费者模块:

配置文件application.yml为:

server:
  port: 80
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.238.132:8848 #nacos服务的地址
  application:
    name: nacos-consumer #向注册中心注册的名字

 controller中分别使用了两种方式:随机方式和轮询方式进行测试:

@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    //访问Rest服务的客户端
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;
    private int index;

    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){

        List<String> servicesList = discoveryClient.getServices();

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

测试结果:

随机方式的测试结果:通过不断的刷新,和查看可以得知随机方式,是随意的获取到服务,没有固定规律而言;

轮询方式的测试结果:通过不断的刷新,和查看,可以的得知轮询方式是获取到一个服务后,在次刷新就会获取下一个服务,是来回轮流着获取

 

 2.负载均衡策略

这里只举出两个例子:随机策略、轮询策略

负载均衡接口:com.netflix.loadbalancer.IRule

1. 随机策略

com.netflix.loabancer.RandomRule:该策略实现了从服务清单中随机选择一个服务实例的功能。

 2.轮询策略

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

 

3.基于ribbon实现负载均衡

1.开启ribbon负载均衡:默认是轮询策略

@Configuration
public class ConfigBean {
    @Bean
     /**
     * 添加了@LoadBalanced注解之后,Ribbon会给restTemplate请求添加一个拦截器,
     * 在拦截器中获取注册中心的服务列表,并使用Ribbon内置的负载均衡算法从服务列表
     * 里选中一个服务,通过获取到的服务信息(ip,port)替换 serviceId 实现负载请求。
     */
	@LoadBalanced //开启负载均衡
	public RestTemplate getRestTemplate(){
	    return new RestTemplate();
	}
}

2.指定负载均衡策略

在ConfigBean配置类中添加以下内容,将会变成随机策略

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

3.修改ribbon_consumer服务消费者模块

controller层

@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    //访问Rest服务的客户端
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
        
        //@LoadBalanced会将ribbon-provider替换成ip和端口
        String url="http://ribbon-provider/provider/getUserById/"+id;
        return restTemplate.getForObject(url, User.class);
    }

三、ribbon的问题

1、还需要拼接url和参数,效率太低

2、默认不能剔除死亡的服务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Cloud负载均衡Ribbon是一种客户端负载均衡工具,它可以将请求分发到多个服务提供者实例中,从而提高系统的可用性和性能。Ribbon可以根据不同的负载均衡策略来选择服务提供者,例如轮询、随机、加权轮询等。同时,Ribbon还支持服务发现和服务注册,可以自动地从服务注册中心获取可用的服务实例列表。在Spring Cloud微服务架构中,Ribbon是非常重要的一部分,它可以帮助我们构建高可用、高性能的微服务系统。 ### 回答2: Spring Cloud 负载均衡Ribbon 是一个在客户端上运行的组件,可以在目标服务之间分配传入请求,以降低每个服务的负载。Ribbon 提供了多种负载均衡策略,包括简单轮询、随机、使用可用性统计数据等。 在实践中,Ribbon 可以轻松地集成到 Spring Cloud 应用中,通过配置文件中的特殊前缀“@LoadBalanced”来激活负载均衡服务。Spring Cloud 应用可以使用 Ribbon 来调用其他 REST 服务,而不用担心网络瓶颈和性能问题。 使用 Ribbon 进行负载均衡的最大好处是其透明的实现,使得客户端无需感知分配策略的变化。具体来说,当使用 Ribbon 负载均衡时,客户端可以轮流使用不同的目标服务,而无需编写特定的代码。Ribbon 为开发人员提供了一致的抽象层,以便简化分配策略和请求转发的实现。 Ribbon 作为 Spring Cloud 的核心组件之一,可以与其他重要的云基础设施服务进行集成,例如 Eureka 服务注册、Zookeeper 服务发现和 Consul 网格。通过这种方式,Ribbon 可以很容易地在多个云基础设施服务之间进行切换和部署。此外,Ribbon 还支持快速故障转移和自动重试机制,以确保应用程序可以在单个节点或整个系统故障时保持高可用性。 ### 回答3: Spring Cloud是一个基于Spring Boot实现的云原生应用开发框架,其中Spring Cloud Ribbon是其核心组件之一,提供了负载均衡的功能。 在传统的架构中,为了保证高可用性和可扩展性,常常需要多个相同的应用实例来处理用户请求,这时候就需要使用负载均衡来将请求均匀地分配到各个实例上。Spring Cloud Ribbon就是为了实现这个目的而设计的。 Ribbon可以将所有服务实例看作是一个整体,通过算法(一般为轮询算法)将请求分配给各个实例,从而实现负载均衡Ribbon内部维护了一个可用服务实例列表,当有服务实例启动或宕机时,它会实时更新列表,保证了服务的动态感知和适应。 Ribbon还提供了一些负载均衡策略,比如轮询(Round Robin)、随机(Random)、最少连接(Least Connection)等,可以根据具体业务来选择不同的策略。 在Spring Cloud中,使用Ribbon进行负载均衡非常简单,只需要加上@LoadBalanced注解,就可以实现自动的负载均衡。具体步骤如下: 1. 引入spring-cloud-starter-ribbon依赖 2. 创建RestTemplate实例,并添加@LoadBalanced注解 3. 像普通的RestTemplate一样使用其get、post等方法发起请求即可 最后,需要注意的是,Ribbon只是一种负载均衡的实现方式,而且还有其它的负载均衡框架可以选择,比如Nginx、HAProxy等。选择哪种负载均衡框架,需要根据具体业务需求、系统规模等综合考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值