负载均衡Ribbon

桃扇骨 2024-03-27 13:33 240阅读 0赞

1. Feign 默认集成了 Ribbon

Feign 是一个声明式的伪 Http 客户端,它使得写 Http 客户端变得更简单。使用 Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用 Feign 注解和 JAX-RS 注解。Feign 支持可插拔的编码器和解码器。Feign 默认集成了 Ribbon,默认实现了负载均衡的效果。所以使用Feign无需任何操作就已经附带了Ribbon负载均衡。

2. 概述

负载均衡是分布式架构的重点,负载均衡机制决定着整个服务集群的性能与稳定。

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行

负载均衡解决的是将一个客户端的流量以某种符合最大化资源利用率的方式均摊到服务端所提供的所有实例上的问题。在这个问题的场景中,后端服务的实例是通过水平扩展的方式来提供高可用的。

3. 负载均衡分类

在微服务架构中,负载均衡是必须使用的技术,通过它来实现系统的高可用、集群扩容等功能。负载均衡可以分为两种:服务端负载均衡和客户端负载均衡。

1、服务器负载均衡

通常所说的负载均衡指服务器负载均衡,由服务端来决定调用哪个节点,可通过硬件设备或软件来实现,硬件比如:F5、Array等,软件比如:LVS、Nginx等,类似的架构图如下:
640
原理:

通过硬件或软件实现负载均衡均会维护一个服务端清单,利用心跳检测等手段进行清单维护,保证清单中都是可以正常访问的服务节点。当用户发送请求时,会先到达负载均衡器(也相当于一个服务),负载均衡器根据负载均衡算法(轮训、随机、加权轮训)从可用的服务端列表中取出一台服务端的地址,接着进行转发,降低系统的压力

2、客户端负载均衡

客户端实际上是指服务调用者。在 SpringCloud 中调用者本身集成负载均衡,由调用者决定来调用哪个节点的服务,这就是客户端负载均衡。

SpringCloud Ribbon是基于客户端的负载均衡工具,它可以将面向服务的 REST 模板请求自动转换成客户端负载均衡的服务调用。
640 (1)
原理:

Ribbon 维护了一个服务列表,如果服务实例注销或死掉,Ribbon 能够自行将其剔除。Ribbon 提供了客户端负载均衡的功能,Ribbon 利用从注册中心中读取到的服务信息列表(存储在本地即客户端中),在调用某个服务时,根据负载均衡算法直接请求到具体的微服务实例,常用的负载均衡算法有:轮循、随机、加权轮循、加权随机、地址哈希等方法。如下图是Ribbon负载均衡的流程图:
640 (2)

3、客户端和服务端负载均衡的区别

两者主要区分点在于服务清单的存放位置:在客户端负载均衡中,客户端会存储一份服务端清单,它是通过从注册中心进行抓取得到的,同时也需要对此进行维护;而在服务端负载均衡中,服务端自己会维护一份服务端清单

4. Ribbon 简介

Spring Cloud Ribbon是一个基于 HTTP 和 TCP 协议客户端负载均衡工具,它基于Netflix Ribbon实现。通过 Spring Cloud 的封装,可以让我们轻松地将面向服务的 REST 模版请求自动转换成客户端负载均衡的服务调用

Spring Cloud Hoxton.SR6版本不需要引入spring-cloud-starter-netflix-ribbon,已经默认集成

5. 负载均衡@LoadBalanced

Ribbon负载均衡实现,RestTemplate 要加上@LoadBalanced

  1. package com.example.springcloud.ribbon.configuration;
  2. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.web.client.RestTemplate;
  6. /**
  7. * <pre>
  8. * RestConfiguration
  9. * </pre>
  10. *
  11. * <pre>
  12. * @author mazq
  13. * 修改记录
  14. * 修改后版本: 修改人: 修改日期: 2020/07/31 09:43 修改内容:
  15. * </pre>
  16. */
  17. @Configuration
  18. public class RestConfiguration {
  19. @Bean
  20. @LoadBalanced
  21. public RestTemplate restTemplate() {
  22. return new RestTemplate();
  23. }
  24. }

yaml配置:

  1. server:
  2. port: 8082
  3. spring:
  4. application:
  5. name: eureka-service-consumer
  6. eureka:
  7. client:
  8. service-url:
  9. defaultZone: http://localhost:8761/eureka/
  10. fetch-registry: true
  11. register-with-eureka: false
  12. healthcheck:
  13. enabled: false
  14. instance:
  15. status-page-url-path: http://localhost:8761/actuator/info
  16. health-check-url-path: http://localhost:8761/actuator//health
  17. prefer-ip-address: true
  18. instance-id: eureka-service-consumer8082

img

image.png

关键点,使用SpringCloud的@LoadBalanced,才能调http://EUREKA-SERVICE-PROVIDER/api/users/? 接口的数据,浏览器是不能直接调的

  1. import com.example.springcloud.ribbon.bean.User;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  7. import org.springframework.web.bind.annotation.*;
  8. import org.springframework.web.client.RestTemplate;
  9. import java.net.URI;
  10. @SpringBootApplication
  11. @EnableEurekaClient
  12. @RestController
  13. @Slf4j
  14. public class SpringcloudRibbonApplication {
  15. @Autowired
  16. RestTemplate restTemplate;
  17. public static void main(String[] args) {
  18. SpringApplication.run(SpringcloudRibbonApplication.class, args);
  19. }
  20. @GetMapping("/findUser/{username}")
  21. public User index(@PathVariable("username")String username){
  22. return restTemplate.getForObject("http://EUREKA-SERVICE-PROVIDER/api/users/"+username,User.class);
  23. }
  24. }

img

6. 负载均衡策略

img

发表评论

表情:
评论列表 (有 0 条评论,240人围观)

还没有评论,来说两句吧...

相关阅读

    相关 负载均衡Ribbon

    1. Feign 默认集成了 Ribbon Feign 是一个声明式的伪 Http 客户端,它使得写 Http 客户端变得更简单。使用 Feign,只需要创建一个接口并注

    相关 负载均衡---ribbon

    Ribbon:提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。 上一篇简单讲解了eureka的使用,这一篇文章基于上一篇的基础上,讲一下spring

    相关 Ribbon负载均衡

    1. 集中式负载均衡 > 在客户端和服务端之间使用独立的负载均衡设施(可以是硬件,如F5, 也可以是软件,如nginx、LVS等), 由该设施负责把访问请求通过某种策略转发