亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

剑川县| 天镇县| 利川市| 明溪县| 遂昌县| 原平市| 锡林郭勒盟| 侯马市| 准格尔旗| 云南省| 天门市| 原平市| 洛宁县| 九寨沟县| 南陵县| 红安县| 梧州市| 洛南县| 九龙城区| 都昌县| 石狮市| 来凤县| 邹平县| 鹤山市| 通城县| 安达市| 仙居县| 靖江市| 云林县| 怀化市| 滦南县| 锦屏县| 响水县| 枣强县| 泸水县| 吴川市| 和田市| 罗山县| 阿勒泰市| 盐边县| 化德县|