Spring Cloud Ten: Introducción y uso del centro de configuración

Uno, centro de configuración

¿Por qué necesita un centro de configuración?

Para una sola aplicación, la configuración está escrita en el archivo de configuración, no hay gran problema. Si desea cambiar el entorno, puede cambiar entre diferentes perfiles (2 formas), pero en los microservicios, hay más microservicios. Cientos y miles de configuraciones requieren una administración centralizada, administración de configuraciones en diferentes entornos, ajuste dinámico de los parámetros de configuración y cambios de servicio continuos.

Introducción al Centro de configuración

El centro de configuración distribuida consta de 3 partes:

  1. Lugares para almacenar la configuración: git, svn, base de datos, archivos locales, etc.
  2. config server, lea la configuración de 1.
  3. cliente de configuración. Es la configuración de consumo del cliente del servidor de configuración.

Nota: La configuración no se actualizará por sí sola, y es necesario activar el cliente antes de ir a git para extraerlo. O active para ver la configuración en config-server, luego vaya a git para extraerlo.

Segundo, use

A continuación, integramos Spring Cloud Config en el proyecto Spring Boot y usamos github como almacenamiento de configuración, principalmente de las siguientes dos partes para demostrar:

  1. Construido a partir del centro de configuración de Eureka.
  2. Se construye el centro de configuración de Eureka.

Preparación del archivo de configuración:

Ponemos los siguientes cuatro archivos de configuración en github: Dirección del almacén del centro de configuración

Inserte la descripción de la imagen aquí

config-single-client-dev.yml

data:
  env: sinle-client-env
  user:
    username: bobo1
    password: 123

config-cliente-único-prod.yml

data:
  env: sinle-client-prod
  user:
    username: bobo2
    password: 1234

config-eureka-client-dev.yml

data:
  env: eureka-client-env
  user:
    username: bobo3
    password: 12345

config-eureka-client-prod.yml

data:
  env: eureka-client-prod
  user:
    username: bobo4
    password: 123456

1. Configurar sin el centro de configuración de Eureka

El centro de configuración más simple es iniciar un servicio como servidor, y luego cada servicio que necesita obtener la configuración como cliente de este servidor para obtener la configuración.

Crear servidor del centro de configuración

1. Cree un nuevo modelo, config-single-server, importe las dependencias web y config-server

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

2, colocación application.yml

server:
  port: 7001
spring:
  application:
    name: config-single-server
  cloud:
    config:
      server:
        git:
		  # 配置文件仓库地址
          uri: https://github.com/zhaosongbobo/spring-cloud-config-test
          username: github帐号
          password: github密码
		  # 配置文件主干
          default-label: master
		  # 跳过ssl检查
          skip-ssl-validation: true
		  # 配置文件保存的本地机器的目录
          basedir: /home/bobo/config

3. Agregue la anotación @EnableConfigServer a la clase de inicio

@SpringBootApplication
@EnableConfigServer
public class ConfigSingleServerApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(ConfigSingleServerApplication.class, args);
    }

}

4. Inicie la verificación de config-single-server

Spring Cloud Config tiene su propio conjunto de reglas de acceso, y podemos acceder a él directamente en el navegador a través de este conjunto de reglas.

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
  • {aplicación} es el nombre de la aplicación, que corresponde al archivo de configuración, que es el valor spring.application.name del archivo de configuración .
  • {perfil} es la versión del archivo de configuración. Nuestro proyecto tiene una versión de desarrollo, una versión del entorno de prueba y una versión del entorno de producción. En correspondencia con el archivo de configuración, se distingue por la aplicación- {perfil} .yml, como la aplicación -dev.yml, application- sit.yml, application-prod.yml.
  • {label} representa la rama git. El valor predeterminado es la rama maestra. Si el proyecto se distingue por rama, es posible controlar el acceso a diferentes archivos de configuración a través de diferentes etiquetas.

Seguimos las reglas anteriores para acceder al servidor que acabamos de iniciar:

http: // localhost: 7001 / config-single-client / dev / master

http: // localhost: 7001 / config-single-client-dev.yml

http: // localhost: 7001 / master / config-single-client-dev.yml

El resultado es el siguiente:

Inserte la descripción de la imagen aquí

Al visitar la dirección anterior, si los datos se pueden devolver normalmente, significa que todo es normal en el lado del servidor del centro de configuración.

Crear un cliente del centro de configuración

El servidor del centro de configuración está listo y los datos de configuración están listos, a continuación lo usaremos en nuestro proyecto.

1. Cree el modelo, config-single-client e importe la dependencia de configuración web

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

2. Configure los archivos de configuración bootstrap.yml y application.yml

bootstrap.yml

spring:
  application:
    name: config-single-client
  cloud:
    config:
      uri: http://localhost:7001
      profile: dev
      label: master
  profiles:
    active: dev

Nota: ¿Por qué utilizar el archivo de configuración de arranque aquí?

Esto está determinado por la prioridad de cargar el archivo de propiedades de Spring Boot. Si desea obtener el archivo de configuración del servidor de configuración de Spring Cloud antes de cargar las propiedades, la configuración relacionada con Spring Cloud config debe cargarse primero y el bootstrap. yaml La carga es anterior a application.yaml, por lo que el cliente de configuración solo puede escribir la configuración relevante de config en bootstrap.properties.

application.yml

server:
  port: 7008

3. Lea el contenido del archivo de configuración, generalmente obtenido a través de @Value o @ConfigurationProperties

@Component
@Data
public class GitConfig {
    
    
    @Value("${data.env}")
    private String env;
    @Value("${data.user.username}")
    private String username;
    @Value("${data.user.password}")
    private String password;
}
@Component
@Data
@ConfigurationProperties(prefix = "data")
public class GitAutoRefreshConfig {
    
    
    
    private String env;
    private UserInfo user;
    
    @Data
    public static class UserInfo {
    
    
        private String username;
        private String password;
    }
}

4. GitController para probar la configuración

@RestController
public class GitController {
    
    
    @Autowired
    private GitConfig gitConfig;

    @Autowired
    private GitAutoRefreshConfig gitAutoRefreshConfig;

    @GetMapping("/getInfo")
    public Object getInfo(){
    
    
        return gitConfig;
    }

    @GetMapping("/getAutoInfo")
    public Object getAutoInfo(){
    
    
        return gitAutoRefreshConfig;
    }
}

5. Resultados

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

2. Integre el centro de configuración de Eureka para construir

Si Eureka se utiliza como un centro de descubrimiento de registro de servicios en nuestro sistema, Spring Cloud Config también debe registrarse en Eureka para facilitar el uso de otros consumidores de servicios, y se pueden registrar varios servidores del centro de configuración para lograr una alta disponibilidad.

Bien, integremos Spring Cloud Config a Eureka.

Crear servidor Eureka

1. Cree un nuevo modelo, eureka-server y configure las dependencias pom

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

2, colocación eureka, application.yml

spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      defaultZone: http://euk-server1:8001/eureka/
  instance:
    hostname: euk-server1
server:
  port: 8001

3. Agregue la anotación @EnableEurekaServer a la clase de inicio

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}

Cree el servidor del centro de configuración y regístrelo en EurekaServer

1. Cree un nuevo modelo, config-eureka-server, agregue la dependencia pom

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

2. Configure eureka y configure application.yml

server:
  port: 8002
spring:
  application:
    name: config-eureka-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/zhaosongbobo/spring-cloud-config-test
          username: github帐号
          password: github密码
          default-label: master
          skip-ssl-validation: true
          basedir: /home/bobo/config

eureka:
  instance:
    hostname: euk-server2
  client:
    service-url:
      defaultZone: http://euk-server1:8001/eureka

3. Agregue las anotaciones @EnableConfigServer y @EnableEurekaClient a la clase de inicio

@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigEurekaServerApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(ConfigEurekaServerApplication.class, args);
    }

}

4. Inicie config-eureka-sever y verifique que la configuración sea correcta.

Inserte la descripción de la imagen aquí

Crear un cliente del centro de configuración

La configuración del cliente ha cambiado relativamente un poco, después de unirse a Eureka, no es necesario tratar directamente con el servidor del centro de configuración, sino acceder a él a través de Eureka. Además, preste atención al nombre de la aplicación del cliente para que sea coherente con el nombre del archivo de configuración en github.

1. Cree un nuevo modelo, config-eureka-client, agregue la dependencia pom

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

2. Configure bootstrap.yaml y application.yaml

bootstrap.yml

spring:
  application:
    name: config-eureka-client
  cloud:
    config:
      discovery:
        enabled: true
		# 指定配置中心服务端的server-id
        service-id: config-eureka-server
	  # 指定仓库主干
      label: master
	  # 指定版本
      profile: dev
eureka:
  client:
    service-url:
      defaultZone: http://euk-server1:8001/eureka/

application.yml

server:
  port: 8003

Además de la configuración registrada en Eureka, la configuración es establecer una relación con el servidor del centro de configuración.

Service-id es el nombre de la aplicación del servidor.

Nota: ¿Por qué utilizar el archivo de configuración de arranque aquí?

Esto está determinado por la prioridad de cargar el archivo de propiedades de Spring Boot. Si desea obtener el archivo de configuración del servidor de configuración de Spring Cloud antes de cargar las propiedades, la configuración relacionada con Spring Cloud config debe cargarse primero y el bootstrap. yaml La carga es anterior a application.yaml, por lo que el cliente de configuración solo puede escribir la configuración relevante de config en bootstrap.properties.

3. Lea el contenido del archivo de configuración, generalmente obtenido a través de @Value o @ConfigurationProperties

Tómelo directamente del ejemplo anterior sin ningún cambio:

@Component
@Data
public class GitConfig {
    
    
    @Value("${data.env}")
    private String env;
    @Value("${data.user.username}")
    private String username;
    @Value("${data.user.password}")
    private String password;
}
@Component
@Data
@ConfigurationProperties(prefix = "data")
public class GitAutoRefreshConfig {
    
    
    
    private String env;
    private UserInfo user;
    
    @Data
    public static class UserInfo {
    
    
        private String username;
        private String password;
    }
}

4. GitController para probar la configuración

@RestController
public class GitController {
    
    
    @Autowired
    private GitConfig gitConfig;

    @Autowired
    private GitAutoRefreshConfig gitAutoRefreshConfig;

    @GetMapping("/getInfo")
    public Object getInfo(){
    
    
        return gitConfig;
    }

    @GetMapping("/getAutoInfo")
    public Object getAutoInfo(){
    
    
        return gitAutoRefreshConfig;
    }
}

5. Clase de inicio

@SpringBootApplication
@EnableDiscoveryClient
public class ConfigEurekaClientApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(ConfigEurekaClientApplication.class, args);
    }

}

6. Resultados

Inserte la descripción de la imagen aquí

Tres, actualización manual

El mecanismo de Spring Cloud Config que carga el contenido de la configuración cuando se inicia el proyecto tiene un defecto de que no se actualizará automáticamente después de modificar el contenido del archivo de configuración. Por ejemplo, en nuestro proyecto anterior, cuando el servicio se haya iniciado, modifique el contenido del archivo de configuración en github. En este momento, actualice la página nuevamente. Lo sentimos, es el contenido de configuración anterior y el contenido nuevo no se actualizará. activamente.
Sin embargo, no puede reiniciar el servicio cada vez que modifica la configuración. Si ese es el caso, es mejor no usarlo, ¿no sería más rápido usar el archivo de configuración local directamente?

Proporciona un mecanismo de actualización, pero debemos activarlo de forma activa. Esa es la anotación @RefreshScope combinada con el actuador, preste atención a la introducción del paquete spring-boot-starter-actuator.

1. Agregue un actuador de dependencia a la dependencia pom de config-eureka-client

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

2. Agregue la configuración del actuador en la configuración del cliente de configuración

application.yml

server:
  port: 8003
management:
  endpoint:
    shutdown:
      enabled: false
  endpoints:
    web:
      exposure:
        include: "*"

2. Agrega la anotación @RefreshScope a la clase que necesita leer la configuración Usamos la configuración en el controlador, así que agrégala al controlador.

@RestController
@RefreshScope
public class GitController {
    
    
    @Autowired
    private GitConfig gitConfig;

    @Autowired
    private GitAutoRefreshConfig gitAutoRefreshConfig;

    @GetMapping("/getInfo")
    public Object getInfo(){
    
    
        return gitConfig;
    }

    @GetMapping("/getAutoInfo")
    public Object getAutoInfo(){
    
    
        return gitAutoRefreshConfig;
    }
}

Tenga en cuenta que las anteriores son todas las modificaciones realizadas en el lado del cliente.

Después de eso, reinicie el cliente. Después de reiniciar, modificamos el archivo de configuración config-eureka-client-dev.yml en github

original:

data:
  env: eureka-client-env
  user:
    username: bobo3
    password: 12345

Después de la modificación:

data:
  env: eureka-client-env
  user:
    username: bobo3修改111
    password: 12345

Actualiza la página de nuevo, no pasa nada.

A continuación, enviamos una solicitud POST a la interfaz http: // localhost: 8003 / actuator / refresh, utilizando herramientas como cartero, esta interfaz se utiliza para activar la carga de la nueva configuración, y el contenido devuelto es el siguiente:

Inserte la descripción de la imagen aquí

Después de eso, visite la interfaz RESTful nuevamente, http: // localhost: 8003 / getAutoInfo

Inserte la descripción de la imagen aquí

Puede ver que los datos obtenidos por esta interfaz están actualizados, lo que indica que el mecanismo de actualización está funcionando.

Pero cuando visitamos http: // localhost: 8003 / getInfo, todavía obtenemos los datos antiguos, que están relacionados con la implementación de la anotación @Value, por lo que no debemos usar este método para cargar la configuración en el proyecto.

Cambiar a actualización automática

Github proporciona un método de webhook. Cuando hay un cambio de código, llamará a la dirección que establezcamos para lograr el propósito que queremos lograr.

1. Ingrese a la página de configuración del almacén de github, seleccione Webhooks y haga clic en agregar webhook

Inserte la descripción de la imagen aquí

2. Luego, ingrese la dirección de la devolución de llamada, que es la dirección mencionada anteriormente http: // localhost: 8003 / actuator / refresh, pero debe asegurarse de que esta dirección sea accesible por github. Si es una intranet, no hay forma. Esto es solo una demostración. Generalmente, los proyectos en la empresa tendrán sus propias herramientas de administración de código, como gitlab autoconstruido. Gitlab también tiene la función de webhook, para que puedas llamar a la dirección de la intranet.

Inserte la descripción de la imagen aquí

Cuatro, actualización automática

Use Spring Cloud Bus para actualizar automáticamente múltiples terminales:

Spring Cloud Bus 将分布式系统的节点与轻量级消息代理链接。这可以用于广播状态更改(例如配置更改)或其他管理指令。一个关键的想法是,Bus 就像一个扩展的 Spring Boot 应用程序的分布式执行器,但也可以用作应用程序之间的通信渠道。

—— Spring Cloud Bus 官方解释

Sin introducción aquí, puede consultar este artículo para lograr:

Spring Cloud Tutorial: use Spring Cloud Bus para actualizar automáticamente los cambios de configuración

Cinco, escribe hasta el final

Aquí hay un gran problema al usar el cliente para extraer la configuración, aquí está el énfasis:

我用spring boot 2.4.1和spring cloud 2020.0.0-RC1版本去获取配置时获取不到。

把版本改为spring boot 2.3.4.RELEASE 和 spring cloud Hoxton.SR8版本获取配置正常

暂时不清楚为什么,可能新的版本有了变化,如果大家知道原因的话可以在评论区留言告知!!!

Los ejemplos utilizados en este artículo se han subido a la nube de código:

Haga clic aquí para ver

Supongo que te gusta

Origin blog.csdn.net/u013277209/article/details/111316799
Recomendado
Clasificación