面试题答案
一键面试Ribbon
- 原理:
- Ribbon是一个客户端负载均衡器,它从Eureka Server获取服务实例列表。
- 基于一定的负载均衡算法(如轮询、随机等),在本地维护一个可用服务实例清单。当客户端发起请求时,Ribbon会根据负载均衡算法从清单中选择一个实例来发送请求。
- 使用方式:
- 在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
- 原理:
- Feign是一个声明式的Web服务客户端,它整合了Ribbon和Hystrix(默认开启,可配置关闭)。
- 它通过接口加注解的方式定义服务调用,在编译时生成动态代理,通过动态代理调用服务。同时借助Ribbon实现负载均衡,从Eureka Server获取服务实例列表,按负载均衡算法选择实例调用。
- 使用方式:
- 引入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客户端接口并使用。
区别
- 调用方式:
- Ribbon是基于RestTemplate进行服务调用,需要手动拼接URL、处理参数等。
- Feign通过接口和注解的方式声明式调用,更简洁直观,代码可读性更好。
- 功能集成:
- Ribbon专注于负载均衡。
- Feign除了负载均衡,还集成了Hystrix实现服务熔断、降级等功能(默认开启),功能更丰富。
- 学习成本:
- Ribbon使用起来相对复杂,需要了解RestTemplate以及负载均衡相关配置。
- Feign声明式的调用方式,对开发人员更友好,学习成本低。