`

Ribbon负载均衡器

阅读更多
1. Ribbon简介

Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如随机、轮询等。当然,我们也可为Ribbon实现自定义的负载均衡算法。

在SpringCloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从EurekaServer获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。展示了Ribbon与Eureka配合使用时的架构。

使用Ribbon,结合eureka集群,来实现服务的调用。




2. Ribbon初步应用

2.1) 服务消费者microservice-student-consumer-80增加pom.xml依赖

<groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>


2.2) 服务消费者microservice-student-consumer-80增加application.yml支持eureka

server:
  port: 80
  context-path: /
eureka:
  client:
    #false 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false
    register-with-eureka: false
    service-url: 
      defaultZone: http://eureka2001.andrew.com:2001/eureka/,http://eureka2002.andrew.com:2002/eureka/,http://eureka2003.andrew.com:2003/eureka/


2.3) 服务消费者microservice-student-consumer-80增加SpringCloudConfig.java注解@LoadBalanced

package com.andrew.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class SpringCloudConfig {
    @Bean
    @LoadBalanced // 引入ribbon负载均衡
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}


2.4) 服务消费者microservice-student-consumer-80增加StudentConsumerApplication_80.java注解@EnableEurekaClient

package com.andrew;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
@EnableEurekaClient
public class StudentConsumerApplication_80 {
    public static void main(String[] args) {
        SpringApplication.run(StudentConsumerApplication_80.class, args);
    }
}


2.5)服务消费者 microservice-student-consumer-80修改StudentConsumerController.java属性PRE_HOST

package com.andrew.controller;

import java.util.List;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.andrew.entity.Student;

@RestController
@RequestMapping("/student")
public class StudentConsumerController {
    @Resource
    private RestTemplate restTemplate;
    
    // private final static String PRE_HOST="http://localhost:1001";
    private final static String PRE_HOST="http://MICROSERVICE-STUDENT";

    @PostMapping(value = "/save")
    private boolean save(Student student) {
        return restTemplate.postForObject(PRE_HOST+"/student/save", student, Boolean.class);
    }
    @SuppressWarnings("unchecked")
    @GetMapping(value = "/list")
    public List<Student> list() {
        return restTemplate.getForObject(PRE_HOST+"/student/list", List.class);
    }
    @GetMapping(value = "/get/{id}")
    public Student get(@PathVariable("id") Integer id) {
        return restTemplate.getForObject(PRE_HOST+"/student/get/" + id, Student.class);
    }

    @GetMapping(value = "/delete/{id}")
    public boolean delete(@PathVariable("id") Integer id) {
        try {
            restTemplate.getForObject(PRE_HOST+"/student/delete/" + id, Boolean.class);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}


2.6) 服务提供者microservice-student-provider-1001增加application.yml配置

spring:
  application: 
    name: microservice-student


启动microservice-eureka-server-2001
启动microservice-eureka-server-2002
启动microservice-eureka-server-2003
启动microservice-student-provider-1001
启动microservice-student-consumer-80

执行
http://localhost/student/list
[{"id":1,"name":"zhangsan","grade":"11"},{"id":2,"name":"lisi","grade":"12"},{"id":3,"name":"wangwu","grade":"13"},{"id":4,"name":"student04","grade":"14"},{"id":5,"name":null,"grade":null},{"id":6,"name":"student06","grade":"16"}]


3. Ribbon负载均衡

3.1) 新建两个module 服务提供者microservice-student-provider-1002 服务提供者microservice-student-provider-1003

new -> Maven Module
    -> create a simple project
Module Name:microservice-student-provider-1002
Parent Project:microservice
Working set:SpringCloud
    -> Artifact
Group Id:com.andrew.springcloud
Artifact Id:microservice-student-provider-1002
Version:0.0.1-SNAPSHOT
Packaging:jar

代码与microservice-student-provider-1001相同


new -> Maven Module
    -> create a simple project
Module Name:microservice-student-provider-1003
Parent Project:microservice
Working set:SpringCloud
    -> Artifact
Group Id:com.andrew.springcloud
Artifact Id:microservice-student-provider-1003
Version:0.0.1-SNAPSHOT
Packaging:jar

代码与microservice-student-provider-1001相同


3.2) 修改两个项目application.yml的server.port和客户端实例名称

server:
  port: 1002
  context-path: /
eureka:
  instance:
    instance-id: microservice-student:1002 #客户端实例名称


server:
  port: 1003
  context-path: /
eureka:
  instance:
    instance-id: microservice-student:1003 #客户端实例名称


3.3) 修改三个项目StudentProviderController.java增加调用区分代码

@GetMapping(value = "/list")
public List<Student> list() {
    System.out.println("list----------------------------------1001");
    return studentService.list();
}


@GetMapping(value = "/list")
public List<Student> list() {
    System.out.println("list----------------------------------1002");
    return studentService.list();
}


@GetMapping(value = "/list")
public List<Student> list() {
    System.out.println("list----------------------------------1003");
    return studentService.list();
}


启动microservice-eureka-server-2001
启动microservice-eureka-server-2002
启动microservice-eureka-server-2003
启动microservice-student-provider-1001
启动microservice-student-provider-1002
启动microservice-student-provider-1003

先测试服务提供者:
http://localhost:1001/student/list
http://localhost:1002/student/list
http://localhost:1003/student/list

再测试下eureka:
http://eureka2001.andrew.com:2001/
http://eureka2002.andrew.com:2002/
http://eureka2003.andrew.com:2003/

然后再启动服务消费者
microservice-student-consumer-80

http://localhost/student/list
list----------------------------------1001 - 1003随机调用


3.4) ribbon默认策略

这种默认的轮询策略肯定是不能满足实际需求的,比如有3个服务提供者,突然挂了一个,这样的话,默认轮询,总有1/3的概率访问失败; ribbon默认给我们提供的策略有哪些;


BestAvailableRulepublic class BestAvailableRule extends ClientConfigEnabledRoundRobinRule选择一个最小的并发请求的server逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server
AvailabilityFilteringRulepublic class AvailabilityFilteringRule extends PredicateBasedRule过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态
WeightedResponseTimeRulepublic class WeightedResponseTimeRule extends RoundRobinRule根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成status时,使用roubine策略选择server。
RetryRulepublic class RetryRule extends AbstractLoadBalancerRule对选定的负载均衡策略机上重试机制。在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
RoundRobinRulepublic class RoundRobinRule extends AbstractLoadBalancerRuleroundRobin方式轮询选择server轮询index,选择index对应位置的server
RandomRulepublic class RandomRule extends AbstractLoadBalancerRule随机选择一个server在index上随机,选择index对应位置的server
ZoneAvoidanceRulepublic class ZoneAvoidanceRule extends PredicateBasedRule复合判断server所在区域的性能和server的可用性选择server使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server


3.5) 服务消费者microservice-student-consumer-80中配置轮询策略

package com.andrew.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RetryRule;

@Configuration
public class SpringCloudConfig {
    @Bean
    @LoadBalanced // 引入ribbon负载均衡,此处没有用
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
    /**
     * 自定义轮询算法
     */
    @Bean
    public IRule myRule(){
        return new RetryRule();
    }
}


启动microservice-eureka-server-2001
启动microservice-eureka-server-2002
启动microservice-eureka-server-2003
启动microservice-student-provider-1001
启动microservice-student-provider-1002
启动microservice-student-provider-1003

先测试服务提供者:
http://localhost:1001/student/list
http://localhost:1002/student/list
http://localhost:1003/student/list

再测试下eureka:
http://eureka2001.andrew.com:2001/
http://eureka2002.andrew.com:2002/
http://eureka2003.andrew.com:2003/

然后再启动服务消费者
microservice-student-consumer-80

http://localhost/student/list
list----------------------------------1001 - 1003根据轮询原理调用

或者挂掉其中某个服务再调用

  • 大小: 63.2 KB
分享到:
评论

相关推荐

    7.Ribbon负载均衡器详细介绍

    在微服务架构中, Ribbon 是 Netflix 提供的一个客户端负载均衡器,它可以帮助我们在客户端实现对服务的请求分发,从而实现服务之间的负载均衡。Ribbon 不仅可以与 Eureka(服务发现组件)配合使用,也可以独立工作...

    Spring Cloud Ribbon负载均衡器处理方法

    Spring Cloud Ribbon负载均衡器处理方法 Spring Cloud Ribbon负载均衡器处理方法是指在Spring Cloud中使用Ribbon实现负载均衡的处理方法。该方法主要介绍了如何获取服务实例,获取以后做了哪些处理,处理后又是如何...

    SpringBoot + Zuul + ribbon 中实现负载均衡

    Ribbon则是Netflix开源的一套客户端负载均衡器,它可以集成在Spring Cloud中,用于在客户端进行服务的发现和负载均衡。Ribbon会根据配置的策略,自动选择一个微服务实例来处理请求,这样可以分散负载,提高系统的...

    springcloud-ribbon负载均衡demo

    其中,Spring Cloud Ribbon是一个客户端负载均衡器,它可以与Spring Cloud Netflix Eureka结合使用,实现服务间的智能路由和负载均衡。在这个"springcloud-ribbon负载均衡demo"中,我们将探讨Ribbon的基本概念、工作...

    eureka结合Ribbon进行负载均衡搭建

    在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。展示了Ribbon与Eureka配合使用时的架构。

    eureka基于ribbon的负载均衡demo

    其次,Ribbon 是一个客户端负载均衡器,它嵌入在每个需要调用其他服务的客户端中。在本 demo 中,`ribbon-consumer` 应该是服务消费者,它会利用 Ribbon 实现对 `ribbon-provider` 和 `ribbon-provider2` 的智能调用...

    Ribbon负载均衡简单实现

    **Ribbon负载均衡策略** - **轮询(RoundRobinRule)**: 默认策略,按顺序依次选择服务实例。 - **随机(RandomRule)**: 随机选择一个服务实例。 - **权重分配(WeightedResponseTimeRule)**: 根据服务响应时间...

    Ribbon负载均衡代码

    在这个"SpringCloud学习之路(四)-Ribbon负载均衡的Demo代码"中,我们将深入探讨Ribbon的工作原理及其在实际应用中的配置与使用。 首先,Ribbon的主要功能是在微服务架构中,当一个请求需要转发到服务集群中的某个...

    Ribbon 什么是负载均衡?spring cloud如何实现负载均衡 教程资源

    (三 Ribbon 什么是负载均衡?spring cloud如何实现负载均衡)手摸手带你一起搭建 Spring cloud 微服务 理论+实践+解析 配套例程资源

    SpringCloud-Ribbon负载均衡服务调用及手写Ribbon算法代码

    四、自定义Ribbon负载均衡算法 默认的Ribbon策略可能无法满足所有场景需求,因此我们可以自定义负载均衡算法。这通常通过实现IRule接口来完成,例如: ```java public class MyRule extends ...

    SpringCloud 服务负载均衡和调用 Ribbon、OpenFeign的方法

    Ribbon 是 Netflix 提供的客户端负载均衡器,它作为一个客户端的负载均衡中间件,实现了基于 Java 的客户端负载均衡算法。Ribbon 默认集成了 Eureka,可以从 Eureka Server 获取服务列表并进行负载均衡。Ribbon 提供...

    客户端负载均衡器Ribbon(实验代码)

    客户端负载均衡器Ribbon是Netflix开发的一个开源组件,主要用于实现微服务架构中的客户端负载均衡功能。在本实验代码中,我们将深入理解Ribbon的工作原理及其在实际应用中的配置与使用。 Ribbon是一个轻量级的库,...

    Eureka,ribbon修改负载均衡策略

    Eureka 主要用于服务注册与发现,而 Ribbon 则是客户端负载均衡器,它可以帮助我们在微服务之间进行智能路由,确保请求能够均匀地分发到各个服务实例。 **Eureka 简介** Eureka 是 Netflix 提供的一个分布式服务...

    02 微服务负载均衡器Ribbon&LoadBalancer实战.pdf

    【微服务负载均衡器Ribbon&LoadBalancer实战】 在微服务架构中,负载均衡是确保服务高可用性和可伸缩性的重要技术。本教程将详细讲解两种常用的客户端负载均衡器——Ribbon和LoadBalancer,以及它们在Spring Cloud ...

    SpringCloud使用Ribbon实现负载均衡

    Spring Cloud是构建微服务架构的一套工具集,其中Ribbon是它提供的一个客户端负载均衡器,可以帮助我们实现服务间的智能路由。本篇文章将详细探讨如何在Spring Cloud中使用Ribbon实现负载均衡。 首先,我们要理解...

    SpringCloud Ribbon负载均衡实例解析

    Ribbon 是一个基于 Netflix OSS 开源项目的负载均衡器,它提供了多种负载均衡算法,例如 Round Robin、Random、AvailabilityFilter 等。 在 SpringCloud 中,Ribbon 是一个独立的组件,提供了负载均衡的功能。通过...

    Springcloud ribbon负载均衡算法实现

    Springcloud ribbon负载均衡算法实现是基于Springcloud框架下的一个负载均衡器,主要用于客户端负载均衡。该算法实现了负载均衡的核心功能,能够整合不同的协议工具进行web service API调用,并提供了可插拔式的负载...

    SpringCloud实践系列(Nacos注册中心+Ribbon负载均衡+OpenFeign服务调+Nacos配置中心等)

    Ribbon是Spring Cloud中默认的客户端负载均衡器,它与Nacos结合使用,可以在服务消费者发起请求时自动选择一个可用的服务实例。通过Ribbon,可以实现基于轮询、随机等策略的负载均衡。 五、OpenFeign服务调用 ...

    SpringCloud(三)Ribbon负载均衡原理与Feign客户端的使用

    它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有...

Global site tag (gtag.js) - Google Analytics