[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();
    }
}
相关推荐
Rain的Java大神之路2 天前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
需要8262 天前
MySQL 索引 B+ 树与“查询为什么变慢了
java·spring boot·spring·spring cloud·tomcat
需要8262 天前
Arthas 一个命令排查线上问题
java·jvm·spring·spring cloud
苏渡苇3 天前
Spring Insight 里如何把 Span 画成瀑布时间线
后端·spring·spring cloud·springboot·监控·apm
叶总没有会3 天前
Nacos—注册中心
spring cloud·微服务
苏渡苇4 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring·spring cloud·系统监控·apm
叶总没有会4 天前
微服务--分布式基础
java·spring·spring cloud·微服务
孙启超5 天前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust
行百里er6 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring cloud·监控
砍材农夫6 天前
spring|spring web|拦截器、过滤器、aop
java·spring boot·spring·spring cloud