Lembre-se do processo ConfigServer de usar o banco de dados para salvar a configuração uma vez

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.

Verificar

 

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

Acho que você gosta

Origin blog.csdn.net/kanyun123/article/details/118052390
Recomendado
Clasificación