En ce qui concerne l'utilisation de base de la configuration de Spring Cloud, il a été mentionné dans le blog précédent. Si vous ne comprenez pas, veuillez d'abord lire le blog précédent.
Spring Cloud Config intègre GitLab pour créer un centre de configuration distribué
Haute disponibilité du centre de configuration de configuration de cloud de printemps
Aujourd'hui, nous nous concentrons sur la façon d'atteindre le déploiement à chaud des sources de données.
1. Configurez la source de données sur le client
@RefreshScope @ Configuration // Configurer la source de données Classe publique DataSourceConfigure {@Bean @ Refreshscope // Fichier de configuration de refroidissement @configurationProperties (Prefix = "Spring.Datasource") // Prefix pour la configuration automatique de la source de données de données. }} Grâce aux étapes ci-dessus, vous pouvez modifier le fichier de configuration sur GitLab. Après rafraîchissement, le serveur n'a pas besoin d'être redémarré et la nouvelle source de données prendra effet.
2. Déploiement à chaud de sources de données personnalisées
Lorsque nous utilisons Spring Boot pour intégrer Druid, nous devons configurer manuellement la source de données, le code est le suivant:
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; Importer lombok.extern.slf4j.slf4j; / ** * * Description: Si la source de données n'est pas initialisée manuellement à l'aide du code, la surveillance SQL de l'interface de surveillance n'aura pas de données ("est un bogue de démarrage de Spring ???") * @author chhliu * Créé: 9 février 2017 à 7:33:08 PM * @version 1.2.0 * / @ slf4j @Value ("$ {printemps.datasource.url}") String privé dburl; @Value ("$ {printemps.datasource.username}") Private String Username; @Value ("$ {printemps.datasource.password}") Mot de passe de chaîne privée; @Value ("$ {printemps.datasource.driverClassName}") String private String DriverClassName; @Value ("$ {printemps.datasource.initialSize}") private int initialSize; @Value ("$ {printemps.datasource.minidle}") private int MinIdle; @Value ("$ {printemps.datasource.maxactive}") private int maxactive; @Value ("$ {printemps.datasource.maxwait}") private int maxwait; @Value ("$ {printemps.datasource.timebetweenvictionrunsmillis}") private int timebetweenvictionrunsmillis; @Value ("$ {printemps.datasource.minevictableidleMemillis}") private int minevictableidlememillis; @Value ("$ {printemps.datasource.validationQuery}") private String ValidationQuery; @Value ("$ {printemps.datasource.test WhileIdle}") Test booléen privé WHERIDLE; @Value ("$ {printemps.datasource.testonborrow}") Boolean Private TestOnBorrow; @Value ("$ {printemps.datasource.testonborrow}") Boolean privé testonreturn; @Value ("$ {printemps.datasource.testonborrow}") Boolean PoolPreparedstatements privés; @Value ("$ {printemps.datasource.maxpoolPreparedStatementPerConnectionsize}") private int maxpoolPreparedStatementPerConnectionsize; @Value ("$ {printemps.datasource.filters}") Filtres de chaîne privés; @Value ("$ {printemps.datasource.connectionproperties}") Connexion de chaîne privée PROPERTIES; @Value ("$ {printemps.datasource.UseglobaldatasourCestat}") Boolean privé useglobaldatasourcestat; @Bean // Déclarez-le comme une instance de bean @primary // Dans la même données de données, utilisez d'abord la dataSource annotée @refreshscope publique DataSource dataSource () {druiddatasource dataSource = new DruidDataSource (); DataSource.SetUrl (this.dburl); DataSource.SetUsername (nom d'utilisateur); DataSource.SetPassword (mot de passe); DataSource.setDriverClassName (DriverClassName); // Configuration DataSource.SetInitialSize (initialSize); DataSource.setMinIdle (minidle); dataSource.setMaxActive (maxactive); DataSource.setMaxWait (Maxwait); dataSource.setTimeBetweenvictionRunsmillis (TimeBetweenEvictionRunsMillis); DataSource.setMinevictableIdleMemillis (MineVictableIdleMemillis); DataSource.SetValidationQuery (validationQuery); DataSource.SetTest WhileIdle (Test WhenIdle); DataSource.setTestonBorrow (TestOnBorrow); DataSource.setTestonreturn (testonreturn); DataSource.SetPoolPreparedStatements (PoolPreparedStatements); DataSource.SetMaxPoolPreparedStatementPerConnectionsize (MaxPoolPreparedStatementPerConnectionsize); dataSource.setUseGlobaldataSourCestat (useGlobaldataSourCestat); essayez {dataSource.setFilters (filtres); } catch (sqlexception e) {log.Error ("Filtre d'initialisation de configuration Druid:" + e); } dataSource.setConnectionProperties (ConnectionProperties); return dataSource; }} Grâce à l'exemple ci-dessus, un actualisation dynamique des sources de données peut également être réalisée. Ensuite, examinons comment Spring Cloud Config implémente le déploiement à chaud des sources de données.
D'après le blog précédent, il n'est pas difficile de constater que pour réaliser un rafraîchissement dynamique, le point clé est sur la demande de rafraîchissement du post, nous commençons donc par rafraîchir le fichier de configuration.
Lorsque nous publions une demande de rafraîchissement, la demande sera interceptée par le module d'actionneur. Cela peut être vu à partir du fichier journal de démarrage
La copie de code est la suivante:
Mappé "{[/ refresh || /refresh.json.
Ensuite, regardons le point de terminaison défini par l'actionneur, puis nous trouvons la classe RafhendPoint. Le code source de cette classe est le suivant:
@ConfigurationProperties (prefix = "endpoint.refresh", ignoreunknownFields = false) @managedResource public class RefreshendPoint étend AbstrAndPoint <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 ()); }}À partir du code source ci-dessus, nous pouvons voir que l'accent est mis sur la classe ContextreFresher. Étant donné que cette classe est trop longue, ce qui suit est un code source partiel de cette classe:
Portée de rafraîchissement privé; 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, load and extract configuration file addConfigFilesToEnvironment();// 2. Load the configuration file into the environment Set<String> keys = changes(before, Extract (this.context.getEnvironment (). GetPropertySources ())). KeySet (); // 3. Remplacez la valeur dans la variable d'environnement d'origine this.context.publisheVent (New EnvironmentChangeEvent (Keys)); // 4. Publier l'événement de changement, this.scope.refresh (); clés de retour; } Il n'est pas difficile de voir à partir du code ci-dessus que les points clés ont traversé 4 étapes et ont été marqués dans le code ci-dessus.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.