[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();
    }
}
相关推荐
野蛮人6号3 天前
黑马天机学堂系列问题之域名无法正常使用
java·spring cloud·天机学堂
爱学习的小可爱卢3 天前
SpringCloud——微服务实战:OpenFeign与Nacos服务调用详解
spring·spring cloud·微服务
野蛮人6号4 天前
黑马天机学堂Day01-08.搭建项目环境-本地开发部署方式——不知道nacos的密码是什么
java·spring cloud·黑马程序员·天机学堂·黑马天机学堂
dyonggan4 天前
IDEA从零搭建SpringCloud Alibaba完整工程
java·spring cloud·intellij-idea
tryxr4 天前
Spring Cloud Gateway
java·开发语言·数据库·网关·spring cloud·gateway
码农学院5 天前
建筑机械行业AI搜索优化技术方案:基于Spring Cloud微服务架构的文件管理与智能化内容推荐系统
人工智能·spring cloud·架构
Devin~Y5 天前
互联网大厂Java面试实战:Spring Boot、MyBatis、Redis、Kafka、JWT、Spring Cloud 与 AI 场景追问
java·spring boot·redis·spring cloud·kafka·mybatis·spring security
_waylau5 天前
Spring Framework HTTP服务客户端详解
java·后端·网络协议·spring·http·spring cloud
tryxr5 天前
Spring Cloud eureka
spring·spring cloud·eureka
野蛮人6号6 天前
黑马天机学堂系列问题之选集8本地服务报错
java·spring cloud·黑马程序员·天机学堂·黑马天机学堂