什么是 Spring Cloud ?

springcloudalibaba面试题2024_spring cloud

Spring Cloud  应用程序启动器是基于启动器 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成。
Spring Cloud Task ,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。

使用 Spring Cloud 有什么 优势

Spring Cloud 拥有一整套微服务的解决方案,基于 Spring Boot 可实现快速集成,且开发效率很高,故其堪称中小型互联网公司的福音。
Spring Cloud 发布新功能的频率非常高,目前仅是大版本就有很多个,同时还有庞大的社区支持。
Spring Cloud 关注的是整个服务架构会涉及的方方面面,在 Spring Cloud 中各种组件应有尽有,从而使其具有可快速集成、方便、成本低等优势。

服务注册和发现 是什么意思 ? Spring Cloud 如何实现

当我们开始一个项目时,我们通常在属性文件中进行所有的配置。
随着越来越多的服务开发和部署,添加和修改这些属性变得更加复杂。
有些服务可能会下降,而某些位置可能会发生变化。手动更改属性可能会产生问题。
EureKa 服务注册和发现可以在这种情况下提供帮助。由于所有服务都在 Eureka 服务器上注册并通过调用 Eureka 服务器完成查找,因此无需处理服务地点的任何更改和处理。

负载平衡的意义

负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。
负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载,使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。
负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。

什么是 Hystrix ? 它如何 实现容错

Hystrix 是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点。
当出现故障是不可避免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。

通常对于使用微服务架构开发的系统,涉及到许多微服务,这些微服务彼此协作。

思考以下微服务

springcloudalibaba面试题2024_Cloud_02


假设如果上图中的微服务 9 失败了,那么使用传统方法我们将传播一个异常,但仍然会导致整个系统崩溃。

随着微服务数量的增加,整个问题变得更加复杂。微服务的数量可以高达1000。
这是 Hystrix 出现的地方 ,我们可以将使用 Hystrix 在这种情况下的 Fallback 方法功能。

举例 :
两个服务 employee-consumer 使用由 employee-consumer 公开的服务。
简化图如下:

springcloudalibaba面试题2024_微服务_03


假设 employee-producer 公开的服务会抛出异常。

我们在这种情况下使用 Hystrix 定义了一个回退方法。

这种后备方法应该具有与公开服务相同的返回类型。

如果暴露服务中出现异常,则回退方法将返回一些值。

什么是 Hystrix 断路器

由于某些原因,employee-consumer 公开服务会引发异常。
在这种情况下使用 Hystrix 我们定义了一个回退方法。
如果公开服务中发生异常,则回退方法返回一些默认值。

springcloudalibaba面试题2024_Cloud_04


如果 firstPage method() 中的异常继续发生,则 Hystrix 电路将中断,并且员工使用者将一起跳过 firstPage 方法,并直接调用回退方法。

断路器的目的是给第一页方法或第一页方法可能调用的其他方法流出时间,并导致异常恢复。

可能发生的情况是,在负载较小的情况下,导致异常的问题有更好的恢复机会。

springcloudalibaba面试题2024_Cloud_05

什么是 Netflix Feign ? 它的 优点 是什么 ?

Feign 是受到 Retrofit,JAXRS-2.0 和 WebSocket 启发的 Java 客户端联编程序。
Feign 的第一个目标是将约束分母的复杂性统一到 http apis ,而不考虑其稳定性。

在 employee-consumer 的例子中,我们使用了 employee-producer 使用 REST 模板公开的 REST 服务。

但是我们必须编写大量代码才能执行以下步骤

① 使用功能区进行负载平衡 。
② 获取服务实例,然后获取基本 URL 。
③ 利用 REST模板来使用服务 。

代码如下

@Controller
public class ConsumerControllerClient {

		@Autowired
		private LoadBalancerClient loadBalancer;
		
public void getEmployee() throws RestClientException, IOException {

	ServiceInstance serviceInstance=loadBalancer.choose("employee-producer");
	
	System.out.println(serviceInstance.getUri());
	
	String baseUrl=serviceInstance.getUri().toString();
	
	baseUrl=baseUrl+"/employee";
	
	RestTemplate restTemplate = new RestTemplate();
	
	ResponseEntity<String> response=null;
	
	try{

response=restTemplate.exchange(baseUrl,HttpMethod.GET,getHeaders(),String.class);

	}catch (Exception ex){
	
		System.out.println(ex);
		
	}
	
	System.out.println(response.getBody());
	
}

之前的代码,有像 NullPointer 这样的例外的机会,并不是最优的 。
我们将看到如何使用 Netflix Fegin 使呼叫变得更加轻松和清洁。
如果 Netflix Ribbon 依赖关系也在类路径中,那么 Fegin默认也会负责负载平衡 。

什么是 Spring Cloud Bus

Spring Cloud Bus 提供了跨多个实例刷新配置的功能。

举例

(多个员工生产者模块从 Employee Config Module 获取 Eureka 注册的财产)

我们有多个应用程序使用 Spring Cloud Config 读取属性,而Spring Cloud Config 从 GIT 读取这些属性。

springcloudalibaba面试题2024_微服务_06


如果假设 GIT 中的 Eureka 注册属性更改为指向另一台 Eureka 服务器,会发生什么情况。

在这种情况下,我们将不得不重新启动服务以获取更新的属性。

还有另一种使用执行器端点/刷新的方式。但是我们将不得不为每个模块单独调用这个 url。

例如:

如果 Employee Producer1 部署在端口 8080 上,则调用 http:
// localhost:8080 / refresh。

同样对于 Employee Producer2 http://localhost:8081 / refresh 等等。这又很麻烦。

这就是 Spring Cloud Bus 发挥作用的地方。

springcloudalibaba面试题2024_spring_07


如果我们刷新 Employee Producer1,则会自动刷新所有其他必需的模块。

如果我们有多个微服务启动并运行,这特别有用。这是通过将所有微服务连接到单个消息代理来实现的。

无论何时刷新实例,此事件都会订阅到侦听此代理的所有微服务,并且它们也会刷新。可以通过使用端点/总线/刷新来实现对任何单个实例的刷新。