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

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

Spring Cloud 技術體系

  • 分佈式配置
  • 服務註冊/發現
  • 路由
  • 服務調用
  • 負載均衡
  • 短路保護
  • 分佈式消息

Spring 事件機制

設計模式

  • 觀察者模式(發佈/訂閱)

API: java.util.Observable , java.util.Observerspring

發佈者經過 observable.notifyObservers() 通知, 訂閱者是被動感知的. 這種模式是推模式. 而迭代器Iterator 是拉模式, 經過循環主動獲取.bootstrap

  • 事件/監聽器模式

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 對象.app

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 數據結構ide

public class MutablePropertySources implements PropertySources {
    // 使用了 CopyOnWriteArrayList
    private final List<PropertySource<?>> propertySourceList = new CopyOnWriteArrayList<>();
    ...
}
相關文章
相關標籤/搜索