SpringCloud第五天之Ribbon

一、概述

1、介绍

在这里插入图片描述
Ribbon其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。

2、负载均衡介绍

在这里插入图片描述

  • 集中式负载均衡:
    在这里插入图片描述
  • 进程内负载均衡
    在这里插入图片描述
3、客户端负载均衡和服务端负载均衡区别在这里插入图片描述

二、实例

1、RestTemplate中getForObject和getForEntity区别

getForObject获取的是响应体中数据转化成的对象,可以看成json
getForEntity返回的是ResponseEntity对象,其中包含响应头、响应体、响应状态码等待。

2、核心组件IRule

IRule:根据特定算法从服务列表中选取一个要访问的服务
在这里插入图片描述

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

首先在主启动类扫描不到的包中新建一个类
在这里插入图片描述
在此类中确定要使用的负载均衡算法
在这里插入图片描述
在主启动类上添加相应注解
在这里插入图片描述

4、手写轮询算法

采用面试接口编程
先定义一个规则接口:
在这里插入图片描述
然后有Mylb类实现此接口:

package com.ty.springcloud.lb;

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;

import java.lang.annotation.Annotation;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

@Component
public class MyLB implements LoadBanancer {

    private AtomicInteger atomicInteger = new AtomicInteger(0);

    /*获取当前访问次数并加一*/
    private final int getAndIncrement(){
        int current;
        int next;
        do{
            current = atomicInteger.get();
            next = current >= Integer.MAX_VALUE ? 0: current+1;
        } while (!atomicInteger.compareAndSet(current,next));//第一个参数是期望值,第二个参数是修改值
        System.out.println("**********第几次访问,next"+ next);
        return next;
    }

    @Override
    public ServiceInstance getServicerInstance(List<ServiceInstance> serviceInstances) {
        int index = getAndIncrement() % serviceInstances.size();
        return serviceInstances.get(index);
    }
}

在controller类中实现:

   @GetMapping("/consumer/payment/lb")
    public String getLb(){
        List<ServiceInstance> serviceInstances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        ServiceInstance serviceInstance = loadBanancer.getServicerInstance(serviceInstances);
        return ""+serviceInstance.getPort();
    }

通过访问此地址便可得到轮询的端口号


版权声明:本文为weixin_43946848原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。