SpringCloud快速入门(5)---- 均衡负载

1. LoadBalancerClient

要实现均衡负载我们可以使用springcloud提供的一个类:

复制代码
LoadBalancerClient

引入依赖:

XML 复制代码
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
java 复制代码
@Slf4j
@SpringBootTest
public class loadBalancerClientTest {
    @Autowired
    LoadBalancerClient loadBalancerClient;
    @Test
    void test() {
        for(int i = 0; i < 10; i++) {
            ServiceInstance serviceInstance = loadBalancerClient.choose("servers-product");
            String url =  serviceInstance.getHost() + ":" + serviceInstance.getPort();
            log.info("服务地址:{}", url);
        }
    }
}

loadBalancerClient提供了一个choose方法会自动获取一个服务实例,其中已经实现了均衡负载算法:

2. @LoadBalanced注解

我们可以在发送请求的客户端上加上@LoadBalanced注解这样通过这个客户端发送的请求会自动实现均衡负载:

注意,@LoadBalanced注解不能直接加在变量上,@LoadBalanced 是Spring 扩展注解

只有Spring 容器创建的 Bean 才能被增强。加上注解之后我们通过依赖注入获取到的RestTemplate对象就是已经实现了均衡负载的了并且可以通过服务名调用:

java 复制代码
    public Product getProductFromRemote(Long productId) {
        String url = "http://servers-product/product/" + productId;
        //远程发送请求
        return restTemplate.getForObject(url, Product.class);
    }

@LoadBalanced 给 RestTemplate 加了拦截器,调用时会自动把 服务名 → 真实 IP + 端口

,自动轮询(默认)多个服务实例

面试题1:使用@LoadBalanced 的情况如果注册中心挂了还能调用成功吗?

  • 情况1,之前调用过服务:调用服务时,会把注册中心中已有的服务ip端口存下来,避免每次调用都去实时请求注册中心而损耗过多时间,所以之后的调用会直接沿用缓存中的数据,所以能够成功(本地缓存会定时刷新,如果注册中心长期宕机)
  • 情况2,之前没有调用过服务,发起请求时会去注册中心获取服务数据,但是注册中心挂了所以会失败。

面试题2:本地缓存没过期,注册中心挂了,调用时发现调用的服务挂了会怎么样

  • 不会去请求已经挂掉的 Nacos 注册中心,也不会主动全量刷新服务列表;
  • 只会在当前服务本地内存缓存里,临时剔除这个故障实例;
  • 负载均衡自动切换缓存里其他健康实例重试调用;
  • 如果缓存里所有实例连续调用都失败、判定整个服务集群不可用,才会尝试强制刷新拉取注册中心,但此时注册中心已宕机,拉取不到新列表,最终调用失败。
相关推荐
Demon1_Coder11 分钟前
Day4-微服务-Seata默认事务
java·数据库·微服务
Sunia16 分钟前
《AgentX 专栏》08-工作流引擎:AgentWorkflow怎么把工具记忆流程串成一条流水线
java·架构
huipeng92618 分钟前
企业级微服务开发实战(二):微服务基础设施搭建与中间件部署
java·redis·mysql·spring cloud·微服务·nacos·rabbitmq
Jabes.yang19 分钟前
Java电商订单系统面试全流程解析:接口设计、数据库、微服务与分布式事务实战
java·微服务·mybatis·分布式事务·电商·订单系统·接口设计
码语智行22 分钟前
导入模板下载
java
摇滚侠34 分钟前
IDEA 创建 Java 项目 推送到远程 Git 仓库
java·git·intellij-idea
可乐ea38 分钟前
【知识获取与分享社区项目 | 项目日记第 24 天】终章总结:从认证、发布、计数、Feed、搜索到 RAG:完整复盘一个知识社区后端系统
java·spring boot·redis·mysql·elasticsearch·ai·kafka
Jabes.yang1 小时前
Java面试实录:AIGC场景下的Stream、微服务、Redis、Kafka与安全实战
java·spring boot·redis·微服务·面试·kafka·aigc
lwf0061641 小时前
实战:用 Java 模拟登录阿里云控制台,爬取没有 OpenAPI 的数据
java·阿里云
程序员二叉1 小时前
【Java】 面试核心合集:BigDecimal、缓存池、多态、反射全解析
java·缓存·面试