[Spring Cloud] Eureka 负载均衡(LoadBalance)

复制多个服务

① 点击 idea 的服务 进入以下界面 , 进行配置服务

② 复制配置信息

启动服务之后可以看到有两个实例

多次调用 http://127.0.0.1:9096/order/1 发现还是访问同一台机器 , 并没有分担符合

解决方法

修改 OrderController
复制代码
private List<ServiceInstance> instances;

@PostConstruct //????
public void init(){
    //从Eureka 中获取服务
    instances = client.getInstances("product-service");//如果将初始化写在方法中 , 则不能保重每次调用的值相同
}
//    改版
    @RequestMapping("/{orderId}")
    public OrderInfo selectOrderById (@PathVariable("orderId") Integer orderId){//从请求url中获取参数
        OrderInfo info =  orderService.selectOrderById(orderId);
    //        String url = "http://127.0.0.1:9095/product/"+info.getProductId();
        //从Eureka中获取服务列表 并添加应用名
        //计算轮流实例
        int index = count.getAndIncrement()%instances.size();
        //拼接url
        String uri = instances.get(index).getUri().toString();
        String url = uri+"/product/"+info.getProductId();
        log.info("远程调用的url:"+url);
        ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
        info.setProductInfo(productInfo);
        return info;
    }

多次调用 :

http://127.0.0.1:9096/order/1

观察日志 , 发现请求被均匀分配在了不同的实例上

负载均衡

负载均衡(Load Balance,简称 LB),是高并发,高可用系统必不可少的关键组件,当服务流量增大时,通常会采用增加机器的方式进行扩容,负载均衡就是用来在多个机器或者其他资源中,按照一定的规则合理分配负载

负载均衡的实现

服务端的负载均衡

Nginx 负载均衡器 , 请求先到达 Nginx , 然后通过负载均衡算法 , 在多个服务器之间选择一个进行访问

客户端负载均衡器

  1. 核心机制:将负载均衡功能以"库"的形式集成到客户端,而非依赖集中的硬件设备
  2. 工作流程:客户端(如 Ribbon)从注册中心(如 Eureka)获取服务列表,在发送请求前通过算法自主选择目标服务器
  3. 技术演进 :早期的默认实现 Ribbon 已停止维护,最新版本的 Spring Cloud 已替换为官方维护的 Spring Cloud LoadBalance

Spring cloud LoadBalancer(客户端负债均衡器)

1.添加注解

在 config 中添加注解@LoadBalanced

复制代码
@Configuration
public class BeanConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

2.修改远程调用代码 , 把 ip 和端口号改成应用名

删除获取 url 的 代码 , 改为最原始的形式 , 并将 ip 和端口号改为应用名

复制代码
//    改版Spring cloud LoadBalancer
@RequestMapping("/{orderId}")
public OrderInfo selectOrderById (@PathVariable("orderId") Integer orderId){//从请求url中获取参数
    OrderInfo info =  orderService.selectOrderById(orderId);
    String url = "http://product-service/product/"+info.getProductId();
    log.info("远程调用的url:"+url);
    ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
    info.setProductInfo(productInfo);
    return info;
}}

负债均衡策略

  1. 轮询(Round Robin):轮询策略是指服务器轮流处理用户的请求。这是一种实现最简单,也最常用的策略。生活中也有类似的场景,比如学校轮流值日,或者轮流打扫卫生
  2. 随机选择(Random):随机选择策略是指随机选择一个后端服务器来处理新的请求

自定义负债均衡策略

参考官网

Spring Cloud LoadBalancer :: Spring Cloud Commons

复制官网代码
复制代码
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

public class CustomLoadBalancerConfiguration {

    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                              LoadBalancerClientFactory loadBalancerClientFactory) {
       String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
       return new RandomLoadBalancer(loadBalancerClientFactory
             .getLazyProvider(name, ServiceInstanceListSupplier.class),
             name);
    }
}
配置@LoadBalancerClient

name : 对哪个服务运用负载均衡

configuration : 使用哪个负载均衡策略实现

复制代码
@LoadBalancerClient(name = "product-service",configuration = CustomLoadBalancerConfiguration.class)
@Configuration
public class BeanConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
相关推荐
椰椰椰耶1 天前
[SpringCloud][13]OpenFeign快速上手
后端·spring·spring cloud
我登哥MVP1 天前
SpringCloud 核心组件解析:服务熔断和降级
java·spring boot·后端·spring·spring cloud·java-ee·maven
我登哥MVP1 天前
SpringCloud 核心组件解析:服务网关
java·spring boot·后端·spring·spring cloud·java-ee·maven
Flying_Fish_roe1 天前
springcloud-Eureka的原理
spring·spring cloud·eureka
我登哥MVP2 天前
SpringCloud 核心组件解析:服务链路追踪
java·spring boot·后端·spring·spring cloud·java-ee·maven
budingxiaomoli2 天前
优雅的实现远程调用--OpenFeign
spring cloud
我登哥MVP2 天前
SpringCloud 核心组件解析:服务调用和负载均衡
java·spring boot·后端·spring·spring cloud·java-ee·负载均衡
爱吃牛肉的大老虎2 天前
SpringCloud之负载均衡 Ribbon和LoadBalancer讲解
spring cloud·ribbon·负载均衡
运维瓦工3 天前
DevOps 生态介绍(十):Docker Compose 核心 YAML 配置详解与常用命令大全
spring cloud·docker·容器