当前位置: 首页 > news >正文

Spring Cloud面试题

Spring Cloud面试题

基础概念

Q1: Spring Cloud的核心组件有哪些?

public class SpringCloudBasicDemo {
    // 1. 服务注册与发现
    public class ServiceRegistrationExample {
        public void registrationDemo() {
            @SpringBootApplication
            @EnableEurekaServer
            public class EurekaServerApplication {
                public static void main(String[] args) {
                    SpringApplication.run(EurekaServerApplication.class, args);
                }
            }
            
            @SpringBootApplication
            @EnableDiscoveryClient
            public class ServiceApplication {
                @Bean
                @LoadBalanced
                public RestTemplate restTemplate() {
                    return new RestTemplate();
                }
                
                @Bean
                public DiscoveryClient.DiscoveryClientOptionalArgs discoveryClientOptionalArgs() {
                    DiscoveryClient.DiscoveryClientOptionalArgs args = new DiscoveryClient.DiscoveryClientOptionalArgs();
                    args.setEurekaJerseyClient(eurekaJerseyClientBuilder().build());
                    return args;
                }
            }
        }
    }
    
    // 2. 配置中心
    public class ConfigServerExample {
        public void configDemo() {
            @SpringBootApplication
            @EnableConfigServer
            public class ConfigServerApplication {
                public static void main(String[] args) {
                    SpringApplication.run(ConfigServerApplication.class, args);
                }
            }
            
            @RefreshScope
            @RestController
            public class ConfigClientController {
                @Value("${config.property}")
                private String configProperty;
                
                @GetMapping("/config")
                public String getConfig() {
                    return configProperty;
                }
            }
        }
    }
}

Q2: Spring Cloud的服务调用方式有哪些?

public class ServiceCallDemo {
    // 1. Feign调用
    public class FeignExample {
        public void feignDemo() {
            @FeignClient(name = "user-service")
            public interface UserClient {
                @GetMapping("/users/{id}")
                User getUser(@PathVariable("id") Long id);
                
                @PostMapping("/users")
                User createUser(@RequestBody User user);
            }
            
            @Service
            public class UserService {
                @Autowired
                private UserClient userClient;
                
                public User getUser(Long id) {
                    return userClient.getUser(id);
                }
            }
        }
    }
    
    // 2. RestTemplate调用
    public class RestTemplateExample {
        public void restTemplateDemo() {
            @Configuration
            public class RestConfig {
                @Bean
                @LoadBalanced
                public RestTemplate restTemplate() {
                    return new RestTemplate();
                }
            }
            
            @Service
            public class UserService {
                @Autowired
                private RestTemplate restTemplate;
                
                public User getUser(Long id) {
                    return restTemplate.getForObject(
                        "http://user-service/users/{id}",
                        User.class,
                        id);
                }
            }
        }
    }
}

高级特性

Q3: Spring Cloud的服务熔断和降级是怎样的?

public class CircuitBreakerDemo {
    // 1. Hystrix配置
    public class HystrixExample {
        public void hystrixDemo() {
            @EnableCircuitBreaker
            @SpringBootApplication
            public class Application {
                public static void main(String[] args) {
                    SpringApplication.run(Application.class, args);
                }
            }
            
            @Service
            public class UserService {
                @HystrixCommand(
                    fallbackMethod = "getDefaultUser",
                    commandProperties = {
                        @HystrixProperty(
                            name = "circuitBreaker.requestVolumeThreshold",
                            value = "20"),
                        @HystrixProperty(
                            name = "circuitBreaker.errorThresholdPercentage",
                            value = "50"),
                        @HystrixProperty(
                            name = "circuitBreaker.sleepWindowInMilliseconds",
                            value = "5000")
                    })
                public User getUser(Long id) {
                    return userClient.getUser(id);
                }
                
                public User getDefaultUser(Long id) {
                    return new User(id, "默认用户");
                }
            }
        }
    }
    
    // 2. Resilience4j配置
    public class Resilience4jExample {
        public void resilience4jDemo() {
            @Configuration
            public class Resilience4jConfig {
                @Bean
                public CircuitBreakerRegistry circuitBreakerRegistry() {
                    CircuitBreakerConfig config = CircuitBreakerConfig.custom()
                        .failureRateThreshold(50)
                        .waitDurationInOpenState(Duration.ofMillis(1000))
                        .slidingWindowSize(2)
                        .build();
                    
                    return CircuitBreakerRegistry.of(config);
                }
            }
            
            @Service
            public class UserService {
                private final CircuitBreaker circuitBreaker;
                private final UserClient userClient;
                
                public User getUser(Long id) {
                    return circuitBreaker.executeSupplier(
                        () -> userClient.getUser(id));
                }
            }
        }
    }
}

Q4: Spring Cloud的网关服务是怎样的?

public class GatewayDemo {
    // 1. Gateway配置
    public class GatewayExample {
        public void gatewayDemo() {
            @SpringBootApplication
            @EnableDiscoveryClient
            public class GatewayApplication {
                @Bean
                public RouteLocator customRouteLocator(
                    RouteLocatorBuilder builder) {
                    return builder.routes()
                        .route("user_route", r -> r
                            .path("/users/**")
                            .filters(f -> f
                                .stripPrefix(1)
                                .addRequestHeader("X-Request-Id",
                                    UUID.randomUUID().toString()))
                            .uri("lb://user-service"))
                        .route("order_route", r -> r
                            .path("/orders/**")
                            .filters(f -> f
                                .stripPrefix(1)
                                .addResponseHeader("X-Response-Time",
                                    LocalDateTime.now().toString()))
                            .uri("lb://order-service"))
                        .build();
                }
            }
        }
    }
    
    // 2. 过滤器配置
    public class FilterExample {
        public void filterDemo() {
            @Component
            public class CustomGlobalFilter implements GlobalFilter, 
                Ordered {
                
                @Override
                public Mono<Void> filter(
                    ServerWebExchange exchange,
                    GatewayFilterChain chain) {
                    exchange.getResponse().getHeaders()
                        .add("X-Response-Id", 
                            UUID.randomUUID().toString());
                    return chain.filter(exchange);
                }
                
                @Override
                public int getOrder() {
                    return -1;
                }
            }
            
            @Component
            public class AuthorizationFilter implements GlobalFilter {
                @Override
                public Mono<Void> filter(
                    ServerWebExchange exchange,
                    GatewayFilterChain chain) {
                    String token = exchange.getRequest()
                        .getHeaders()
                        .getFirst("Authorization");
                    
                    if (token == null) {
                        exchange.getResponse().setStatusCode(
                            HttpStatus.UNAUTHORIZED);
                        return exchange.getResponse().setComplete();
                    }
                    
                    return chain.filter(exchange);
                }
            }
        }
    }
}

Q5: Spring Cloud的配置中心实现是怎样的?

public class ConfigCenterDemo {
    // 1. Config Server
    public class ConfigServerExample {
        public void configServerDemo() {
            @EnableConfigServer
            @SpringBootApplication
            public class ConfigServerApplication {
                @Bean
                public EnvironmentRepository environmentRepository() {
                    return new NativeEnvironmentRepository(
                        new Environment("native"));
                }
            }
            
            // 配置文件加密
            @Configuration
            public class SecurityConfig {
                @Bean
                public TextEncryptor textEncryptor() {
                    return new TextEncryptorLocator() {
                        @Override
                        public TextEncryptor locate(String label) {
                            return new AesTextEncryptor("salt");
                        }
                    };
                }
            }
        }
    }
    
    // 2. Config Client
    public class ConfigClientExample {
        public void configClientDemo() {
            @RefreshScope
            @Configuration
            public class DatabaseConfig {
                @Value("${spring.datasource.url}")
                private String url;
                
                @Value("${spring.datasource.username}")
                private String username;
                
                @Value("${spring.datasource.password}")
                private String password;
                
                @Bean
                public DataSource dataSource() {
                    return DataSourceBuilder
                        .create()
                        .url(url)
                        .username(username)
                        .password(password)
                        .build();
                }
            }
            
            @RefreshScope
            @RestController
            public class ConfigController {
                @Value("${custom.property}")
                private String customProperty;
                
                @GetMapping("/property")
                public String getProperty() {
                    return customProperty;
                }
            }
        }
    }
}

面试关键点

  1. 理解Spring Cloud的核心组件
  2. 掌握服务调用方式
  3. 熟悉熔断降级机制
  4. 了解网关服务实现
  5. 掌握配置中心原理
  6. 理解服务注册发现
  7. 注意分布式事务
  8. 关注最佳实践

相关文章:

  • Java Queue实现类面试题
  • 计算机二级c++备考
  • 深入讲解微信小程序 <canvas> 标签的 type=“2d“属性
  • 【R安装包报错】在conda环境下用R语言命令安装R包报错
  • 大模型在手术部位感染预测及围手术期管理中的应用研究
  • 【Java】—— 二叉树
  • JavaScript对象属性描述符
  • GreatSQL修改配置文件参数无法生效
  • Android 老项目 jcenter 库失效
  • Plantsimulation中机器人怎么通过阻塞角度设置旋转135°
  • 【深度学习】矩阵的核心问题解析
  • 嵌入式硬件篇---滤波器
  • 国产编辑器EverEdit - 网工利器:使用“插入序列”批量生成维护命令
  • 速通HTML
  • 拓扑排序的核心算法:BFS应用与实践
  • 哈希表_有效的字母异位词
  • 利用python进行数据分析(重点、易忘点)---第九章绘图和可视化
  • Fisher信息矩阵与Hessian矩阵:区别与联系全解析
  • [250224] Yaak 2.0:Git集成、WebSocket支持、OAuth认证等 | Zstandard v1.5.7 发布
  • Openwrt路由器操作系统
  • 国台办:不管台湾地区领导人讲什么,都改变不了台湾是中国一部分的地位和事实
  • 东南亚五大经济体一季度增长放缓,美国关税大棒或阻全年增长
  • 5月LPR下调:1年期、5年期以上品种均下调10个基点
  • 夜驾遇东北虎隔窗对视?延吉林业局:村里有牛被咬死,保险公司会理赔
  • 广东信宜一座在建桥梁暴雨中垮塌,镇政府:未造成人员伤亡
  • 家庭医生可提前5天预约三甲医院号源,上海常住人口签约率达45%,