Spring Cloud 系列之负载均衡 Ribbon的示例代码

 更新时间:2020年11月06日 09:44:35   作者:Demo_Null  
Ribbon 是 Netflix 发布的负载均衡器,它有助于控制 HTTP 和 TCP 客户端的行为。这篇文章主要介绍了Spring Cloud 系列之负载均衡 Ribbon的示例代码,需要的朋友可以参考下

1.1 简介

1.1.1 概述

  Ribbon 是 Netflix 发布的负载均衡器,它有助于控制 HTTP 和 TCP 客户端的行为。为 Ribbon 配置服务提供者地址列表后,Ribbon 就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon 默认为我们提供了很多的负载均衡算法,例如轮询、随机等。当然,我们也可为 Ribbon 实现自定义的负载均衡算法。Ribbon 现在已经进入维护状态,但目前仍在大规模使用,Spring Cloud 准备使用 LoadBalancer 作为 Ribbon 的替换方案。

1.1.2 相关依赖

  因为现在的注册中心帮我们引入了 Ribbon 我们不需要再次引入就可以直接使用,当然也可以再引入一次没有影响。

在这里插入图片描述

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

1.2 简单使用

1.2.1 搭建项目

eureka 项目

1.2.2 开启负载均衡

  开启负载均衡非常简单,只需要在 RestTemplate 的配置方法上加上 @LoadBalanced 注解即可使用最简单的轮询。

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/10/29
 * @description 消费者启动类
 */
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
 public static void main(String[] args) {
  SpringApplication.run(ConsumerApplication.class, args);
 }
 
 @Bean
 @LoadBalanced
 public RestTemplate getRestTemplate() {
  return new RestTemplate();
 }
}

1.2.3 使用负载均衡

/**
 * Created with IntelliJ IDEA.
 *
 * @author Demo_Null
 * @date 2020/10/29
 * @description
 */
@RestController
@RequestMapping("/consumer")
public class ConsumerController {

 @Autowired
 private DiscoveryClient discoveryClient;

 @Autowired
 private RestTemplate restTemplate;

 @GetMapping("/go")
 public void go() {
  List<ServiceInstance> providerServer = discoveryClient.getInstances("ProviderServer");

  if (0 == providerServer.size()) {
   return;
  }

  ServiceInstance serviceInstance = providerServer.get(0);
  String url = serviceInstance.getUri() + "/provider/get";
  System.out.println(url + " --- ");
  String str = restTemplate.getForObject(url, String.class);
  System.out.println(str);

 }
}

  喔嚯!报错了,明明可以访问到为什么会报找不到实例呢?这是应为咱们使用 DiscoveryClient 直接获取到了服务提供者集群中某一个的地址,然后让 RestTemplate 去进行负载均衡。我们都已经拿到了准确地址再怎么进行负载均衡?所以我们这里不能使用 IP 要使用服务名称。

在这里插入图片描述
在这里插入图片描述

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

 @Autowired
 private RestTemplate restTemplate;


 @GetMapping("/go")
 public void go() {
  String url = "http://ProviderServer/provider/get";

  String str = restTemplate.getForObject(url, String.class);
  System.out.println(str);
 }
}

修改完毕之后就可以看到服务提供者是轮换进行提供服务的

在这里插入图片描述

1.3 替换负载均衡策略

1.3.1 自带负载均衡策略

在这里插入图片描述

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

1.3.2 使用配置类

  官方文档明确警告,这个自定义配置类不能放在 @ComponedtScan 所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的 Ribbon 客户端所共享。即在 Spring Boot 主程序扫描的包外定义配置类或在与 Spring Boot 主程序的同一级目录但在排除扫描。配置类创建完毕后为 Spring Boo 主程序添加 @RibbonClient 注解引入配置类,用 name 属性来指定调用的服务名称,configuration 属性指定自定义配置类

@Configuration
public class MyRibbonRule {

 @Bean
 public IRule ribbonRule() {
  return new RandomRule();
 }
}
@SpringBootApplication
@EnableDiscoveryClient
// 用 name 来指定调用的服务名称,configuration 指定自定义配置类
@RibbonClient(name = "ProviderServer", configuration = MyRibbonRule.class)
public class ConsumerApplication {

 public static void main(String[] args) {
  SpringApplication.run(ConsumerApplication.class, args);
 }

 @Bean
 @LoadBalanced
 public RestTemplate getRestTemplate() {
  return new RestTemplate();
 }
}

在这里插入图片描述

1.3.3 配置文件

# 这种配置的优先级低于配置类
# 想要调用的服务名称,即服务提供者名称
ProviderServer:
 ribbon:
 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

在这里插入图片描述

源码

到此这篇关于Spring Cloud 系列之负载均衡 Ribbon的示例代码的文章就介绍到这了,更多相关Spring Cloud 负载均衡 Ribbon内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot中注解@ConfigurationProperties与@Value的区别与使用详解

    SpringBoot中注解@ConfigurationProperties与@Value的区别与使用详解

    本文主要介绍了SpringBoot中注解@ConfigurationProperties与@Value的区别与使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • elasticsearch集群cluster示例详解

    elasticsearch集群cluster示例详解

    这篇文章主要为大家介绍了elasticsearch集群cluster示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • kafka监听问题的解决和剖析

    kafka监听问题的解决和剖析

    这篇文章主要给大家介绍了关于kafka监听问题的解决和剖析的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java多线程之原子类解析

    Java多线程之原子类解析

    这篇文章主要介绍了Java多线程之原子类解析,Java原子类是一种多线程编程中常用的工具,用于实现线程安全的操作,它们提供了一种原子性操作的机制,确保多个线程同时访问共享变量时的数据一致性,需要的朋友可以参考下
    2023-10-10
  • java编写创建数据库和表的程序

    java编写创建数据库和表的程序

    这篇文章主要为大家详细介绍了java编写创建数据库和表的程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • java基于servlet实现文件上传功能解析

    java基于servlet实现文件上传功能解析

    这篇文章主要为大家详细介绍了java基于servlet实现上传功能,后台使用java实现,前端主要是js的ajax实现,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • myeclipse安装Spring Tool Suite(STS)插件的方法步骤

    myeclipse安装Spring Tool Suite(STS)插件的方法步骤

    这篇文章主要介绍了myeclipse安装Spring Tool Suite(STS)插件的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Spring Data JPA查询方式及方法名查询规则介绍

    Spring Data JPA查询方式及方法名查询规则介绍

    这篇文章主要介绍了Spring Data JPA查询方式及方法名查询规则,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 亲手教你IDEA2020.3创建Javaweb项目的步骤详解

    亲手教你IDEA2020.3创建Javaweb项目的步骤详解

    这篇文章主要介绍了IDEA2020.3创建Javaweb项目的步骤详解,本文是小编手把手教你,通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-03-03
  • SpringBoot轻松整合MongoDB的全过程记录

    SpringBoot轻松整合MongoDB的全过程记录

    这篇文章主要给大家介绍了关于SpringBoot轻松整合MongoDB的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论