Artículos prácticos de operación y mantenimiento de SpringBoot, empaquetado, operación, configuración avanzada, desarrollo multientorno, registro


Artículos prácticos sobre operación y mantenimiento de SpringBoot.

Después del lanzamiento del capítulo básico, vi muchos comentarios de amigos en Internet y ayudé a más de 100 amigos a resolver algunos problemas que encontraron, y se descubrió que algunos problemas eran típicos. Se espera que algunos problemas se solucionen. en el lugar correcto en el siguiente capítulo. Agréguelo a este conjunto de cursos y ofrézcalo a todos como una solución.


A partir de ahora entraremos en el estudio del capítulo práctico. El capítulo práctico se basa en la base del capítulo básico y complementa el mapa de conocimiento de SpringBoot. Por ejemplo, en el capítulo básico solo se explica el formato gramatical de yaml, pero todavía existen muchos obstáculos en el proceso de desarrollo práctico al escribir archivos yaml, que deben aprenderse en el capítulo práctico.


El capítulo práctico se divide en dos partes, a saber, el capítulo práctico de operación y mantenimiento y el capítulo práctico de desarrollo. De hecho, el estándar de división lo formulé yo mismo, porque parte del conocimiento que contiene todavía está relativamente disperso. El propósito de dividir en dos etapas es clasificar mejor puntos de conocimiento similares y ayudar a los estudiantes a encontrar la relación entre el conocimiento. para el almacenamiento de la memoria y la conversión de conocimientos. Después de una serie de ejercicios repetidos de conocimiento y fortalecimiento, la memoria temporal se convertirá en una memoria permanente. Al crear un curso, el objetivo no solo debe ser terminar la lección, sino también apuntar a los logros de aprendizaje de los alumnos. Esta es también la filosofía básica a la que me he adherido en la enseñanza durante tantos años.


Comencemos con el capítulo práctico de operación y mantenimiento. En el capítulo práctico de operación y mantenimiento, posiciono a los alumnos para que jueguen con la configuración y se preparen para la integración de varias tecnologías en el capítulo práctico de desarrollo. En comparación con el capítulo de desarrollo práctico, el contenido del capítulo de operación y mantenimiento práctico es ligeramente más delgado, y algunos módulos de conocimiento se cubren tanto en el capítulo de operación y mantenimiento práctico como en el capítulo de desarrollo práctico, y estos contenidos se colocan en el capítulo de desarrollo práctico. . No digamos tonterías, echemos un vistazo a lo que se incluye en el artículo práctico de operación y mantenimiento:
1. Empaquetado y ejecución de programas SpringBoot
2. Configuración avanzada
3. Desarrollo multientorno
4. Registros


Comencemos la primera parte del aprendizaje del empaquetado y operación del programa SpringBoot.


YW-1. Empaquetado y ejecución del programa SpringBoot.

Los amigos que acaban de comenzar a desarrollarse y aprender pueden tener una comprensión errónea de un conocimiento. Escribimos programas todos los días bajo Idea y los ejecutamos bajo Idea.

imagen-20211201091317258

Pero una vez completado el desarrollo real, es imposible que nuestro proyecto se ejecute en nuestra propia computadora.

imagen-20211201091341645

Los programas que haremos en el futuro se ejecutarán en un servidor dedicado. En pocas palabras, es poner el programa que hagas en una computadora que se ejecute de forma independiente. Esta computadora es más profesional que la computadora que desarrollas y usas, y tiene un Nivel de seguridad en todos los aspectos, mucho más que tu ordenador actual.

imagen-20211201091502040

Luego, cómo colocar nuestro programa en esta computadora dedicada, primero debemos organizar nuestro programa en un archivo y luego transferir este archivo a este servidor. Aquí hay dos procesos, uno es el proceso de empaquetado y el otro es el proceso en ejecución.


Consejos amables

Para garantizar la adaptabilidad del entorno, el proyecto empresarial adoptará el siguiente proceso para lanzar el proyecto, y este proceso no se discutirá aquí.
1. El departamento de desarrollo usa Git, SVN y otras herramientas de control de versiones para cargar el proyecto en el servidor de versiones
2. El servidor usa la herramienta de control de versiones para descargar el proyecto
3. El servidor usa la herramienta Maven para reconstruir el proyecto en el entorno actual de la máquina real
4. Inicie el servicio


Continúe hablando sobre nuestro proceso de empaquetado y ejecución. El llamado empaquetado se refiere a convertir el programa en un archivo ejecutable, y la llamada ejecución se refiere al archivo generado por el paquete sin depender del entorno de desarrollo. Las dos operaciones anteriores tienen comandos correspondientes que se pueden ejecutar rápidamente.


Embalaje del programa

El programa SpringBoot se crea en base a Maven y Maven proporciona instrucciones de empaquetado llamadas paquetes. Esta operación se puede realizar en el entorno de Idea.

mvn package

Después del empaquetado, se generará un archivo jar similar al nombre del proyecto, y su nombre se compone de nombre del módulo + número de versión + .jar.


Programa en ejecución

Una vez empaquetado el paquete, se puede ejecutar directamente. En la ruta donde se encuentra el paquete del programa, ejecute el comando.

java -jar 工程包名.jar

Después de ejecutar las instrucciones de empaquetado del programa, el programa se ejecuta normalmente, lo que no es diferente de ejecutar el programa bajo Idea.


Atención especial : si el entorno jdk de Java no está instalado en su computadora, las operaciones anteriores no se pueden realizar correctamente porque la ejecución del programa utiliza instrucciones de Java.


Atención especial : cuando utilice el asistente para crear un proyecto SpringBoot, habrá la siguiente configuración en el archivo pom.xml: esta sección de configuración no debe eliminarse, de lo contrario el programa no se podrá ejecutar normalmente después del empaquetado.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Resumir

1. El proyecto SpringBoot puede ejecutar el archivo jar de forma independiente según el entorno Java para iniciar el servicio.
2. El proyecto SpringBoot ejecuta el paquete de comandos mvn para empaquetar.
3. Ejecute el comando jar: java –jar nombre del proyecto.jar.


Procesamiento del error de empaquetado del programa SpringBoot

Algunos socios pequeños tendrán algunos problemas después del empaquetado y la ejecución, lo que hará que el programa no se ejecute normalmente, como el siguiente fenómeno

imagen-20211201094223991

Si desea comprender este problema, debe hablar sobre el mecanismo de funcionamiento del archivo .jar, si lo sabe, sabrá cómo evitar este tipo de problemas.


Al participar en el desarrollo de Java, generalmente entra en contacto con muchos paquetes jar, como el paquete jar del controlador de mysql, y lo que obtenemos después de empaquetar el programa anterior también es un archivo jar. En este momento, si usa el comando java -jar anterior para ejecutar el paquete jar del controlador mysql, aparecerá el fenómeno no ejecutable anterior, pero ¿por qué se puede ejecutar nuestro proyecto SpringBoot? De hecho, se debe a que el método de envasado es diferente.


En el pom.xml del proyecto SpringBoot, existe el siguiente conjunto de configuraciones: este conjunto de configuraciones determina si el paquete empaquetado se puede ejecutar.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Habilitamos esta configuración y comentamos esta configuración para realizar dos paquetes respectivamente, y luego observamos la diferencia entre los dos paquetes empaquetados. Hay 3 características obvias 1. El tamaño del archivo empaquetado es diferente. 2. El tamaño del paquete
empaquetado
El contenido contenido es diferente
3. El contenido de los archivos individuales en el programa de empaquetado es diferente


Mire el primer fenómeno, el tamaño del archivo es diferente. El tamaño del paquete generado al empaquetar con configuración es el siguiente:

imagen-20211201095610270

No es difícil ver que el volumen del paquete con configuración es 30 veces mayor que el del paquete sin configuración, entonces, ¿qué contiene? ¿Puede ser tan diferente? Veamos qué hay de diferente por dentro.

imagen-20211201101541267


imagen-20211201101652868

Descubrimos que el contenido es completamente diferente, solo un directorio es el mismo, llamado META-INF. Abra el directorio de clases en el directorio BOOT-INF en el paquete de programa de gran capacidad y encontramos que el contenido es exactamente el mismo que el del paquete de programa de pequeña capacidad.

imagen-20211201101805569


imagen-20211201101652868


Resulta que el paquete de programa grande contiene otras cosas además del contenido del paquete de programa pequeño. ¿Lo que hay? Vuelva al directorio BOOT-INF y abra el directorio lib, que muestra muchos archivos jar.

imagen-20211201102025791

No es difícil encontrar que estos archivos jar son los archivos correspondientes a las coordenadas importadas cuando hicimos este proyecto. Probablemente puedas entenderlo: para que el programa empaquetado y generado por sí mismo se ejecute de forma independiente, el programa SpringBoot no solo empaqueta el contenido desarrollado por él mismo en el proyecto, sino que también empaqueta todos los paquetes jar que deben usarse. para la operación actual del proyecto. ¿Por qué haces esto? Sólo para poder correr de forma independiente. El programa actual puede ejecutarse de forma independiente sin depender de ningún recurso fuera del paquete. Esta es también la razón principal por la que la capacidad del paquete grande es 30 veces mayor que la del paquete pequeño.


Veamos qué es diferente del paquete de programa grande. El directorio más externo contiene un directorio org. Ingrese a este directorio. El nombre del directorio es org\springframework\boot\loader. Puede encontrar un archivo JarLauncher.class en él. Primero, recuerde este archivo . . Mirando este conjunto de nombres de directorio nuevamente, obviamente es un nombre de directorio Spring ¿Por qué debería empaquetarse el marco Spring en este paquete? No estoy seguro.


Regrese a los directorios más externos de los dos paquetes y verifique que haya un archivo llamado MANIFEST.MF en la carpeta META-INF con el mismo nombre, pero el tamaño es diferente. Abra el archivo y compare la diferencia de contenido.


MANIFEST.MF para archivos pequeños

Manifest-Version: 1.0
Implementation-Title: springboot_08_ssmp
Implementation-Version: 0.0.1-SNAPSHOT
Build-Jdk-Spec: 1.8
Created-By: Maven Jar Plugin 3.2.0

MANIFEST.MF para archivos masivos

Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: springboot_08_ssmp
Implementation-Version: 0.0.1-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.itheima.SSMPApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.5.4
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.JarLauncher

Obviamente, hay algunas líneas de información más en el archivo grande que en el archivo pequeño, y la última línea de información es Main-Class: org.springframework.boot.loader.JarLauncher . ¿Qué significa esta oración? Si usa java -jar para ejecutar este paquete, se ejecutará la clase configurada por el atributo Main-Class, que resulta ser el archivo que vio anteriormente. Resulta que el marco Spring en el empaquetador SpringBoot está aquí para servir. Y esta clase org.springframework.boot.loader.JarLauncher busca internamente la clase configurada en el atributo Start-Class y ejecuta la clase correspondiente . Esta propiedad también existe en la configuración actual, correspondiente al nombre de nuestra clase de arranque.


Ahora la función de este grupo de configuraciones está clara:
1. Después de que el programa SpringBoot agregue la configuración, se creará un paquete especial, que incluye algunas funciones del marco Spring, el contenido del proyecto original y el paquete jar del que depende el proyecto original. 2.
Primero lea el archivo MANIFEST.MF. El atributo Main-Class se utiliza para marcar la clase que se ejecutará después de ejecutar el comando java -jar.
3. Cuando se ejecuta la clase JarLauncher, encontrará el atributo Start-Class. que es el nombre de la clase de inicio
4. Al ejecutar la clase de inicio, ejecutará el contenido del proyecto actual
5. Al ejecutar el proyecto actual, se utilizará el paquete jar dependiente y se buscará desde el directorio lib


Parece que para ejecutarse de forma independiente, el paquete SpringBoot se ha esforzado mucho en agregar todos los recursos que deben usarse a este paquete. Es por eso que este paquete jar se puede ejecutar de forma independiente.


Mire el mensaje de error anterior:

imagen-20211201094223991

Dado que esa configuración no se usó durante el empaquetado, se formó un paquete jar común después del empaquetado y no hay ningún atributo correspondiente a Main-Class en el archivo MANIFEST.MF, por lo que el tiempo de ejecución indica que no se puede encontrar el atributo de la lista principal. motivo del error.


No es muy significativo para nuestra programación comprender el contenido anterior, pero es útil para usted comprender el mecanismo de operación independiente del proyecto SpringBoot. De hecho, el proceso general es principalmente para llevar a todos a analizar. Si encuentra problemas similares en el futuro, hágase más preguntas y por qué, y tal vez pueda resolver el problema de forma independiente.


Resumir

El complemento spring-boot-maven-plugin se utiliza para empaquetar el programa actual en un paquete que puede ejecutarse de forma independiente.


Problemas y soluciones comunes de inicio de línea de comando

Cuando inicia el proyecto SpringBoot en el entorno DOS, puede encontrar el problema de la ocupación del puerto. Bríndeles a todos un conjunto de comandos, no es necesario estudiarlos en profundidad, solo haga una copia de seguridad.

# 查询端口
netstat -ano
# 查询指定端口
netstat -ano |findstr "端口号"
# 根据进程PID查询进程名称
tasklist |findstr "进程PID号"
# 根据PID杀死任务
taskkill /F /PID "进程PID号"
# 根据进程名称杀死任务
taskkill -f -t -im "进程名称"

En realidad, existen una serie de configuraciones y parámetros sobre cómo empaquetar y ejecutar el programa, hablemos de ello en el siguiente contenido, comencemos aquí y sepamos cómo empaquetar y ejecutar el programa.


Inicio rápido del proyecto SpringBoot (versión Linux)

De hecho, no hay mucha diferencia entre los programas que se ejecutan en el sistema Linux y los programas que se ejecutan en el sistema Windows. Los comandos siguen siendo el mismo conjunto de comandos, pero es posible que no esté familiarizado con los comandos de Linux, lo que conducirá a varias problemas. Por ejemplo, cómo cerrar el firewall, cómo consultar la dirección IP, cómo instalar el JDK, etc. Este no es el contenido clave que todos deben popularizar, solo comprenda el proceso general.


YW-2 Configuración avanzada

Parte de la configuración se ha discutido en el capítulo básico. En términos generales, la configuración del capítulo básico es para que todos dominen el formato de la configuración. Por ejemplo, cómo escribir archivos de configuración y cómo leer datos escritos son conocimientos básicos de nivel gramatical. En el capítulo práctico, nos centraremos en la aplicación de la configuración. A continuación, comenzaremos a aprender la primera parte del contenido relacionado con la configuración avanzada. ¿Por qué decimos la primera parte, porque hay conocimientos de configuración avanzada correspondientes que aprender en el Capítulo de desarrollo práctico.


YW-2-1. Configuración de atributos temporales

Nuestro paquete ahora está empaquetado y listo para su lanzamiento. Pero una vez que se completa el paquete del programa, la configuración interna ya está fijada, por ejemplo, el puerto del servidor está configurado para ser 8080. Si quiero iniciar el proyecto y descubro que ya se inició una aplicación en mi servidor y ocupa el puerto 8080, será vergonzoso en este momento. ¿Es necesario volver a modificar el programa empaquetado? Por ejemplo, quiero cambiar el puerto de inicio del programa empaquetado a 80.

imagen-20211206095113771


imagen-20211206095524343


imagen-20211206095101581


SpringBoot proporciona métodos de configuración flexibles. Si encuentra que es necesario reconfigurar propiedades individuales en su proyecto, puede usar propiedades temporales para modificar rápidamente algunas configuraciones. El método también es muy simple, simplemente agregue los parámetros correspondientes al inicio.

java –jar springboot.jar –-server.port=80

El comando anterior es el comando para iniciar el paquete SpringBoot. Después de ingresar el comando, ingrese un espacio y luego ingrese dos signos. A continuación, agregue los parámetros correspondientes en forma de nombre de atributo = valor de atributo. Recuerde, el formato aquí no es el formato de escritura en yaml. Cuando hay nombres de varios niveles para los atributos, se usan puntos para separarlos, que es exactamente el mismo que el formato de atributo en el archivo de propiedades.


Si encuentra que hay más de un atributo para modificar, puede continuar escribiendo de acuerdo con el formato anterior y usar espacios para separar los atributos.

java –jar springboot.jar –-server.port=80 --logging.level.root=debug

prioridad de carga de propiedad

Ahora la configuración de nuestro programa está controlada por dos lugares, el primer archivo de configuración y el segundo atributo temporal. Y descubrimos que la prioridad de carga de los atributos temporales es mayor que la de los archivos de configuración. ¿Hay alguna otra manera de configurarlo? De hecho, los hay, y hay bastantes, abra el contenido correspondiente en el documento oficial y podrá ver el orden de prioridad de lectura de la configuración. Aquí está la dirección: https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config

imagen-20211206100859236
Podemos ver que en realidad hay 14 posiciones de configuración y ahora estamos usando 2 de ellas. El artículo 3, los datos de configuración se refieren al uso de archivos de configuración y el artículo 11, los argumentos de la línea de comando, se refieren al uso de parámetros temporales de la línea de comando. El orden de estas 14 configuraciones es el orden en que SpringBoot carga la configuración. La implicación es que las propiedades temporales de la línea de comando tienen mayor prioridad que la carga del archivo de configuración, por lo que la prioridad en la parte superior de esta lista es baja. , y la prioridad en la parte inferior es alta. De hecho, no es necesario memorizar esto, solo recuerda una cosa, sabes qué efecto quieres al final, no importa cuán alto o bajo sea el orden, debes configurarlo en el orden que desees al desarrollar. Este orden es solo para ayudarlo a analizar cuando no puede resolver el problema.


Por ejemplo, ahora carga un atributo de nombre de usuario. Como resultado, descubre que el resultado es diferente de lo que pensaba. Debe ser que otros atributos con mayor prioridad que el suyo han sobrescrito sus atributos de configuración, entonces puede mirar el orden y verificar uno por uno. Qué ubicación tiene el potencial de anular sus atributos.


Hice esta pregunta cuando vi a mis amigos aprendiendo los conceptos básicos en el área de comentarios del curso, y fue por este motivo. El valor del atributo user.name está configurado en yaml y, cuando se lee, no es su propio valor de configuración, porque hay un atributo llamado user.name en el atributo del sistema y los dos entran en conflicto entre sí. La prioridad de carga de las propiedades del sistema es la número 5 en la lista anterior, que es mayor que la número 3, por lo que SpringBoot eventualmente cargará la propiedad de configuración del sistema nombre de usuario.


Resumir

1. Cuando use el comando jar para iniciar el proyecto SpringBoot, puede usar propiedades temporales para reemplazar las propiedades en el archivo de configuración
2. Agregue propiedades temporales: java –jar nombre del proyecto.jar –- nombre de propiedad=valor
3. Múltiples propiedades temporales están separados por espacios
4. El atributo temporal debe ser un atributo admitido por el proyecto de arranque actual; de lo contrario, la configuración no es válida


Utilice propiedades temporales en el entorno de desarrollo.

Actualmente está disponible el uso temporal, pero los atributos temporales ingresados ​​a través de la línea de comando deben ser correctos al conectarse, luego debemos probar los valores de configuración de estos atributos en el entorno de desarrollo. Hablemos sobre cómo usar atributos temporales en el entorno de desarrollo, que en realidad es cómo operar en la interfaz de Idea.


Abra la interfaz de ejecución de la clase de arranque SpringBoot y busque los elementos de configuración en ella. Entre ellos, la posición correspondiente a los argumentos del Programa es para agregar atributos temporales, y puedes agregar algunos para probar el efecto.

imagen-20211206101947622

Hacer esto realmente puede generar una idea. Aquellos que están familiarizados con la programación Java deben saber que cuando ejecutamos el método principal, si queremos usar los parámetros del método principal, es decir, el parámetro args a continuación, se agrega en el parámetro de posición anterior.

public static void main(String[] args) {
     
     
}

Resulta que este es el caso y los parámetros se pueden obtener a través de estos argumentos. Veamos cómo está escrita nuestra clase de arranque.

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

Este parámetro args en realidad se pasa al método de ejecución. Parece que los parámetros temporales configurados en Idea se pasan a nuestro programa a través de esta ubicación. La implicación es que si estos argumentos no se usan aquí, ¿se desconectará la entrada a la transferencia externa de atributos temporales? Este es el caso, podemos usar el siguiente método de llamada para que las propiedades temporales externas no puedan ingresar al programa SpringBoot.

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

O puede usar el siguiente formato para realizar esta operación, es decir, la configuración no se escribe en el archivo de configuración, sino que se escribe directamente como una matriz de cadenas y se pasa a la entrada del programa. Por supuesto, este enfoque no tiene importancia práctica para el desarrollo.

public static void main(String[] args) {
     
     
    String[] arg = new String[1];
    arg[0] = "--server.port=8082";
    SpringApplication.run(SSMPApplication.class, arg);
}

Resumir

Al iniciar el programa SpringBoot, puede elegir si desea utilizar el atributo de línea de comando para pasar las propiedades de inicio del programa SpringBoot.


pensar

Ahora es posible cambiar temporalmente la configuración antes de iniciar el proyecto usando propiedades temporales, pero han vuelto a surgir nuevos problemas. Los atributos temporales son fáciles de usar porque son fáciles de usar, pero escribir demasiado será problemático. Por ejemplo, ahora necesito configurar 20 valores con atributos temporales cuando me conecto. Esto es problemático. ¿Pueden simplificarlo y administrarlo de forma centralizada? Por ejemplo, ¿crear un archivo y cargar el archivo especificado? Es muy bueno. ¿Cómo hacerlo? Hablemos de ello en la siguiente sección.


YW-2-2 Clasificación de archivos de configuración

SpringBoot proporciona archivos de configuración y propiedades temporales para configurar el programa. He estado hablando de atributos temporales antes y esta sección hablará de archivos de configuración. De hecho, hemos estado usando este archivo de configuración, pero usamos uno de los cuatro niveles de archivos de configuración proporcionados por SpringBoot. Los cuatro niveles son:
1. El archivo de configuración en la ruta de clase (esto es lo que he estado usando, es decir, el archivo application.yml en el directorio de recursos)
2. El archivo de configuración en el directorio de configuración en la ruta de clase
3 .El archivo de configuración en el directorio donde se encuentra el paquete
4. El archivo de configuración en el directorio config en el directorio donde se encuentra el paquete


Es muy complicado, hablemos de ello uno por uno. De hecho, los 4 tipos de archivos anteriores se proporcionan para que usted escriba los 4 tipos de archivos de configuración. Las funciones son las mismas y todas son para configuración. Entonces lo que a todos les importa es la diferencia. Sí, es por las diferentes posiciones que hay diferencias. En términos generales, si existen los cuatro archivos de configuración, existe una cuestión de prioridad. Para decirlo sin rodeos, tengo los cuatro archivos y todos tienen la misma configuración, y la cuestión de quién tiene efecto. El orden de prioridad de carga de los 4 archivos anteriores es

1. archivo: config/application.yml 【最高】
2. archivo:application.yml
3. classpath:config/application.ym
4. classpath:application.yml 【最低】


Entonces, ¿por qué diseñar tal variedad? Hablamos de una de las aplicaciones más típicas.
1. Escenario A: Como desarrollador, cuando haces un programa, para facilitar tu propia escritura de código, la base de datos configurada debe estar conectada a tu propia máquina, usamos el nivel 4, que es el application.yml que ha sido usado antes.
2. Escenario B: ahora que el desarrollo del proyecto ha llegado a una etapa, se requieren depuración y pruebas conjuntas. La base de datos conectada es la base de datos del servidor de prueba y se debe cambiar un conjunto de configuraciones. Puede optar por cambiar todo el contenido de su archivo anterior y no es problemático en este momento.
3. Escenario C: Después de la prueba, todo está bien. Continúa escribiendo su código y descubre que el archivo de configuración que escribió originalmente se ha cambiado al contenido del servidor de prueba y debe volver a cambiarlo. ¿Entiendes ahora? En la escena B, todo tu contenido ha sido cambiado, necesitas volver a cambiarlo ahora, ¿qué pasa en el futuro? Quieres cambiarlo?


La solución es muy simple: puede resolver este problema rápidamente utilizando el archivo de configuración de 3 niveles anterior y simplemente escribiendo otra configuración. Dos archivos de configuración coexisten, porque la prioridad de carga de la configuración en el directorio de configuración es mayor que la suya, por lo que si el elemento de configuración es el mismo que el contenido del nivel 4, se sobrescribirá. ¿Es esto muy simple?


¿Cuándo se utilizan los niveles 1 y 2? ¿Este nivel se utilizará después de empaquetar el programa, independientemente de lo que esté escrito en la configuración de su programa? Mi nivel es alto y puedo cubrirte fácilmente, así que no tengo que considerar estos conflictos de configuración.


Resumir

1. Los archivos de configuración se dividen en 4 tipos 1.1 Archivo de configuración de ruta de clase del proyecto:
desarrollen y prueben localmente
para que los desarrolladores 1.4, archivos de configuración en el directorio de configuración de la ruta del proyecto: sirven para el control general de el administrador de operación y mantenimiento 2. Los atributos entre archivos de configuración multinivel se aplican al programa en forma de superposición y cobertura



YW-2-3.Archivos de configuración personalizados

El archivo de configuración que usamos para la configuración antes es application.yml, de hecho, el nombre de este archivo también se puede cambiar, lo cual es conveniente para el mantenimiento. Por ejemplo, realicé un evento el 1 de abril de 2020 y dejé un conjunto de configuraciones. El evento se canceló el 1 de mayo de 2020 y se restauró la configuración original. En este momento, solo necesito cambiar el archivo de configuración nuevamente. . Pero no puede modificar el archivo de configuración original; de lo contrario, una vez completada la actividad, la configuración de la actividad no se conservará, lo que no favorece el mantenimiento.


Hay dos formas de personalizar el archivo de configuración de la siguiente manera:
Método 1: usar atributos temporales para establecer el nombre del archivo de configuración. Tenga en cuenta que es solo el nombre sin la extensión.

imagen-20211206105548238


Método 2: utilice atributos temporales para establecer la ruta del archivo de configuración, que es el nombre completo de la ruta

imagen-20211206105716450


También puede configurar para cargar múltiples archivos de configuración.
imagen-20211206105750285

Una de las propiedades utilizadas es spring.config.name y la otra es spring.config.location, que debe distinguirse claramente.


Consejos amables

Ahora estamos estudiando el proyecto único SpringBoot, que es la versión de servidor único. De hecho, el desarrollo empresarial ahora utiliza más proyectos de servidores múltiples basados ​​​​en la tecnología SpringCloud. Este método de configuración es completamente diferente de lo que estamos aprendiendo ahora: todos los servidores ya no establecerán sus propios archivos de configuración, sino que obtendrán la configuración a través del centro de configuración y cargarán dinámicamente la información de configuración. ¿Por qué hiciste esto? gestión centralizada. No hablaré más de esto aquí y hablaré de estas cosas más tarde.


Resumir

1. El nombre del archivo de configuración se puede modificar configurando los parámetros de inicio
2. La ruta del archivo de configuración se puede modificar configurando los parámetros de inicio
3. El archivo de configuración se puede configurar a través del centro de configuración durante el desarrollo del microservicio


YW-3. Desarrollo multiambiente

El contenido de la charla se acerca cada vez más al desarrollo online, hablemos de desarrollo multiambiente.


¿Qué son múltiples entornos? De hecho, significa que el programa escrito en su computadora eventualmente se colocará en el servidor de otra persona para ejecutarlo. Cada entorno informático es diferente, esto es multientorno. El desarrollo multientorno común tiene en cuenta principalmente tres tipos de entornos: el entorno de desarrollo (utilizado por uno mismo), el entorno de prueba (utilizado por la empresa) y el entorno de producción (utilizado por el padre del Partido A). Debido a que se trata de tres computadoras absolutamente diferentes, el entorno debe ser diferente, como la base de datos conectada, el puerto de acceso configurado, etc.

inserte la descripción de la imagen aquí


YW-3-1. Desarrollo multientorno (versión de archivo único yaml)

Entonces, ¿qué es el desarrollo multiambiental? Simplemente establezca diferentes propiedades de configuración para diferentes entornos. Por ejemplo, cuando lo desarrolle usted mismo, configure su puerto de la siguiente manera:

server:
  port: 80

¿Cómo le gustaría diseñar dos conjuntos de entornos? separados por tres signos menos

server:
  port: 80
---
server:
  port: 81

¿Cómo distinguir los dos ambientes? nombralo

spring:
	profiles: pro
server:
	port: 80
---
spring:
	profiles: dev
server:
	port: 81

¿Cuál debería usar? Establecer cuál iniciar de forma predeterminada

spring:
	profiles:
		active: pro		# 启动pro
---
spring:
	profiles: pro
server:
	port: 80
---
spring:
	profiles: dev
server:
	port: 81

Es así de simple, está bien agregar otro conjunto de entornos.

spring:
	profiles:
		active: pro		# 启动pro
---
spring:
	profiles: pro
server:
	port: 80
---
spring:
	profiles: dev
server:
	port: 81
---
spring:
	profiles: test
server:
	port: 82

Entre ellos, el formato anterior para la definición del nombre del entorno es un formato desactualizado y el formato estándar es el siguiente

spring:
	config:
    	activate:
        	on-profile: pro

Resumir

1. El desarrollo multiambiente necesita configurar varios entornos comunes, como entornos de desarrollo, producción y prueba.
2. Configurar el uso multiambiente en formato yaml: distinguir los límites de la configuración del entorno.
3. La diferencia entre cada entorno. radica en las propiedades de configuración cargadas
4. Habilite ciertos Este entorno debe especificarse para usarse al inicio


YW-3-2.Desarrollo multientorno (versión multiarchivo yaml)

archivo de configuración principal

spring:
	profiles:
		active: pro		# 启动pro

Archivo de configuración del entorno

server:
	port: 80

Debido a que cada uno de los archivos de configuración del entorno configura sus propios elementos, no es necesario escribir el nombre en él. La pregunta es ¿cómo distinguir qué conjunto de configuraciones es este? Utilice el nombre del archivo para distinguir.


aplicación-pro.yaml

server:
	port: 80

aplicación-dev.yaml

server:
	port: 81

Las reglas de nomenclatura de archivos son: nombre del entorno de aplicación.yml.


En el archivo de configuración, si algunos elementos de configuración son iguales en todos los entornos, estos elementos se pueden escribir en la configuración principal y solo aquellos elementos que son diferentes se escriben en el archivo de configuración del entorno.
1. Establezca la configuración pública en el archivo de configuración principal (global)
2. A menudo se usa para establecer atributos de conflicto en el archivo de configuración de clasificación del entorno (local)


Resumir

1. Se pueden utilizar archivos de configuración independientes para definir las propiedades del entorno.
2. Los archivos de configuración independientes son convenientes para el mantenimiento y las actualizaciones del sistema en línea y garantizan la seguridad del sistema.


YW-3-3.Desarrollo multientorno (propiedades versión multiarchivo)

El formato de archivo de configuración más antiguo proporcionado por SpringBoot es el formato de propiedades. También comprendamos la configuración multientorno en este formato.


archivo de configuración principal

spring.profiles.active=pro

Archivo de configuración del entorno
application-pro.properties

server.port=80

propiedades de desarrollo de aplicaciones

server.port=81

La regla de nomenclatura del archivo es: nombre del entorno de aplicación.properties.


Resumir

La configuración multientorno del archivo de propiedades solo admite el formato de varios archivos.


YW-3-4. Habilidades de escritura de archivos de configuración independientes para el desarrollo de entornos múltiples

Como programador, cuando participa en la configuración, a menudo se encuentra en una situación en la que el largo plazo debe combinarse y el largo plazo debe dividirse. Escríbalos juntos al principio y luego divídalos para facilitar el mantenimiento. Lo mismo ocurre con el desarrollo multientorno. Déjame decirte cómo realizar una gestión independiente de la configuración basada en el desarrollo multientorno. Asegúrate de dominarlo.


Preparación

Divida toda la información de configuración en el archivo de configuración de acuerdo con la función y conviértala en un archivo de configuración independiente. Las reglas de nomenclatura son las siguientes:
1. application-devDB.yml
2. application-devRedis.yml
3. application-devMVC.yml


usar

Cuando utilice el atributo de inclusión para activar el entorno especificado, cargue varios entornos al mismo tiempo para que surtan efecto y utilice comas para separar varios entornos.

spring:
	profiles:
    	active: dev
        include: devDB,devRedis,devMVC

A modo de comparación, ahora es equivalente a cargar los 3 conjuntos de configuraciones correspondientes al cargar la configuración de desarrollo. La estructura es muy clara, qué se usa y cuál es el nombre correspondiente.


Aviso

Cuando el desarrollo del entorno principal tiene los mismos atributos que otros entornos, los atributos del entorno principal entran en vigor; cuando otros entornos tienen los mismos atributos, los últimos atributos del entorno cargados entran en vigor


mejora

Pero también hay un problema con la configuración anterior: por ejemplo, cuando quiero cambiar el entorno de desarrollo a profesional, también debo modificar la inclusión. Debido a que el atributo de inclusión solo se puede usar una vez, esto es más problemático. A partir de la versión 2.4, SpringBoot usa el atributo de grupo en lugar del atributo de inclusión, lo que reduce la cantidad de escritura de configuración. En pocas palabras, lo escribiré primero y usaré el que quieras.

spring:
	profiles:
    	active: dev
        group:
        	"dev": devDB,devRedis,devMVC
      		"pro": proDB,proRedis,proMVC
      		"test": testDB,testRedis,testMVC

Mirándolo ahora, si cambias de dev a pro, solo necesitas cambiarlo, ¿se acabó? ¡Perfecto!


Resumir

El desarrollo multientorno utiliza el atributo de grupo para establecer la agrupación de archivos de configuración, lo cual es conveniente para el mantenimiento y la administración en línea.


YW-3-5 Control de desarrollo multiambiente

El desarrollo multiambiente básicamente ha terminado aquí y finalmente es un tema de conflicto. Es qué hacer si maven y SpringBoot configuran múltiples entornos al mismo tiempo.


Para abordar este problema de conflicto, primero es necesario determinar quién ocupa la posición dominante en el desarrollo multiambiental. Es decir, si ahora se configuran varios entornos, cuál debe conservarse y el otro debe seguir la misma configuración.


¿Qué hace Maven? ¿Qué hace SpringBoot para la gestión de la construcción de proyectos y la generación final de paquetes de código? Desarrollo simplificado. La simplificación no es su papel protagonista. Al final, depende de maven administrar todo el proyecto, por lo que SpringBoot debería escuchar a maven. Después de la confirmación completa, lo siguiente es fácil de hacer. La idea general es la siguiente:
1. Primero configure un entorno específico en el entorno maven
2. Simplemente lea el entorno establecido por maven en SpringBoot


Configure múltiples entornos en maven (usando atributos para distinguir entornos)

<profiles>
    <profile>
        <id>env_dev</id>
        <properties>
            <profile.active>dev</profile.active>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>		<!--默认启动环境-->
        </activation>
    </profile>
    <profile>
        <id>env_pro</id>
        <properties>
            <profile.active>pro</profile.active>
        </properties>
    </profile>
</profiles>

Leer el valor de configuración de Maven en SpringBoot

spring:
	profiles:
    	active: @profile.active@

El @nombre de propiedad@ anterior es el formato gramatical para leer el valor de propiedad configurado en maven.


Resumir

1. Cuando Maven y SpringBoot controlan múltiples entornos al mismo tiempo, Mavn es el principal y SpringBoot usa el marcador de posición @…@ para leer el valor de propiedad de configuración correspondiente de Maven. 2. Bajo la premisa de leer las propiedades de configuración de Maven en función de SpringBoot, si está
en Al probar el proyecto en Idea, cada actualización de pom.xml debe compilarse manualmente para que surta efecto


YW-4.Registro

En la última parte del artículo sobre operación y mantenimiento, hablemos de registros. Todos están familiarizados con los registros, así que los presentaremos brevemente. El registro en realidad sirve para registrar la información de operación diaria del programa, y ​​sus funciones principales son las siguientes:
1. Depurar código durante el período de programación
2. Registrar información durante el período de operación
3. Registrar información importante sobre la operación diaria (tráfico pico, respuesta promedio tiempo...)
4. Registrar información de error de la aplicación (pila de errores)
5. Registrar datos del proceso de operación y mantenimiento (expansión, tiempo de inactividad, alarma...)


Tal vez ustedes no estén acostumbrados a usar registros, no importa, úselo más lentamente y acostúmbrese. Si quieres entrar a una gran fábrica, esto es lo más básico, no digas que nunca la has usado cuando vayas a la entrevista, se acabó y no tienes ninguna posibilidad.


YW-4-1. Utilice la herramienta de registro para registrar registros en el código.

El formato de uso del registro es muy fijo, así que vaya directamente a los pasos de operación:


Paso ①

Agregar acción de registro

@RestController
@RequestMapping("/books")
public class BookController extends BaseClass{
     
     
    private static final Logger log = LoggerFactory.getLogger(BookController.class);
    @GetMapping
    public String getById(){
     
     
        log.debug("debug...");
        log.info("info...");
        log.warn("warn...");
        log.error("error...");
        return "springboot is running...2";
    }
}

El objeto de registro en el código anterior es el objeto utilizado para registrar el registro, y las operaciones de log.debug y log.info a continuación son la API para escribir el registro.


Paso ②

Establecer el nivel de salida del registro


Una vez configurado el registro, puede elegir qué registros participantes según la configuración. Aquí se establece según el nivel del registro. Hay 6 niveles de registros, que son:
1. TRACE: información de la pila en ejecución, baja tasa de uso
2. DEBUG: uso del código de depuración del programador
3. INFO: registro de datos del proceso de operación y mantenimiento
4. WARN: registro de datos de alarma del proceso de operación y mantenimiento
5. ERROR: Registre la información de la pila de errores
6. FATAL: Información del desastre, fusionada en ERROR


En circunstancias normales, utilice DEBUG durante el desarrollo, utilice INFO después de conectarse y utilice WARN para registros de información de operación y mantenimiento. A continuación se explica cómo configurar el nivel de registro:

# 开启debug模式,输出调试信息,常用于检查系统运行状况
debug: true

Esta configuración es demasiado simple y grosera, y el sistema de registro generalmente proporciona un control detallado

# 开启debug模式,输出调试信息,常用于检查系统运行状况
debug: true

# 设置日志级别,root表示根节点,即整体应用日志级别
logging:
	level:
    	root: debug

También puede establecer un control más detallado


Paso ③

Configure el grupo de registros para controlar el nivel de salida de registros correspondiente al paquete especificado, o controle directamente el nivel de salida de registros correspondiente al paquete especificado

logging:
	# 设置日志组
    group:
    	# 自定义组名,设置当前组中所包含的包
        ebank: com.itheima.controller
    level:
    	root: warn
        # 为对应组设置日志级别
        ebank: debug
    	# 为对包设置日志级别
        com.itheima.controller: debug

Para decirlo sin rodeos, se trata de establecer la configuración general y de cada paquete. Si cree que la configuración es problemática, primero divida los paquetes en grupos y configúrelos para los grupos. Nada, eso es todo.


Resumir

1. El registro se utiliza para registrar mensajes de proceso de desarrollo, depuración y operación y mantenimiento
2. Hay 6 tipos de niveles de registro, generalmente 4 tipos son suficientes, a saber, DEBUG, INFO, WARN, ERROR
3. Se puede realizar en el forma de grupos de registros o paquetes de códigos Control de nivel de visualización de registros


enseñarte un truco

Optimizar el código de creación de objetos de registro


Al escribir código, cada clase debe escribir y crear objetos de registro, lo que se puede optimizar utilizando las clases de herramientas que nos proporcionó la tecnología lombok utilizada anteriormente.

@RestController
@RequestMapping("/books")
public class BookController extends BaseClass{
     
     
    private static final Logger log = LoggerFactory.getLogger(BookController.class);	//这一句可以不写了
}

Después de importar lombok, use anotaciones para hacerlo y el nombre del objeto de registro es registro

@Slf4j		//这个注解替代了下面那一行
@RestController
@RequestMapping("/books")
public class BookController extends BaseClass{
     
     
    private static final Logger log = LoggerFactory.getLogger(BookController.class);	//这一句可以不写了
}

Resumir

Agregue rápidamente objetos de registro a clases según la anotación @Slf4j proporcionada por lombok


YW-4-2.Control del formato de salida del registro

El registro ya se puede grabar, pero SpringBoot proporciona el formato de grabación actual. Si desea personalizar el control, debe configurarlo usted mismo. Primero analice el formato de registro del registro actual.

imagen-20211206123431222

Para un mensaje de registro único, la fecha, la ubicación del activador y la información del registro son la información principal. El nivel se utiliza para filtrar y el PID y el nombre del hilo se utilizan para un análisis preciso. Después de conocer esta información, puede crear el formato de registro usted mismo. Este curso no realiza una investigación detallada, los amigos interesados ​​pueden aprender conocimientos relacionados. El formato de escritura de la plantilla de registro oficial simulada en el curso se proporciona a continuación para que todos lo aprendan.

logging:
	pattern:
    	console: "%d %clr(%p) --- [%16t] %clr(%-40.40c){cyan} : %m %n"

Resumir

Reglas de formato de salida de registro


YW-4-3.Archivos de registro

La información del registro muestra que los registros han sido controlados, así que hablemos del volcado de los registros. El registro no solo se puede mostrar en la consola, sino que debe registrarse en un archivo para su posterior mantenimiento y referencia.


Existen diversas estrategias para el uso de archivos de registro, como registros diarios, registros clasificados, registros post-alarma, etc. Aquí estudiamos principalmente cómo se registran los archivos de registro.


El formato de registro de un archivo es muy simple, simplemente configure el nombre del archivo de registro.

logging:
	file:
    	name: server.log

Aunque el formato anterior se puede utilizar para registrar el registro, frente a situaciones complejas en línea, un registro de archivo definitivamente no puede cumplir con los requisitos de operación y mantenimiento. Por lo general, los archivos de registro se registran todos los días. Al mismo tiempo , Para facilitar el mantenimiento, cada uno El tamaño del archivo de registro. Los métodos de configuración comunes para archivos de registro se detallan a continuación:

logging:
	logback:
    	rollingpolicy:
        	max-file-size: 3KB
            file-name-pattern: server.%d{
     
     yyyy-MM-dd}.%i.log

El formato anterior se basa en la tecnología de registro de inicio de sesión para establecer el formato de configuración del archivo de registro diario. Es necesario volcar la información al segundo archivo después de que la capacidad alcance los 3 KB. %d en las reglas de nomenclatura de archivos identifica la fecha y %i es una variable incremental utilizada para distinguir los archivos de registro.


Resumir

1. Registrar registros en archivos
2. Registrar configuraciones de formato de archivo


Fin de los artículos prácticos de operación y mantenimiento.

El artículo práctico de operación y mantenimiento llegará a su fin aquí, ¿por qué no decir que se acabó? Porque todavía hay algo de conocimiento en el capítulo de operación y mantenimiento, pero la explicación ahora está demasiado dispersa. Por tanto, también es la materialización del diseño docente de esta asignatura combinar estos conocimientos con los conocimientos propios del desarrollo práctico.


En el capítulo práctico general de operación y mantenimiento, llevé a todos a aprender 4 contenidos: primero, aprendí cómo ejecutar el programa SpringBoot, es decir, el empaquetado y operación del programa, luego actualicé la configuración y lo aprendí. , Ya no se limita a la configuración en el archivo de configuración, a través de propiedades temporales y archivos de configuración externos para controlar la configuración del proyecto. En el desarrollo multientorno, introduje varios formatos de desarrollo multientorno, de hecho, puedes dominar uno, además, también te conté algunas habilidades en desarrollo multientorno y resolución de conflictos con maven. Finalmente, les presenté el sistema de registro. Para ser honesto, el registro es bastante descuidado aquí, porque la mayor parte del conocimiento relacionado con el registro no debe aprenderse en este curso. Aquí solo le diré cómo integrarlo y usarlo en la práctica. .


Después de leer los comentarios de todos los amigos, sé que seguirán solicitando actualizaciones y yo también estoy trabajando duro, trabajemos duro juntos y nos vemos en el capítulo de desarrollo práctico. El capítulo de desarrollo práctico aumentará la frecuencia de las actualizaciones. Lo actualizaré para todos si no lo termino todo. Abriré una parte primero y luego lo actualizaré cuando lo termine. Um, bueno , paremos aquí.

Supongo que te gusta

Origin blog.csdn.net/weixin_51157081/article/details/132550373
Recomendado
Clasificación