中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

spring cloud config如何實現datasource熱部署

發布時間:2021-08-06 11:26:32 來源:億速云 閱讀:163 作者:小新 欄目:編程語言

這篇文章主要介紹spring cloud config如何實現datasource熱部署,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

spring cloud config整合gitlab搭建分布式的配置中心

spring cloud config分布式配置中心的高可用

我們的重點是如何實現數據源的熱部署。

1、在客戶端配置數據源

@RefreshScope 
@Configuration// 配置數據源 
public class DataSourceConfigure { 
 
  @Bean 
  @RefreshScope// 刷新配置文件 
  @ConfigurationProperties(prefix="spring.datasource") // 數據源的自動配置的前綴 
  public DataSource dataSource(){ 
    return DataSourceBuilder.create().build(); 
  } 
}

通過上面的幾個步驟,就可以實現在gitlab上修改配置文件,刷新后,服務器不用重啟,新的數據源就會生效。

2、自定義數據源的熱部署

當我們使用spring boot集成druid,我們需要手動來配置數據源,代碼如下:

package com.chhliu.springcloud.config;  
import java.sql.SQLException; 
import javax.sql.DataSource; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.cloud.context.config.annotation.RefreshScope; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Primary;  
import com.alibaba.druid.pool.DruidDataSource; 
import lombok.extern.slf4j.Slf4j; 
 
/** 
 * 
 * 描述:如果不使用代碼手動初始化DataSource的話,監控界面的SQL監控會沒有數據("是spring boot的bug???") 
 * @author chhliu 
 * 創建時間:2017年2月9日 下午7:33:08 
 * @version 1.2.0 
 */ 
@Slf4j 
@Configuration 
@RefreshScope 
public class DruidConfiguration { 
  @Value("${spring.datasource.url}") 
  private String dbUrl; 
  @Value("${spring.datasource.username}") 
  private String username; 
  @Value("${spring.datasource.password}") 
  private String password; 
  @Value("${spring.datasource.driverClassName}") 
  private String driverClassName; 
  @Value("${spring.datasource.initialSize}") 
  private int initialSize; 
  @Value("${spring.datasource.minIdle}") 
  private int minIdle; 
  @Value("${spring.datasource.maxActive}") 
  private int maxActive; 
  @Value("${spring.datasource.maxWait}") 
  private int maxWait; 
  @Value("${spring.datasource.timeBetweenEvictionRunsMillis}") 
  private int timeBetweenEvictionRunsMillis; 
  @Value("${spring.datasource.minEvictableIdleTimeMillis}") 
  private int minEvictableIdleTimeMillis; 
  @Value("${spring.datasource.validationQuery}") 
  private String validationQuery; 
  @Value("${spring.datasource.testWhileIdle}") 
  private boolean testWhileIdle; 
  @Value("${spring.datasource.testOnBorrow}") 
  private boolean testOnBorrow; 
  @Value("${spring.datasource.testOnReturn}") 
  private boolean testOnReturn; 
  @Value("${spring.datasource.poolPreparedStatements}") 
  private boolean poolPreparedStatements; 
  @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}") 
  private int maxPoolPreparedStatementPerConnectionSize; 
  @Value("${spring.datasource.filters}") 
  private String filters; 
  @Value("${spring.datasource.connectionProperties}") 
  private String connectionProperties; 
  @Value("${spring.datasource.useGlobalDataSourceStat}") 
  private boolean useGlobalDataSourceStat; 
 
  @Bean   //聲明其為Bean實例 
  @Primary //在同樣的DataSource中,首先使用被標注的DataSource 
  @RefreshScope 
  public DataSource dataSource(){ 
    DruidDataSource datasource = new DruidDataSource(); 
    datasource.setUrl(this.dbUrl); 
    datasource.setUsername(username); 
    datasource.setPassword(password); 
    datasource.setDriverClassName(driverClassName); 
 
    //configuration 
    datasource.setInitialSize(initialSize); 
    datasource.setMinIdle(minIdle); 
    datasource.setMaxActive(maxActive); 
    datasource.setMaxWait(maxWait); 
    datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); 
    datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); 
    datasource.setValidationQuery(validationQuery); 
    datasource.setTestWhileIdle(testWhileIdle); 
    datasource.setTestOnBorrow(testOnBorrow); 
    datasource.setTestOnReturn(testOnReturn); 
    datasource.setPoolPreparedStatements(poolPreparedStatements); 
    datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); 
    datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat); 
    try { 
      datasource.setFilters(filters); 
    } catch (SQLException e) { 
      log.error("druid configuration initialization filter: "+ e); 
    } 
    datasource.setConnectionProperties(connectionProperties); 
    return datasource; 
  } 
}

通過上面的示例,也可以實現數據源的動態刷新。接下來,我們就來看看,spring cloud config是怎么來實現數據源的熱部署的。

從前面的博客中,我們不難發現,要想實現動態刷新,關鍵點就在post refresh的請求上,那我們就從刷新配置文件開始。
當我們post刷新請求的時候,這個請求會被actuator模塊攔截,這點從啟動的日志文件中就可以看出

復制代碼 代碼如下:


Mapped "{[/refresh || /refresh.json],methods=[POST]}" onto public java.lang.Object org.springframework.cloud.endpoint.GenericPostableMvcEndpoint.invoke() 

接下來,我們就來看actuator定義的EndPoint,然后我們就找到了RefreshEndpoint這個類,該類的源碼如下:

@ConfigurationProperties(prefix = "endpoints.refresh", ignoreUnknownFields = false) 
@ManagedResource 
public class RefreshEndpoint extends AbstractEndpoint<Collection<String>> { 
   private ContextRefresher contextRefresher; 
   public RefreshEndpoint(ContextRefresher contextRefresher) { 
    super("refresh"); 
    this.contextRefresher = contextRefresher; 
  }  
  @ManagedOperation 
  public String[] refresh() { 
    Set<String> keys = contextRefresher.refresh(); 
    return keys.toArray(new String[keys.size()]); 
  } 
   @Override 
  public Collection<String> invoke() { 
    return Arrays.asList(refresh()); 
  }  
}

從上面的源碼,我們可以看到,重點在ContextRefresher這個類上,由于這個類太長了,下面把這個類的部分源碼貼出來:

private RefreshScope scope; 
   public ContextRefresher(ConfigurableApplicationContext context, RefreshScope scope) { 
    this.context = context; 
    this.scope = scope; 
  }  
  public synchronized Set<String> refresh() { 
    Map<String, Object> before = extract( 
        this.context.getEnvironment().getPropertySources());// 1、before,加載提取配置文件 
    addConfigFilesToEnvironment();// 2、將配置文件加載到環境中 
    Set<String> keys = changes(before, 
        extract(this.context.getEnvironment().getPropertySources())).keySet();// 3、替換原來環境變量中的值 
    this.context.publishEvent(new EnvironmentChangeEvent(keys));// 4、發布變更事件, 
    this.scope.refreshAll(); 
    return keys; 
  }

以上是“spring cloud config如何實現datasource熱部署”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岳西县| 海门市| 永州市| 富顺县| 平乡县| 大同市| 微山县| 桐城市| 滨海县| 顺义区| 福海县| 金昌市| 景洪市| 宜都市| 阿拉善右旗| 晋中市| 阳朔县| 阳新县| 隆尧县| 怀化市| 河北省| 蒙城县| 中卫市| 扎兰屯市| 商丘市| 句容市| 大悟县| 德令哈市| 昔阳县| 大名县| 密山市| 社旗县| 蓬莱市| 成都市| 曲阜市| 都昌县| 大石桥市| 霍林郭勒市| 东乌珠穆沁旗| 铜山县| 张家川|