面试题答案
一键面试确保配置数据一致性的技术手段和策略
- 版本控制系统
- 原理:使用如Git这样的版本控制系统来存储配置数据。配置文件都保存在Git仓库中,所有环境的配置都基于同一个仓库,通过分支来管理不同环境(如开发、测试、生产)的特定配置。
- 在Spring Cloud Config中的应用:Spring Cloud Config Server可以将Git仓库作为后端存储。它从Git仓库拉取配置文件,无论是哪个环境的请求,都基于这个统一的仓库。例如,在配置文件中指定Git仓库地址:
spring: cloud: config: server: git: uri: https://github.com/your - org/your - config - repo
- 数据校验机制
- 原理:在配置数据加载到配置中心或从配置中心加载到微服务时,进行数据格式和内容的校验。可以使用JSON Schema等工具定义配置数据的合法格式。
- 在Spring Cloud Config中的应用:在微服务端,可以编写自定义的配置处理器。例如,定义一个
@ConfigurationProperties
类,使用@Validated
注解进行校验。
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.NotBlank; @ConfigurationProperties(prefix = "custom.config") @Validated public class CustomConfigProperties { @NotBlank private String requiredProperty; // getters and setters }
- 分布式一致性协议
- 原理:对于一些分布式配置中心,如etcd等,可以利用其内部的分布式一致性协议(如Raft)来确保配置数据在集群中的一致性。这些协议通过选举领导者、日志复制等机制,保证所有节点上的数据一致。
- 在Spring Cloud Config结合etcd的应用:虽然Spring Cloud Config默认使用Git,若结合etcd作为配置存储,可以利用etcd的一致性特性。通过Spring Cloud etcd Config Starter,配置中心从etcd获取配置数据,etcd保证数据在集群内的一致性。
实现动态更新而不影响服务正常运行的技术手段和策略
- Spring Cloud Bus
- 原理:Spring Cloud Bus是一个轻量级的消息总线,它可以连接各个微服务实例。当配置数据发生变化时,通过消息总线广播事件,各个微服务接收到事件后,重新加载配置。
- 在Spring Cloud Config中的应用:首先在微服务和Config Server中引入Spring Cloud Bus依赖。在Config Server端,配置
spring.cloud.bus.enabled=true
。在微服务端,同样配置spring.cloud.bus.enabled=true
。当Git仓库中的配置数据更新后,可以通过发送POST请求到Config Server的/actuator/bus - refresh
端点,触发消息总线事件,各个微服务自动更新配置。
- Actuator端点
- 原理:Spring Boot Actuator提供了一些端点,如
/refresh
,用于手动触发配置的重新加载。在微服务中,当配置中心的配置更新后,可以通过调用这个端点来重新加载配置。 - 在Spring Cloud Config中的应用:在微服务中引入Spring Boot Actuator依赖,并配置暴露
/refresh
端点。例如,在application.properties
中配置management.endpoints.web.exposure.include=refresh
。然后,可以通过发送POST请求到/actuator/refresh
端点来动态更新配置。
- 原理:Spring Boot Actuator提供了一些端点,如
- 长轮询或WebSocket
- 原理:微服务通过长轮询或者WebSocket与配置中心保持连接。配置中心一旦检测到配置数据更新,立即通知微服务,微服务接收到通知后进行配置的重新加载。
- 在Spring Cloud Config中的应用:虽然Spring Cloud Config没有原生直接支持长轮询或WebSocket,但可以通过自定义扩展来实现。例如,可以在配置中心和微服务之间建立WebSocket连接,配置中心使用WebSocket向微服务推送配置更新消息,微服务接收到消息后,调用
@RefreshScope
注解相关的逻辑来重新加载配置。