Tabla de contenido
1. Descubrimiento de servicios
1.1 Características de los microservicios
1.2 Caso de descubrimiento de servicios
1.2.2 Construir el servicio nacos
2.2 Características de configuración
2.4 Modelo de gestión de la configuración
2.5 Caso del Centro de configuración
2.5.1 Crear un espacio de nombres
2.5.2 Agregar dependencia pom al proyecto nacos-consumer
2.5.7 Expansión del centro de configuración
1. Descubrimiento de servicios
1.1 Características de los microservicios
- La capa de servicio se divide en microservicios por empresa.
- Las responsabilidades de los microservicios son únicas.
- Los protocolos livianos como RESTful y RPC se utilizan para la transmisión entre microservicios.
- Favorece el uso de una arquitectura de separación de front-end y back-end.
1.2 Caso de descubrimiento de servicios
1.2.1 Resumen
En la arquitectura de microservicios, todo el sistema se divide en múltiples servicios de acuerdo con sus responsabilidades y capacidades, y los objetivos comerciales se logran mediante la colaboración entre servicios. De esta manera, es inevitable realizar llamadas remotas entre servicios en nuestro código. El consumidor del servicio debe llamar al productor del servicio. Para completar una solicitud, el consumidor debe conocer la ubicación de la red (dirección IP y número de puerto) del productor del servicio.
Nuestro código puede leer la ubicación de red del productor de servicios leyendo el archivo de configuración, de la siguiente manera:
1.2.2 Construir el servicio nacos
Construcción del clúster de Nacos
1.2.3 Crear proyecto
Proyecto principal pom, xml
<modules>
<module>nacos-provider</module>
<module>nacos-consumer</module>
</modules>
<name>nacos</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
proveedor de nacos pom.xml
<name>nacos-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
nacos-consumer pom.xml igual que arriba
application.yml ambos son iguales, modifique el nombre del servicio appicatiion.name y el puerto del proyecto server.port
server:
port: 56020
spring:
application:
name: nacos-rest-consumer
cloud:
nacos:
discovery:
server-addr: nacosIp:nacosPort # 默认端口8848
Controlador del consumidor de servicios
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.net.URI;
/**
* @author yd
* @version 1.0
* @date 2020/9/27 11:23
*/
@RestController
public class RestConsumerController {
/**
* 服务id即注册中心的中的服务名
*/
private String serviceId = "nacos-provider";
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping(value = "/service")
public String service() {
RestTemplate restTemplate = new RestTemplate();
ServiceInstance serviceInstance = loadBalancerClient.choose(serviceId);
URI uri = serviceInstance.getUri();
String forObject = restTemplate.getForObject(uri+"/service", String.class);
return "consumerinvoke" + forObject;
}
}
RestProviderController
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author yd
* @version 1.0
* @date 2020/9/27 11:16
*/
@RestController
public class RestProviderController {
/**
* 暴露服务
* @return
*/
@GetMapping(value = "/service")
public String service() {
System.out.println("provider invoke");
return "provider invoke";
}
}
1.2.4 Iniciar acceso
2. Centro de configuración
2.1 Resumen
Las aplicaciones a menudo necesitan leer cierta información de configuración al iniciarse y ejecutarse. La configuración básicamente acompaña a todo el ciclo de vida de la aplicación, como: parámetros de conexión a la base de datos, parámetros de inicio, etc.
En la arquitectura de microservicio, cuando el sistema se divide de una sola aplicación en nodos de servicio en un sistema distribuido, los archivos de configuración también se deben migrar (dividir), de modo que la configuración se dispersa, no solo eso, sino que también incluye Redundancia
2.2 Características de configuración
- Los elementos de configuración son fáciles de leer y modificar
- Capacidad de gestión de la configuración de la aplicación en un entorno distribuido, es decir, la capacidad de gestionar la configuración de forma remota
- Puede ver el historial de modificación de la configuración
- Aislamiento de la configuración de la aplicación en diferentes entornos de implementación
2.3 ventajas de ncaos
- Alto rendimiento de lectura y escritura
- Interfaz de gestión de operación y mantenimiento propia
- Código abierto de Alibaba
2.4 Modelo de gestión de la configuración
Para la gestión de la configuración de Nacos, un conjunto de configuración se puede ubicar a través del espacio de nombres, el grupo y el ID de datos.
- Espacio de nombres: representa diferentes entornos, como entornos de desarrollo, pruebas y producción.
- Grupo: representa un proyecto, como XX proyecto médico, XX proyecto de comercio electrónico
- DataId: a menudo hay varios proyectos en cada proyecto, y cada conjunto de configuración (DataId) es el archivo de configuración principal de un proyecto
2.5 Caso del Centro de configuración
2.5.1 Crear un espacio de nombres
Espacio de nombres -> Nuevo espacio de nombres
Nueva configuracion
Ejemplo
common:
name: bushuangli--热加载
server:
port: 8089
2.5.2 Agregar dependencia pom al proyecto nacos-consumer
<!--配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.5.3 Configure lo siguiente en el archivo bootstrap.yml (debe ser el archivo bootstrap.yml, no el archivo application.yml):
spring:
cloud:
nacos:
discovery:
server-addr: nacosip:nacosport
cluster-name: DEFAULT # 默认集群,可不填写
config:
file-extension: yaml #nacos选的配置格式
group: DEFAULT_GROUP # nacosgroup
namespace: 8ee806e0-6fa8-4842-a051-6f55df4972bc # nacos命名空间
server-addr: nacosip:nacosport
cluster-name: DEFAULT # 默认集群,可不填写
prefix: nacos-rest-consumer #prefix 默认为 spring.application.name 的值
2.5.4 Estructura del proyecto
2.5.5 Escriba un RestController, agregue @RefreshScope al controlador para implementar la carga en caliente de la configuración. el código se muestra a continuación:
/**
* RefreshScope 配置热加载
* @author BSL
*/
@RestController
@RefreshScope
public class RestConsumerController {
/**
* 服务id即注册中心的中的服务名
*/
private String serviceId = "nacos-provider";
@Value("${common.name}")
private String common_name;
@GetMapping(value = "/configs")
public String getvalue(){
return common_name;
}
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping(value = "/configs2")
public String getvalue2(){
String common_name = applicationContext.getEnvironment().getProperty("common.name");
return common_name;
}
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping(value = "/service")
public String service() {
RestTemplate restTemplate = new RestTemplate();
ServiceInstance serviceInstance = loadBalancerClient.choose(serviceId);
URI uri = serviceInstance.getUri();
String forObject = restTemplate.getForObject(uri+"/service", String.class);
return "consumerinvoke" + forObject;
}
}
2.5.6 Prueba
Inicie el proyecto nacos-consumer, visite localhost: 8089 / configs en el navegador, puede volver al common.name configurado en la consola de nacos. Cambie la configuración de common.name en la página web de nacos, vuelva a visitar localhost: 8089 / configs sin reiniciar el proyecto nacos-provider y devuelva el valor modificado Se puede ver que nacos ha implementado la función de recarga en caliente como centro de configuración.
2.5.7 Expansión del centro de configuración
Cuando se usa Spring Cloud con Nacos Config como centro de configuración, Nacos admite la administración de la configuración de múltiples entornos, generalmente a través de espacios de nombres, como
public, dev, y si usa el mismo centro de configuración para tener múltiples grupos de proyectos o equipos o diferentes módulos para la administración, generalmente usa Group para distinguir los detalles de configuración relacionados con Nacos Config, que se presentan en la documentación oficial, y puede leerlo Comprender, https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki/Nacos-config
Si desea admitir el uso de varios archivos de configuración, bootstrap.yml debe usar ext-config
Crea una nueva configuración
bootstrap.yml
spring:
cloud:
nacos:
discovery:
server-addr: nacosip:nacosport
cluster-name: DEFAULT # 默认集群,可不填写
config:
server-addr: nacosip:nacosport
cluster-name: DEFAULT # 默认集群,可不填写
prefix: nacos-rest-consumer #prefix 默认为 spring.application.name 的值
file-extension: yaml #file-exetension 为配置内容的数据格式
namespace: 8ee806e0-6fa8-4842-a051-6f55df4972bc # nacose 命名空间id
ext-config:
- data-id: nacos-rest-consumer.yaml
group: DEFAULT_GROUP
- data-id: nacos-consumer-data-source.yaml # Nacos上配置集的ID,这里要注意的是这个 data-id一定要有后缀名
group: MYSQL # 自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP
refresh: true # 控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是false,代表启动时获取一次
En el caso anterior, se configuran dos conjuntos de configuración extendidos para ser asignados a los grupos DEFAULT_GROUP y MYSQL respectivamente. El nacos-rest-consumer.yaml no se actualiza en tiempo real. Aquí, la prioridad de nacos-consumer-data-source.yaml es mayor que nacos-rest-consumer. yaml, debido a que el orden de tamaño de prioridad es extension-configs [n], cuanto mayor es la n, mayor es la prioridad, más prioridad es el valor de configuración del conjunto de configuración
- data-id: el ID de la configuración establecida en Nacos. Cabe señalar que este data-id debe tener un nombre de sufijo
- grupo: el grupo donde se encuentra el ID de datos personalizado, si no está configurado explícitamente, el valor predeterminado es DEFAULT_GROUP
- refrescar: controle si el ID de datos admite la actualización dinámica en la aplicación cuando cambia la configuración y se detecta el último valor de configuración. El valor predeterminado es falso, lo que significa obtener una vez al inicio
controlador
@Value("${datasource2.root}")
private String root;
@GetMapping(value = "/configs3")
public String getvalue3(){
return root;
}