Em relação ao uso básico da Spring Cloud Config, ela foi mencionada no blog anterior. Se você não entende, leia o blog anterior primeiro.
Spring Cloud Config integra o GitLab para construir um centro de configuração distribuído
Alta disponibilidade do centro de configuração distribuído da Spring Cloud Config
Hoje, nosso foco é como obter a implantação a quente de fontes de dados.
1. Configure a fonte de dados no cliente
@RefreshScope @Configuration // Configure fonte de dados classe public DataSourCeconfigure {@Bean @refreschape // Atualizar arquivo de configuração @ConfigurationProperties (prefix = "spring.dataSource") // prefixo para a configuração automática de dados de dados public fontes de dados. }} Através das etapas acima, você pode modificar o arquivo de configuração no GitLab. Após a atualização, o servidor não precisa ser reiniciado e a nova fonte de dados entrará em vigor.
2. Implantação a quente de fontes de dados personalizadas
Quando usamos a Spring Boot para integrar o Druid, precisamos configurar manualmente a fonte de dados, o código é o seguinte:
pacote com.chhliu.springcloud.config; importar java.sql.sqLexception; importar javax.sql.datasource; importar org.springframework.beans.factory.annotation.value; importar org.springframework.cloud.context.config.annotation.refrescópio; importar org.springframework.context.annotation.bean; importar org.springframework.context.annotation.configuration; importar org.springframework.context.annotation.Primary; import com.alibaba.druid.pool.druiddataSource; importar lombok.extern.slf4j.slf4j; /** * * Description: If the DataSource is not manually initialized using code, the SQL monitoring of the monitoring interface will have no data ("is a spring boot bug???") * @author chhliu * Created: February 9, 2017 at 7:33:08 pm * @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 senha; @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}") privado int timebetweenEvictionRunsmillis; @Value ("$ {spring.dataSource.mineVictableIdletimemillis}") private int minevictableIdletimemillis; @Value ("$ {spring.datasource.validationQuery}") private String validationQuery; @Value ("$ {spring.datasource.testwhileidle}") private boolean testhileidle; @Value ("$ {spring.datasource.testonborrow}") private boolean testonborrow; @Value ("$ {spring.datasource.testonborrow}") private boolean testOnReturn; @Value ("$ {spring.dataSource.testonborrow}") privado boolean poolpreparedstatements; @Value ("$ {spring.dataSource.maxpoolPreparedStateMementPonConectionsize}") private int maxpoolPreparedStatementPerConnectionsize; @Value ("$ {spring.datasource.filters}") filtros de sequência privada; @Value ("$ {spring.datasource.connectionproperties}") private string ConnectionProperties; @Value ("$ {spring.datasource.useglobaldataSourcestat}") privado boolean useglobaldataSourcestat; @Bean // Declare -o como uma instância do feijão @Primary // No mesmo DataSource, primeiro use o conjunto de dados anotado @RefreshScope public DataSource DataSource () {druidDataSource DataSource = new DruidDatasource (); DataSource.seturl (this.dburl); DataSource.setUserName (nome de usuário); DataSource.SetPassword (senha); DataSource.SetDriverClassName (DriverClassName); // Configuração DataSource.SetInitialSize (InitialSize); DataSource.setminidle (minidle); DataSource.SetMaxActive (maxactive); DataSource.setMaxWait (Maxwait); dados DataSource.setMineVictableIdLeTimemillis (MineVictableIdLetimEmillis); DataSource.SetValidationQuery (validationQuery); DataSource.setTestwhileIdle (testhileidle); DataSource.setTestonBorrow (testonborrow); DataSource.SetTestOnReturn (testOnReturn); DataSource.SetPoolPreparedStatements (PoolPreparedStatements); DataSource.setMaxPoolPreparedStatementPerConnectionsize (MaxPoolPreparedStatementPerConnectionsize); dados tente {DataSource.SetFilters (filtros); } catch (sqLexception e) {log.error ("filtro de inicialização da configuração do druida:"+ e); } DataSource.setConnectionProperties (ConnectionProperties); return DataSource; }} Através do exemplo acima, a atualização dinâmica das fontes de dados também pode ser alcançada. Em seguida, vamos dar uma olhada em como a Spring Cloud Config implementa a implantação a quente das fontes de dados.
No blog anterior, não é difícil descobrir que, para obter uma atualização dinâmica, o ponto principal está a pedido da atualização postal, por isso começamos atualizando o arquivo de configuração.
Quando publicarmos a solicitação de atualização, a solicitação será interceptada pelo módulo do atuador. Isso pode ser visto no arquivo de log de inicialização
A cópia do código é a seguinte:
Mapeado "{[ /refresch || /refresh.json ].methods=[post]}" em public java.lang.Object org.springframework.cloud.endpoint.genericPostablemvcendpoint.inVoke ()
Em seguida, vejamos o ponto final definido pelo atuador e, em seguida, encontramos a classe RefreshendPoint. O código -fonte desta classe é o seguinte:
@ConfigurationProperties (prefix = "EndPoints.Refresh", ignoreunknownfields = false) @ManagedResource classe pública RefreshendPoint estende abstractEndPoint <coleção <string>> {private contextRefresher contextrefresher; public RefreshendPoint (contextrefresher contextrefresher) {super ("refresh"); this.ContextRefresher = contextrefresher; } @ManagedOPeration public String [] refresh () {set <string> keys = contextrefresher.refresh (); retornar as chaves.toArray (new String [keys.size ()]); } @Override public Collection <String> Invoke () {return Arrays.asList (refresh ()); }}A partir do código -fonte acima, podemos ver que o foco está na classe Contextrefresher. Como esta classe é muito longa, a seguir é um código -fonte parcial desta classe:
Escopo privado de atualização; public contextrefresher (contexto configurableApplicationContext, escopo refreschScope) {this.Context = context; this.Scope = SCOPE; } public sincronizado set <string> refresh () {map <string, object> antes = extrair (this.context.getenvironment (). getPropertySources ()); // 1. Antes, carregar e extrair o arquivo de configuração do ambiente definido <figuration the strings <ruments the strings <strings <strings <shels); extract (this.Context.getenvironment (). getPropertySources ())). KeySet (); // 3. Substitua o valor na variável de ambiente original this.Context.publishEvent (New EnvironmentChangeEvent (Keys)); // 4. chaves de retorno; } Não é difícil ver no código acima que os pontos -chave passaram por 4 etapas e foram marcados no código acima.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.