Cas de construction du centre de découverte et de configuration Nacos-Service

table des matières

1. Découverte de service

1.1 Caractéristiques des microservices

1.2 Cas de découverte de service

1.2.1 Aperçu

1.2.2 Créer un service nacos

1.2.3 Créer un projet

1.2.4 Démarrer l'accès

2. Centre de configuration

2.1 Aperçu

2.2 Caractéristiques de configuration

2.3 Avantages ncaos

2.4 Modèle de gestion de la configuration 

2.5 Cas du centre de configuration

2.5.1 Créer un espace de noms

2.5.2 Ajouter une dépendance pom au projet nacos-consumer

2.5.3 Configurez les éléments suivants dans le fichier bootstrap.yml (il doit s'agir du fichier bootstrap.yml et non du fichier application.yml):

2.5.4 Structure du projet

2.5.5 Ecrivez un RestController, ajoutez @RefreshScope au Controller pour implémenter le chargement à chaud de la configuration. code montrer comme ci-dessous:

2.5.6 Test

2.5.7 Extension du centre de configuration


1. Découverte de service

1.1 Caractéristiques des microservices

  1. La couche de service est divisée en microservices par entreprise.
  2. Les responsabilités des microservices sont uniques.
  3. Des protocoles légers tels que RESTful et RPC sont utilisés pour la transmission entre les microservices.
  4. Propice à l'utilisation d'une architecture de séparation front-end et back-end.

1.2 Cas de découverte de service

1.2.1 Aperçu


  Dans l'architecture des microservices, l'ensemble du système est divisé en plusieurs services en fonction de leurs responsabilités et capacités, et les objectifs commerciaux sont atteints grâce à la collaboration entre les services. De cette façon, il est inévitable de faire des appels à distance entre les services dans notre code. Le consommateur du service doit appeler le producteur du service. Pour compléter une demande, le consommateur doit connaître l'emplacement réseau (adresse IP et numéro de port) du producteur du service.
  Notre code peut lire l'emplacement réseau du producteur de services en lisant le fichier de configuration, comme suit:

1.2.2 Créer un service nacos

Construction du cluster Nacos

1.2.3 Créer un projet

Projet parent 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>

fournisseur 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 comme ci-dessus

application.yml sont identiques, modifiez le nom du service appicatiion.name et le port du projet server.port

server:
  port: 56020
spring:
  application:
    name: nacos-rest-consumer
  cloud:
    nacos:
      discovery:
        server-addr: nacosIp:nacosPort # 默认端口8848

Contrôleur des consommateurs de services

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 Démarrer l'accès

2. Centre de configuration

2.1 Aperçu

Les applications ont souvent besoin de lire certaines informations de configuration lors du démarrage et de l'exécution. La configuration accompagne essentiellement tout le cycle de vie de l'application, tels que: les paramètres de connexion à la base de données, les paramètres de démarrage, etc.

Dans l'architecture de microservice, lorsque le système est séparé d'une seule application en nœuds de service sur le système distribué, les fichiers de configuration doivent également être migrés (fractionnés), de sorte que la configuration soit dispersée. Non seulement cela, mais également Redondance

2.2 Caractéristiques de configuration

  • Les éléments de configuration sont faciles à lire et à modifier
  • Gérabilité de la configuration des applications dans un environnement distribué, c'est-à-dire la possibilité de gérer la configuration à distance 
  • Peut afficher l'historique de la modification de la configuration 
  • Isolation de la configuration des applications dans différents environnements de déploiement 

2.3 Avantages ncaos

  1. Performances de lecture et d'écriture élevées
  2. Propre interface de gestion des opérations et de la maintenance
  3. Alibaba open source

2.4 Modèle de gestion de la configuration 

Pour la gestion de la configuration Nacos, un jeu de configuration peut être localisé via l'espace de nom, le groupe et l'ID de données.

  • Espace de noms: représente différents environnements, tels que les environnements de développement, de test et de production.
  • Groupe: représente un projet, tel que XX projet médical, XX projet e-commerce
  • DataId: il y a souvent plusieurs projets sous chaque projet, et chaque jeu de configuration (DataId) est le fichier de configuration principal d'un projet

2.5 Cas du centre de configuration

2.5.1 Créer un espace de noms

Espace de noms -> Nouvel espace de noms

Nouvelle configuration

Exemple

common:
    name: bushuangli--热加载
server:
  port: 8089

2.5.2 Ajouter une dépendance pom au projet nacos-consumer

        <!--配置中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

2.5.3 Configurez les éléments suivants dans le fichier bootstrap.yml (il doit s'agir du fichier bootstrap.yml et non du fichier 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 Structure du projet

2.5.5 Ecrivez un RestController, ajoutez @RefreshScope au Controller pour implémenter le chargement à chaud de la configuration. code montrer comme ci-dessous:


/**
 * 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 Test

Démarrez le projet nacos-consumer, visitez localhost: 8089 / configs sur le navigateur, vous pouvez revenir au common.name configuré sur la console nacos. Modifiez la configuration de common.name sur la page Web nacos, visitez à nouveau localhost: 8089 / configs sans redémarrer le projet nacos-provider et renvoyez la valeur modifiée. On peut voir que nacos a implémenté la fonction de rechargement à chaud en tant que centre de configuration.

2.5.7 Extension du centre de configuration

Lors de l'utilisation de Spring Cloud avec Nacos Config comme centre de configuration, Nacos prend en charge la gestion de la configuration de plusieurs environnements, généralement via des espaces de noms, tels que

public, dev, et si vous utilisez le même centre de configuration pour avoir plusieurs groupes de projets ou équipes ou différents modules de gestion, vous utilisez généralement Group pour distinguer les détails de configuration liés à Nacos Config, qui sont introduits dans la documentation officielle, et vous pouvez le lire Comprenez, https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki/Nacos-config

Si vous souhaitez prendre en charge l'utilisation de plusieurs fichiers de configuration, bootstrap.yml doit utiliser ext-config

Créer une nouvelle configuration

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,代表启动时获取一次


Dans le cas ci-dessus, deux ensembles de configuration étendus sont configurés pour être respectivement alloués aux groupes DEFAULT_GROUP et MYSQL. Le nacos-rest-consumer.yaml n'est pas actualisé en temps réel. Ici, la priorité de nacos-consumer-data-source.yaml est supérieure à nacos-rest-consumer. yaml, car l'ordre de la taille de priorité est extension-configs [n], plus le n est grand, plus la priorité est grande et plus la valeur de configuration du jeu de configuration est prioritaire

  • data-id: ID de la configuration définie sur Nacos. Notez que ce data-id doit avoir un nom de suffixe
  • groupe: groupe dans lequel se trouve l'ID de données personnalisé, s'il n'est pas explicitement configuré, la valeur par défaut est DEFAULT_GROUP
  • refresh: contrôlez si l'ID de données prend en charge l'actualisation dynamique dans l'application lorsque la configuration change et que la dernière valeur de configuration est détectée. La valeur par défaut est false, ce qui signifie obtenir une fois au démarrage

manette

 @Value("${datasource2.root}")
    private String root;
    @GetMapping(value = "/configs3")
    public String getvalue3(){
        return root;
    }

 

Je suppose que tu aimes

Origine blog.csdn.net/adminBfl/article/details/108816554
conseillé
Classement