Spring Boot系列(四) Spring Cloud 之 Config Client

罪惡斯巴克發表於2019-05-10

Config 是通過 PropertySource 提供. 這節的內容主要是探討配置, 特別是 PropertySource 的載入機制.

Spring Cloud 技術體系

  • 分散式配置
  • 服務註冊/發現
  • 路由
  • 服務呼叫
  • 負載均衡
  • 短路保護
  • 分散式訊息

Spring 事件機制

設計模式

  • 觀察者模式(釋出/訂閱)

API: java.util.Observable , java.util.Observer

釋出者通過 observable.notifyObservers() 通知, 訂閱者是被動感知的. 這種模式是推模式. 而迭代器Iterator 是拉模式, 通過迴圈主動獲取.

  • 事件/監聽器模式

API: 類 java.util.EventObject , 介面 java.util.EventListener, 此介面是一個標識介面, 無方法.

Spring 事件/監聽

ApplicationEvent: 事件. 擴充套件了 EventObject.
ApplicationListener: 事件監聽器, 擴充套件了 EventListener

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
// 註冊監聽器
context.addApplicationLinstener(new ApplicationListener<MyApplicationEvent>(){

    @Override
    public void onApplicationEvent(MyApplicationEvent event){
        System.out.println("接收到事件: " + event.getSource());
    }
});
context.refresh();

// 釋出事件
context.publishEvent(new MyApplicationEvent("test event"));
  • 應用場景

MyApplicationEvent 可以通過構造器等注入 context 物件, 從而能拿到工廠中的任意 bean 物件.

Spring Boot 的核心事件

  • ApplicationEnvironmentPreparedEvent
  • ApplicationPreparedEvent
  • ApplicationStartingEvent
  • ApplicationReadyEvent
  • ApplicationFailedEvent

Spring Boot 事件/監聽器

  • ConfigFileApplicationListener 管理配置檔案, 如 application-{profile}.properties 或 yaml 格式的檔案. 通過下面入口函式找, 可以發現載入配置檔案的 Loader.load() 方法
@Override
public void onApplicationEvent(ApplicationEvent event) {
    if (event instanceof ApplicationEnvironmentPreparedEvent) {
        onApplicationEnvironmentPreparedEvent(
                (ApplicationEnvironmentPreparedEvent) event);
    }
    if (event instanceof ApplicationPreparedEvent) {
        onApplicationPreparedEvent(event);
    }
}

/META-INF/spring.factories 檔案中配置了需要載入的監聽器, 其中包括了 ConfigFileApplicationListener

  • ConfigFileApplicationListener 實現了 Orderd 介面 , 用來控制順序.

Spring Cloud 事件/監聽器

  • BootstrapApplicationListener 第一, 負責載入 bootstrap.properties 或 yaml 格式的檔案. 第二, 負責載入 ApplicationContext 名為 bootstrap( ConfigurableApplicationContext context = builder.run() ).

自定義配置屬性

  1. 繼承 PropertySourceLocator
  2. 向自定義類註解新增 @Ordered , @Configuration
  3. 新增配置到 spring.factories 檔案, key為 org.springwork.cloud.bootstrap.BootstrapConfiguration

Environment 允許出現同名配置, 優先順序高的勝出.

MutablePropertySources 使用了 CopyOnWriteArrayList 資料結構

public class MutablePropertySources implements PropertySources {
    // 使用了 CopyOnWriteArrayList
    private final List<PropertySource<?>> propertySourceList = new CopyOnWriteArrayList<>();
    ...
}

相關文章