Con respecto al uso básico de la configuración de Spring Cloud, se ha mencionado en el blog anterior. Si no lo entiende, lea primero el blog anterior.
Spring Cloud Config integra GitLab para crear un centro de configuración distribuido
Alta disponibilidad del Centro de configuración distribuida de Spring Cloud Configuración
Hoy, nuestro enfoque es cómo lograr la implementación en caliente de fuentes de datos.
1. Configure la fuente de datos en el cliente
@Refreshscope @Configuration // Configurar la fuente de datos Class Public DataSourCeConfigure {@Bean @Refreshscope // Actualizar el archivo de configuración @ConfigurationProperties (prefix = "Spring.DataSource") // Prefix para la configuración automática de la fuente de datos Public DataSource () {devuelve DataSourceBuilder.Create ().).).). }} A través de los pasos anteriores, puede modificar el archivo de configuración en GITLAB. Después de refrescarse, el servidor no necesita reiniciarse, y la nueva fuente de datos entrará en vigencia.
2. Implementación en caliente de fuentes de datos personalizadas
Cuando usamos Spring Boot para integrar Druid, necesitamos configurar manualmente la fuente de datos, el código es el siguiente:
paquete com.chhliu.springcloud.config; import java.sql.sqlexception; import javax.sql.dataSource; importar org.springframework.beans.factory.annotation.value; importar org.springframework.cloud.context.config.annotation.refreshscope; importar org.springframework.context.annotation.bean; importar org.springframework.context.annotation.configuration; importar org.springframework.context.annotation.primary; import com.alibaba.druid.pool.druiddataSource; import lombok.extern.slf4j.slf4j; / ** * * Descripción: Si el DataSource no se inicializa manualmente usando el código, el monitoreo SQL de la interfaz de monitoreo no tendrá datos ("es un error de arranque de primavera? @Value ("$ {spring.datasource.url}") cadena privada dburl; @Value ("$ {spring.dataSource.Username}") Nombre de usuario de cadena privada; @Value ("$ {spring.dataSource.password}") contraseña de cadena privada; @Value ("$ {spring.dataSource.driverClassName}") String private DriverClassName; @Value ("$ {spring.datasource.initialsize}") private int inicialSize; @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}") privado int timetweenEvictionRunsMillis; @Value ("$ {spring.dataSource.MinevictableIdletimemillis}") private int min mineVictableIdletImillis; @Value ("$ {spring.dataSource.ValidationQuery}") Private String ValidationQuery; @Value ("$ {spring.dataSource.test whelleidle}") Prueba booleana privada WhipleIdle; @Value ("$ {spring.datasource.testonborrow}") privado boolean testonborrow; @Value ("$ {spring.datasource.testonborrow}") privado booleano testonreturn; @Value ("$ {spring.dataSource.testonborrow}") privado boolean piscolpreparedStatements; @Value ("$ {spring.dataSource.maxPoolPreparedStatementConConnectsize}") private int maxPoolPreparedStatementPonConnectsize; @Value ("$ {spring.dataSource.filters}") filtros de cadena privada; @Value ("$ {spring.dataSource.ConnectionProperties}") privado String ConnectionProperties; @Value ("$ {spring.dataSource.useglobaldataSourcestat}") privado boolean useGlobaldataSourcestat; @Bean // Declararlo como una instancia de Bean @Primary // En el mismo DataSource, primero use el DataSource anotado @RefreshScope DataSource DataSource () {DruidDataSource DataSource = nuevo DruidDataSource (); dataSource.setUrl (this.dburl); dataSource.setUsername (nombre de usuario); dataSource.setPassword (contraseña); dataSource.setDrivClassName (DriverClassName); // Configuración DataSource.SetInitialSize (InitialSize); dataSource.setminidle (minidle); DataSource.SetMaxActive (MaxActive); DataSource.SetMaxWait (MaxWait); DataSource.SetTimeBetweenEvictionRunsMillis (TimetweenEvictionRunsMillis); dataSource.SetMinevictableIdletimemillis (minevictableidletimillis); DataSource.SetValidationQuery (ValidationQuery); dataSource.Settest WhipleIdle (test WhipleIdle); DataSource.SettonBorrow (testOnBorrow); dataSource.settestonreturn (testOnreturn); dataSource.setPoolPreparedStatements (PoolPreparedStatements); DataSource.SetMaxPoolPreparedStatementPonConnectsize (MaxPoolPreparedStatementPonnectsize); dataSource.setuseGlobalDataSourCestat (useGlObalDataSourCestat); intente {dataSource.setFilters (filtros); } Catch (Sqlexception e) {log.error ("Filtro de inicialización de configuración Druid:"+ e); } DataSource.SetConnectionProperties (ConnectionProperties); devolver datos de datos; }} A través del ejemplo anterior, también se puede lograr la actualización dinámica de las fuentes de datos. A continuación, echemos un vistazo a cómo la configuración de Spring Cloud implementa la implementación de fuentes de datos.
Desde el blog anterior, no es difícil encontrar que para lograr la actualización dinámica, el punto clave está a solicitud de la actualización posterior, por lo que comenzamos actualizando el archivo de configuración.
Cuando publicamos la solicitud de actualización, la solicitud será interceptada por el módulo del actuador. Esto se puede ver desde el archivo de registro de inicio
La copia del código es la siguiente:
Mapeado "{[ /refresh || /Refresh.jsonfont>, Methods=+Post]}" en público java.lang.object org.springframework.cloud.endpoint.genericPostableMvcendpoint.invoke ()
A continuación, veamos el punto final definido por el actuador, y luego encontramos la clase Refreshendpoint. El código fuente de esta clase es el siguiente:
@ConfigurationProperties (prefix = "Endpoints.refresh", ignoreunknownFields = false) @ManagedResource public class RefreshendPoint extiende AbstractEndpoint <Collection <String> {private CoTExtreFresher ContextreFresher; public RefreshendPoint (contrextrefresher contrextrefresher) {super ("refresh"); this.contextrefresher = contrextrefresher; } @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 ()); }}En el código fuente anterior, podemos ver que el enfoque está en la clase ContextreFresher. Dado que esta clase es demasiado larga, el siguiente es un código fuente parcial de esta clase:
alcance privado de refrescos; Public contextrefresher (configuraciónApplicationContext context, reheshscope Scope) {this.context = context; this.scope = alcance; } public sincronizado set <string> rehresh () {map <string, objeto> antes = extracto (this.context.getEnvironment (). getPropertySources ()); // 1. Antes, antes, cargar y extraer el archivo de configuración adcigfilestoenvironment (); // 2. Cargue el archivo de configuración en el entorno establecido <String> Keys = CAMBIOS (antes,, en, cambios,,,,,,,,,, a,, cambios,,,,, a, cambios,,, en, cambios,,, en, cambios,,, en, cambios,,,, en, cambios,, en, cambios,,,, en, cambios,,,, en, cambios,,,, en, cambios,, en,,,, cambios, cambios (Bef.,,,,,,,, ¿cambios, en, cangos,? Extract (this.context.getEnvironment (). GetPropertySources ())). KeySet (); // 3. Reemplace el valor en la variable de entorno original this.context.publishEvent (New EnvironmentChangeVent (Keys)); // 4. Publique el cambio de cambio, this.scope.refreshallall (); Revuelve las llaves; } No es difícil ver en el código anterior que los puntos clave han pasado por 4 pasos y se han marcado en el código anterior.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.