• 【Springcloud Ribbon】负载均衡


    Ribbon的简介

    Ribbon是什么?

    Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。

    简单的说,RibbonNetflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer (简称LB)后面所有助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。

    LB(负载均衡)

    LB负载均衡(Load Balance)是什么

    • 简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA (高可用)。

    • 常见的负载均衡有软件Nginx, LVS, 硬件F5等。

    Ribbon本地负载均衡客户端VS Nginx服务端负载均衡区别

    • Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。

    • Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

    集中式LB

    • 即在服务的消费方和提供方之间使用独立的LB设施可以是硬件,如F5,也可以是软件,如nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方;

    进程内LB

    • LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。Ribbon就属于进程内LB,它只是一个类库, 集成于消费方进程,消费方通过它来获取到服务提供方的地址。

    架构图

    在这里插入图片描述

    总结:Ribbon其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。


    RestTemplate的使用

    首先需要修改POM文件

            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4

    getForObject一般返回的都是Json,使用如下

        @GetMapping("/consumer/payment/get/{id}")
        public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
            return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
        }
    
    • 1
    • 2
    • 3
    • 4

    但是getForEntity不仅仅可以返回Json还可以返回其他信息

        @GetMapping("/consumer/payment/getForEntity/{id}")
        public CommonResult<Payment> getForEntity(@PathVariable("id") Long id) {
            ResponseEntity<CommonResult> entity = restTemplate.getForEntity(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
            if (entity.getStatusCode().is2xxSuccessful()) {
                log.info(entity.getStatusCode() + "\t" + entity.getBody());
                return entity.getBody();
            } else {
                return new CommonResult<>(444, "操作失败");
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    一般只使用getObject,但是若需要使用到其他详细信息时,需要使用getForEntity

    Ribbon核心组件IRule

    IRule:根据特定算法从服务列表中选取一个要访问的服务

    IRule是一个接口
    在这里插入图片描述
    查看那些类实现了该接口
    在这里插入图片描述

    com.netflix.loadbalancer.RoundRobinRule:轮询
    com.netflix.loadbalancer.RandomRule:随机
    com.netflix.loadbalancer.RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试
    WeightedResponseTimeRule :对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
    BestAvailableRule :会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
    AvailabilityFilteringRule :先过滤掉故障实例,再选择并发较小的实例
    ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器

    替换负载均衡的规则

    官方提醒该配置类不能放置在ComponentScan注解所扫描的包及其子包下

    所以我们需要新建一个包,如下
    在这里插入图片描述
    配置类

    package com.example.myrule;
    
    import com.netflix.loadbalancer.IRule;
    import com.netflix.loadbalancer.RandomRule;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class MySelfRule {
        @Bean
        public IRule myRule() {
            return new RandomRule();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在启动类使用规则

    @RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)
    
    
    • 1
    • 2
  • 相关阅读:
    【Excel】排名之成绩并列排名(sumproduct、countif 函数的组合使用方法)
    【C++笔试强训】第二十九天
    11-3 Iterator迭代器接口
    【嵌入式软件开发】之面试常识(一)
    终于有阿里p8进行了大汇总(Redis+JVM+MySQL+Spring)还有面试题解全在这里了!
    mulesoft 核心知识点 summary
    搭建自己的Docker Harbor镜像仓库
    IOS object-c大屏图表 PNChart 折线图 曲线图
    计算机算法的设计与分析——排序和顺序统计
    计算机网络——b站王道考研笔记
  • 原文地址:https://blog.csdn.net/heiren_a/article/details/126310088