Spring Cloud面试题
基础概念
Q1: Spring Cloud的核心组件有哪些?
public class SpringCloudBasicDemo {
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;
}
}
}
}
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 {
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);
}
}
}
}
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 {
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, "默认用户");
}
}
}
}
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 {
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();
}
}
}
}
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 {
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");
}
};
}
}
}
}
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;
}
}
}
}
}
面试关键点
- 理解Spring Cloud的核心组件
- 掌握服务调用方式
- 熟悉熔断降级机制
- 了解网关服务实现
- 掌握配置中心原理
- 理解服务注册发现
- 注意分布式事务
- 关注最佳实践