一、Spring Cloud簡介
Spring Cloud是基於Spring Boot的一系列框架,用於構建分佈式系統的應用程序,可以很方便地提供眾多的微服務開發組件,比如註冊中心、配置中心、服務網關等等。
Spring Cloud包括了多個子項目,幫助開發者快速搭建分佈式應用系統,其中包括Eureka、Ribbon、Feign、Hystrix、Zuul等等。
下面我們就針對Spring Cloud面試中一些常見的問題來一一進行解答。
二、Spring Cloud面試題詳解
1、Spring Cloud的核心組件有哪些?
// 代碼示例1 /** * Spring Cloud核心組件 */ @EnableEurekaServer // 服務註冊中心 @EnableZuulProxy // API網關 @EnableDiscoveryClient // 服務發現 @EnableConfigServer // 分佈式配置中心 @EnableFeignClients // 基於Http請求的服務調用 @EnableHystrix // 熔斷器 @EnableTurbine // 熔斷器聚合
這裡介紹了Spring Cloud的7個核心組件。
(1)服務註冊中心:如Eureka、Consul等等(spring-cloud-starter-eureka、spring-cloud-starter-consul)
(2)API網關:如Zuul、Spring Cloud Gateway等等(spring-cloud-starter-zuul、spring-cloud-starter-gateway)
(3)服務發現:如Ribbon、Spring Cloud Discovery等等(spring-cloud-starter-ribbon、spring-cloud-starter-discovery)
(4)分佈式配置中心:如Spring Cloud Config等等(spring-cloud-starter-config)
(5)基於Http請求的服務調用:如Feign、RestTemplate等等(spring-cloud-starter-feign、spring-cloud-starter-rest-template)
(6)熔斷器:如Hystrix、Resilience4j等等(spring-cloud-starter-hystrix、spring-cloud-starter-resilience4j)
(7)熔斷器聚合:如Turbine等等(spring-cloud-starter-turbine)。
2、Spring Cloud的服務治理是怎樣實現的?
// 代碼示例2 /** * Eureka註冊中心 */ @EnableEurekaClient @EnableDiscoveryClient @SpringBootApplication public class ServiceProviderApplication { public static void main(String[] args) { SpringApplication.run(ServiceProviderApplication.class, args); } } /** * Feign調用服務 */ @FeignClient(value = "service-provider") public interface ServiceProviderInterface { @GetMapping("/hello") String hello(); } /** * 服務消費者 */ @RestController public class ServiceConsumerController { private final ServiceProviderInterface serviceProviderInterface; public ServiceConsumerController(ServiceProviderInterface serviceProviderInterface) { this.serviceProviderInterface = serviceProviderInterface; } @GetMapping("/test") public String test() { return serviceProviderInterface.hello(); } }
Spring Cloud的服務治理是由註冊中心和服務發現組件共同實現的,其中註冊中心主要是負責服務的註冊和發現,而服務發現則是用於定位到目標服務實例。
Spring Cloud中提供了Eureka、Consul等多個註冊中心實現方案,其中Eureka是比較常見的選擇。我們在服務提供者中使用@EnableEurekaClient註解來激活Eureka客戶端,@EnableDiscoveryClient註解用於服務發現。為了調用服務,我們使用Feign客戶端向Eureka註冊的服務發起請求。服務消費者中通過@EnableFeignClients註解激活Feign客戶端,向服務提供者發起請求。
3、Spring Cloud Feign和RestTemplate有什麼區別?
Feign和RestTemplate都是用於進行Http請求的工具,其中Feign是Spring Cloud中推薦使用的工具。
在使用上,RestTemplate必須先定義請求Url,而Feign則是先定義一個接口定義,然後通過註解來定義接口對應的請求Url、請求參數等等。Feign相較於RestTemplate的優勢在於,Feign的入口定義了請求的入參和出參,可以更好地實現對服務的解耦。
同時在實現上,Feign通過Ribbon來實現客戶端的負載均衡,可以更好地分攤流量,提高應用系統的性能。
4、Spring Cloud中Hystrix的作用是什麼?
Hystrix是一種熔斷器,用於防止分佈式應用系統中的「雪崩效應」。當服務不可用或者時間過長時,Hystrix會直接返回一個快速失敗的結果,從而避免資源的長時間佔用,保證其他服務可以良好地工作。
Hystrix提供了良好的降級機制,當服務出現故障時,可以將請求轉發到其他可用的服務或直接返回默認的響應結果。
// Hystrix的使用 @HystrixCommand(fallbackMethod = "helloFallback") @GetMapping("/hello") public String hello() { // 調用服務 } /** * Hystrix熔斷器fallback方法 */ public String helloFallback() { return "error"; }
5、Spring Cloud中的Zuul網關是用來做什麼的?
Zuul是一種API網關,用於在服務端點之間進行路由、負載均衡、安全控制等操作,可以實現各種類型的服務訪問和協議轉換。
在Spring Cloud中,Zuul通過簡單配置,就可以實現微服務架構中的智能路由、彈性負載均衡等等特性。
// Zuul網關 @EnableZuulProxy public class ZuulServerApplication { public static void main(String[] args) { SpringApplication.run(ZuulServerApplication.class, args); } @Bean public AuthPreFilter authPreFilter() { return new AuthPreFilter(); } @Bean public AuthPostFilter authPostFilter() { return new AuthPostFilter(); } } /** * 自定義Zuul Filter */ public class AuthPreFilter extends ZuulFilter { @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 1; } @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException { // 權限校驗 } } public class AuthPostFilter extends ZuulFilter { // ... }
三、總結
Spring Cloud是一套分佈式應用開發的解決方案,其中包括了多個子項目,可以大大降低微服務架構的複雜度,方便開發者快速構建高性能、高可用性的分佈式應用程序。在面試中,需要對Spring Cloud的核心組件有深入的了解,同時對於Feign、RestTemplate、Hystrix、Zuul等等組件的使用和原理也需要有一定的了解。
原創文章,作者:ICYND,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/371657.html