MST

星途 面试题库

面试题:微服务架构下Spring Cloud如何实现服务间的负载均衡

在Spring Cloud微服务架构中,详细阐述Ribbon和Feign在实现服务间负载均衡时的原理与使用方式,它们之间有什么区别?
21.1万 热度难度
后端开发微服务架构

知识考点

AI 面试

面试题答案

一键面试

Ribbon

  1. 原理
    • Ribbon是一个客户端负载均衡器,它从Eureka Server获取服务实例列表。
    • 基于一定的负载均衡算法(如轮询、随机等),在本地维护一个可用服务实例清单。当客户端发起请求时,Ribbon会根据负载均衡算法从清单中选择一个实例来发送请求。
  2. 使用方式
    • 在Spring Boot项目中引入Ribbon依赖。
    • 配置Ribbon客户端,通过@RibbonClient注解指定服务名称及相关配置。例如:
@RibbonClient(name = "service - name", configuration = MyRibbonConfig.class)
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
- 在RestTemplate上添加`@LoadBalanced`注解,使其具备负载均衡能力,例如:
@Configuration
public class RestConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

然后就可以使用restTemplate调用服务,Ribbon会自动进行负载均衡。

Feign

  1. 原理
    • Feign是一个声明式的Web服务客户端,它整合了Ribbon和Hystrix(默认开启,可配置关闭)。
    • 它通过接口加注解的方式定义服务调用,在编译时生成动态代理,通过动态代理调用服务。同时借助Ribbon实现负载均衡,从Eureka Server获取服务实例列表,按负载均衡算法选择实例调用。
  2. 使用方式
    • 引入Feign依赖。
    • 使用@EnableFeignClients注解开启Feign功能,例如:
@EnableFeignClients
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
- 定义Feign客户端接口,使用注解定义请求参数、路径等,例如:
@FeignClient(name = "service - name")
public interface UserFeignClient {
    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}

然后在业务代码中注入Feign客户端接口并使用。

区别

  1. 调用方式
    • Ribbon是基于RestTemplate进行服务调用,需要手动拼接URL、处理参数等。
    • Feign通过接口和注解的方式声明式调用,更简洁直观,代码可读性更好。
  2. 功能集成
    • Ribbon专注于负载均衡。
    • Feign除了负载均衡,还集成了Hystrix实现服务熔断、降级等功能(默认开启),功能更丰富。
  3. 学习成本
    • Ribbon使用起来相对复杂,需要了解RestTemplate以及负载均衡相关配置。
    • Feign声明式的调用方式,对开发人员更友好,学习成本低。