SpringCloud 负载均衡

十念  金牌会员 | 2024-7-22 12:12:50 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 567|帖子 567|积分 1701

Spring Cloud 负载均衡


  
1. 概念

负责均衡 (Load Balance,简称LB),是高并发、高可用系统必不可少的关键组件。
当服务流量增大时,通常会采用增加机器的方式来进行扩容,负载均衡就是用来在多个机器大概其它资源中按照肯定的规则合理分配负载
   类似于在公司中,一个团队最开始只有一个人,后来随着工作量的增加,公司又雇用了几个人,就要思量到负载均衡,如何把工作量均衡的分配到这几个人身上,从而提高整个团队的效率!
  2. 分类

负责均衡分为服务端负载均衡和客户端负载均衡:
2.1 服务端负载均衡

在服务端进行负责均衡的算法分配,比较有名的服务端负载均衡器是Nginx,请求先到达Nginx负载均衡器,然后通过负载均衡算法,在多个服务器之间选择一个进行访问:

2.2 客户端负载均衡

在客户端进行负载均衡的算法分配.
把负责均衡的功能以库的方式集成到客户端,而不再是由一台指定的负载均衡设备集中提供
   比如Spring Cloud的Ribbon,请求发送到客户端,客户端从注册中央(如Eureka)获取服务列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问
  

Ribbon是Spring Cloud早期的默认实现,由于如今已不再维护,最新版本的Spring Cloud负载均衡集成的是由Spring Cloud官方维护的 Spring Cloud LoadBalancer
3. Spring Cloud LoadBalancer

在SpringCloud中,我们使用Spring Cloud LoadBalancer来实现负载均衡,使用方式如下

  • RestTemplate这个Bean添加 @LoadBalanced注解
    1. package com.order.config;
    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. @Configuration
    7. public class BeanConfig {
    8.    
    9.     @Bean
    10.     @LoadBalanced
    11.     public RestTemplate restTemplate() {
    12.         return new RestTemplate();
    13.     }
    14. }
    复制代码
  • 修改IP端标语为服务名称(OrderServiceImpl)
    1. package com.order.service.Impl;
    2. import com.order.mapper.OrderMapper;
    3. import com.order.model.OrderInfo;
    4. import com.order.model.ProductInfo;
    5. import com.order.service.OrderService;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.cloud.client.ServiceInstance;
    8. import org.springframework.cloud.client.discovery.DiscoveryClient;
    9. import org.springframework.stereotype.Service;
    10. import org.springframework.web.client.RestTemplate;
    11. import java.util.List;
    12. @Service
    13. public class OrderServiceImpl implements OrderService {
    14.     @Autowired
    15.     private OrderMapper orderMapper;
    16.     @Autowired
    17.     private DiscoveryClient discoveryClient;
    18.     @Autowired
    19.     private RestTemplate restTemplate;
    20.     @Override
    21.     public OrderInfo selectOrderById(Integer orderId) {
    22.         OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
    23. //        String url = "http://127.0.0.1:9090/product/" + orderInfo.getProductId();
    24.         String url = "http://product-service/product/" + orderInfo.getProductId();
    25.         ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
    26.         orderInfo.setProductInfo(productInfo);
    27.         return orderInfo;
    28.     }
    29. }
    复制代码
  • 启动多个product-service实例
    先复制一份实例:

    更改实例名称,并修改选项:

    选择 Add VM options 选项:

    添加 -Dserver.port=自定义端标语

部署好后同时启动多个product-service实例,并革新eureka-server:


可以看到新创建的几个实例都加入了注册中央!
这个时间我们来调用order-service服务,并多次革新调用,可以看到每个product-service都被均衡的调用到了

4. 负载均衡策略

负载均衡策略是一种头脑,无论是哪种负载均衡器,它们的负载均衡策略都是相似的。Spring Cloud LoadBalancer 仅支持两种负载均衡策略:轮询策略随机策略


  • 轮询(Round Robin):指服务器轮番处理用户的请求,这个一种实现最简单,也最常用的策略
  • 随机选择(Random):随机选择一个后端服务器来处理新的请求
Spring Cloud LoadBalancer 默认负载均衡策略是 轮询策略,实现的是RoundRobinLoadBalancer,如果服务的消费者需要采用随机的负载均衡策略也可以自行定义:
   参考官网所在:Spring Cloud LoadBalancer :: Spring Cloud Commons
  详细操作:

  • 定义随机算法对象,通过@Bean将器加载到Spring容器中
    1. package com.order.config;
    2. import org.springframework.cloud.client.ServiceInstance;
    3. import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
    4. import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
    5. import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
    6. import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
    7. import org.springframework.context.annotation.Bean;
    8. import org.springframework.core.env.Environment;
    9. public class LoadBalancerClient {
    10.     @Bean
    11.     ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
    12.                                                             LoadBalancerClientFactory loadBalancerClientFactory) {
    13.         String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
    14.         return new RandomLoadBalancer(loadBalancerClientFactory
    15.                 .getLazyProvider(name, ServiceInstanceListSupplier.class),
    16.                 name);
    17.     }
    18. }
    复制代码
  • 在RestTemplate配置类上方使用@LoadBalancerClient 大概 @LoadBalancerClients 注解(根据不同的服务提供方配配置不同的客户端负载均衡算法策略,这里我们使用@LoadBalancerClient )
    1. package com.order.config;
    2. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    3. import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
    4. import org.springframework.context.annotation.Bean;
    5. import org.springframework.context.annotation.Configuration;
    6. import org.springframework.web.client.RestTemplate;
    7. @LoadBalancerClient(name = "product-service", configuration = CustomLoadBalancerConfiguration.class)
    8. @Configuration
    9. public class BeanConfig {
    10.     @Bean
    11.     @LoadBalanced
    12.     public RestTemplate restTemplate() {
    13.         return new RestTemplate();
    14.     }
    15. }
    复制代码
    :@LoadBalancerClient注解中的name表示该负载均衡策略对哪个服务生效(服务提供方),Configuration表示该负载均衡器使用哪个负载均衡策略
    配置完成后,后续对product-service服务实例的调用就是随机的了!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表