面试官:请描述Spring Cloud中如何实现服务间负载均衡? xbhog:通过Ribbon和RestTemplate的集成,在调用服务时从Eureka注册中心获取服务实例列表,结合内置的策略(轮询/随机)选择目标节点,并通过Retry机制处理失败。例如配置@LoadBalanced的RestTemplate来实现代理请求。
面试官(微笑):不错。那服务雪崩如何预防? xbhog:采用Hystrix的断路器机制,当某服务调用失败次数超过阈值时,断路器会打开改走降级逻辑。配合隔离策略(线程/信号量),并可通过仪表盘Hystrix Dashboard监控状态。
面试官:很好!谈谈Kafka消费者重复消费的规避方式。 xbhog:需开启自动提交offset或手动ACK。业务要有幂等性设计,如IDEMPOTENCE_ID字段去重。在事务型场景可用Exactly-Once语义结合数据库状态存储。
面试官:回答标准。解释JWT如何与Spring Security集成实现自定义权限? xbhog:通过自定义TokenStore和WebSecurityConfigurerAdapter,覆盖configure(HttpSecurity http)方法。使用@KeyHints注解自定义验证逻辑,校验JWT中的roles字段控制接口访问。
面试官:最后一问!MyBatis动态SQL实现分页的替代方案? xbhog:可使用RowBounds对象进行简单分页,或直接编写limit + offset语句。复杂场景推荐分页插件PageHelper,在拦截ParametersHandler时自动添加分页逻辑,支持物理分页与逻辑分页切换。
面试官(起身握手):回答专业,我们会在3个工作日内通知您。
在服务消费者端通过FeignClient与Ribbon结合,如声明接口:
@FeignClient("user-service")
public interface UserFeignClient {
@GetMapping("/users/{id}")
User getUserById(@PathVariable("id") String id);
}
配合RibbonClientConfiguration自定义负载策略
使用@KafkaListener容器,设置Acknowledgment手动ACK:
public void consume(String message, Acknowledgment ack) {
processMessage(message);
ack.acknowledge(); // 处理成功才提交offset
}
需要确保业务逻辑ACID特性
在SecurityConfig中配置:
http.authorizeRequests().antMatchers("/api/**").access("hasRole('ROLE_USER')");
http.httpBasic().disable();
http.addFilterBefore(jwtFilter(), UsernamePasswordAuthenticationFilter.class);
需自定义JwtAuthenticationFilter处理header验证
在Service层调用前添加分页参数:
PageHelper.startPage(1, 10);
List users = userMapper.selectAll();
PageInfo page = new PageInfo<>(users);
该插件通过拦截Executor的query过程实现物理分页优化
@ParameterizedTest
@MethodSource("userTestData")
void testUserValidation(String username, boolean expected) {
...
}
private static Stream userTestData() {
return Stream.of(
Arguments.of("xbhog", true),
Arguments.of("", false)
);
}
支持返回任意Supplier或 streams数据源