Ao usar o springcloud, o springcloud configserver geralmente é usado para obter a configuração, e a configuração geralmente é salva no git. A forma do arquivo é conveniente para modificação e referência.Na verdade, a configuração também pode ser salva no banco de dados.
Mas, recentemente, encontrei um problema ao usar a nuvem privada H3C . Ou seja, a nuvem vem com um motor de microsserviços que pode criar e implantar automaticamente Eureka, ConfigServer e GateWay. Porém, ao configurar o ConfigServer, verifica-se que apenas a configuração é salva no banco de dados, ou seja, o endereço do banco de dados precisa ser ser preenchido. Isso não é o mesmo que o método de desenvolvimento anterior.
Então, tentei preencher um endereço de banco de dados, clique em Criar e descobri que um banco de dados h3c_pring_cloud foi criado automaticamente
Existem várias tabelas nele:
spring_cloud_config
spring_cloud_gateway
spring_cloud_gateway_jwt
spring_cloud_route_subsidiary
spring_cloud_route_to_subsidiary
Pode-se ver que spring_cloud_config é a tabela para salvar a configuração. A estrutura da tabela é a seguinte,
É óbvio que os campos úteis são config_key/config_value/application.
Portanto, tente inserir um dado, apenas insira nome, aplicativo, config_key, config_value outros permanecem vazios.
o nome está definido como test-app
o aplicativo está definido como test-app-dev
config_key e config_value são definidos casualmente
Acesse o centro de configuração diretamente usando um navegador.
curl http://localhost:8080/test-app-dev/default/
O motivo pelo qual o endereço é seguido por padrão é porque se você não segui-lo, não conseguirá acessá-lo, ou seja, retornará uma página de erro, então por que definir como padrão, porque se spring.profiles.active não é especificado no springboot, o padrão é padrão
Os resultados são os seguintes.
Os dados desejados não foram retornados. Então, eu me pergunto se é um problema com o campo de perfil, então defino o campo de perfil como padrão. Ao definir o perfil como padrão aqui, você precisa prestar atenção
Executado novamente, ainda não encontrou nenhum dado.
Isso é estranho, os dados podem ser encontrados diretamente usando sql, mas não sei qual instrução SQL é usada pelo ConfigServer criado automaticamente na nuvem, porque o ConfigServer é criado automaticamente, então não consigo visualizar seu código-fonte. Quando estava perdido, de repente quis deixar a nuvem criar um banco de dados novamente, então excluí o banco de dados diretamente e fiquei pensando: o que acontecerá se eu visitá-lo novamente neste momento? Então, utilizo novamente o navegador para acessar o ConfigServer. Os seguintes resultados foram obtidos.
Do resultado retornado, acidentalmente obtive a instrução sql do ConfigServer criado e descobri que o env_id era um valor fixo. Depois de pesquisar, descobri que o valor foi gerado quando o mecanismo de microsserviço foi criado. Então, defini o campo env_id nos dados para este valor. Reutilize o navegador para iniciar a solicitação e retornar o resultado.
Como resultado, ainda não há dados, o que é deprimente. Depois de examinar os campos nulos restantes, há apenas um rótulo, o que é suspeito, mas qual valor deve ser definido?
Por que você luta com esse problema? É muito conveniente alterar o rótulo acessando no navegador, mas é usado principalmente no projeto primavera, geralmente o mestre. Portanto, defina o rótulo como mestre.
visite agora
curl http://localhost:8080/test-app-dev/default/
conseguiu os dados.
Após um período de exploração, provavelmente sei como seu ConfigServer foi escrito, então. Cole o seguinte código.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
aplicativo.yml
server:
port: 8080
context-path: /
spring:
profiles:
active: jdbc
application:
name: CONFIG_SERVER
datasource:
url: jdbc:mysql://10.116.67.115:3306/h3c_pring_cloud
password: root
username: root
driver-class-name: com.mysql.jdbc.Driver
cloud:
config:
server:
jdbc:
sql: SELECT config_key ,config_value from spring_cloud_config where env_id = 'asdfrsgt34fgfd' and APPLICATION=? and PROFILE=? and LABEL=?
enabled: true
Application.java
@EnableConfigServer
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
script de banco de dados
DROP TABLE IF EXISTS `spring_cloud_config`;
CREATE TABLE `spring_cloud_config` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`env_id` varchar(100) DEFAULT NULL,
`application` varchar(100) DEFAULT NULL,
`profile` varchar(100) DEFAULT NULL,
`label` varchar(100) DEFAULT NULL,
`config_key` varchar(100) DEFAULT NULL,
`config_value` varchar(100) DEFAULT NULL,
`config_type` varchar(100) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`states` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `spring_cloud_config` VALUES (1342953439026266112,'test-app','asdfrsgt34fgfd','test-app-dev','default','master','spring.datasource.url','jbdc:mysql://127.0.0.1:3306/test',NULL,NULL,NULL,NULL);
Em seguida, crie o banco de dados. A configuração pode ser obtida através do acesso ao navegador, mas quando deleto o banco de dados, acesso novamente.
Uma página de erro apareceu.
Então vi que o console também relatou um erro.
Mas por que não apareceu a página do ConfigServer criado pela nuvem, pois o log do configserver não pode ser visto no mecanismo de microsserviço do H3C. Gostaria de saber se o ConfigServer criado pela nuvem usa o tratamento de exceção global do spring, então tente adicionar A manipulador de exceção global.
GlobalExceptionHandler.java
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(Exception.class)
public BaseResult globalException(HttpServletResponse response, Exception ex) {
BaseResult baseResult = new BaseResult();
baseResult.setCode(0);
baseResult.setTotal(0);
baseResult.setMsg(ex.getMessage());
return baseResult;
}
}
BaseResult.java
public class BaseResult {
private int code;
private String msg;
private int total;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
}
Tente novamente e verifique se o resultado de retorno é consistente com o resultado de retorno do configserver criado pela nuvem
Finalmente, você pode ver as regras de mapeamento do configserver
Ao mesmo tempo, após esse experimento, descobri que ainda existem muitos inconvenientes em usar o mysql para salvar arquivos de configuração