SpringCloud Alibaba系列——1Nacos应用

本文详细介绍了Nacos作为微服务的注册中心和配置管理平台,包括Nacos的定义、架构,Nacos-server的多种启动方式,Nacos客户端在SpringBoot和SpringCloud中的集成,以及Nacos集群的搭建和监控。同时,文章预告将探讨Nacos节点类型、一致性协议以及配置推送模型等深入话题。

学习目标

  1. nacos是什么

  2. nacos的作用

  3. nacos-server部署

  4. nacos集成springboot

  5. nacos集成springcloud

  6. nacos常用api的使用

  7. nacos集群部署

第1章 概述

官网:home

1.1 Nacos是什么

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

上面这段话就是官网给的解释,实际上说白了,Nacos就是一个做注册中心的和配置中心的。

1.2 Nacos架构

Nacos的整体架构还是比较清晰的,我们可以从下面这个官方提供的架构图进行简单分析。

事实上Nacos就是一个springboot的web项目,它提供了注册和配置的相关核心功能,然后对外暴露了各种接口;我相信做过javaweb开发的同学都知道,怎么对外提供接口呢?无非就是通过controller层暴露一些RequestMapping嘛,这点,咱们可以通过源码去验证。

nacos具体暴露哪些接口调用可以参考:Open API 指南

到这一步,我们大概明白了nacos的架构了,但是有一个问题,虽然nacos提供了各种接口,但是我们要使用它的话,不能我们自己去封装各种http调用工具去调用它的接口吧?如果是要我们自己通过业务代码去封装工具的话,那nacos的价值也不会很高,所以,为了让我们使用起来更加方便,nacos的设计者肯定是要帮我们做一些事情的,这个时候nacos就分为了两个模块:nacos-server(主要提供注册和配置的核心功能)和nacos-client端(这里面实际上就是封装了http调用的一些工具,让使用者不需要自己去封装,只要调用方法就好了)。

nacos-client封装了哪些方法可以参考:Java SDK

到这一步,事实上还是不够,我们一起来想想,虽然nacos-client端给我们封装了工具,但是我业务代码还是得去手动调用这些方法,还是对我的业务代码有侵入性,这样的话还是不够简洁。这个时候怎么办呢?我们会想到springboot的自动装配,通过springboot去帮我们完成对象的实例化,然后在适当的时机自动帮我们调用核心api。

这个时候好事之人帮我们对nacos-client包又进行了封装,有注册的jar包:nacos-discovery-spring-boot-starter和配置的jar包:nacos-config-spring-boot-starter,但是事实上这两个jar包功能还不够强大,因为无法做到自动注册,而且动态刷新配置的时候需要加一些注解,那好事之人又出现了,对nacos-client做了更进一步封装:spring-cloud-starter-alibaba-nacos-discovery和spring-cloud-starter-alibaba-nacos-config。后面会具体介绍如何使用。

第2章 Nacos应用

2.1 Nacos-server启动

我们需要先启动Nacos服务,启动服务有两种方式,一种是直接下载已经编译好的包直接运行。另一种是通过源码来构建。

2.1.1 直接启动

下载地址:Releases · alibaba/nacos · GitHub

上传到服务器 cd /usr/local/eclipse2019

解压:tar -zxvf nacos-server-1.4.2.tar.gz

进入/usr/local/eclipse2019/nacos/bin目录下执行

./startup.sh -m standalone或sh startup.sh -m standalone 命令启动单机模式nacos

关闭firewall:systemctl stop firewalld.service

禁止firewall开机启动:systemctl disable firewalld.service

nacos设置开机自启动  

1.添加nacos.service文件
vim /lib/systemd/system/nacos.service

[Unit]
Description=nacos
After=network.target

[Service]
Type=forking
Environment=“JAVA_HOME=/usr/local/eclipse2019/java"
ExecStart=/usr/local/eclipse2019/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/eclipse2019/nacos/bin/shutdown.sh
ExecStop=/usr/local/eclipse2019/nacos/bin/shutdown.sh
PrivateTmp=true

[Install]  
WantedBy=multi-user.target
 

2.加入nacos服务
systemctl daemon-reload
3.设置开机自启
systemctl enable nacos.service
4.查看该service是否开机启用
systemctl is-enabled nacos.service
5.启动nacos服务和关闭服务
systemctl start nacos.service
systemctl stop nacos.service
6.查看该服务状态
systemctl status nacos.service

如果开启自启报which: no javac in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)错误,解决方案:

vim /usr/local/eclipse2019/nacos/bin/startup.sh

JAVA_HOME=/usr/local/eclipse2019/java

 

2.1.2 docker启动

Nacos也可以直接通过docker安装。

docker run -d --name nacos-server-8848 -p 8848:8848 --privileged=true --network=host -v /opt/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties -v /opt/nacos/logs:/home/nacos/logs --restart=always -e MODE=standalone -e PREFER_HOST_MODE=hostname nacos/nacos-server:1.1.0

开放8848端口

firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload #重启firewall

2.1.3 基于源码构建

1)从GitHub上下载源码

git clone https://github.com/alibaba/nacos.git

cd nacos/

mvn -Prelease-nacos clean install -U

ls -al distribution/target/

cd distribution/target/nacos-server-$version/nacos/bin

2)启动服务

linux系统下:  sh startup.sh -m standalone
window系统:  cmd startup.cmd

3)如果是源码启动

  • 下载源码到本地,然后通过ideal打开:

  • 如果编译nacos源码失败com.alibaba.nacos.consistency.entity

    • 下载Release Protocol Buffers v3.16.0 · protocolbuffers/protobuf · GitHub

    • 在Path中添加D:\Program Files\protoc-3.16.0-win64\bin

    • 进入到源码的这个consistency/src/main/proto/路径下,使用cmd命令,运行如下指令

      protoc --java_out=../java/ ./consistency.proto

      protoc --java_out=../java/ ./Data.proto

      命令执行完,就能编译成功了

  • 进入到console包下修改配置文件application.properties

    #*************** Config Module Related Configurations ***************#
    ### If use MySQL as datasource:
    spring.datasource.platform=mysql
    
    ### Count of DB:
    db.num=1
    
    ### Connect URL of DB:
    db.url.0=jdbc:mysql://192.168.8.74:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user.0=root
    db.password.0=123456

  • 添加启动配置

  • 然后执行main方法

2.1.4 访问nacos

http://localhost:8848/nacos

默认的帐号密码是:nacos/nacos

2.2 Nacos-client应用

2.2.1 集成springboot

2.2.1.1 动态配置

官方提供代码案例见nacos-spring-boot-example/nacos-spring-boot-config-example

下面我们自己实现一下

  • 创建spring boot应用

  • 添加nacos配置中心的依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.2.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>springboot-eclipse2019-nacos-config</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>springboot-eclipse2019-nacos-config</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-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba.boot</groupId>
                <artifactId>nacos-config-spring-boot-starter</artifactId>
                <version>0.2.7</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
  • 创建一个controller作为测试

    @RestController
    @NacosPropertySource(dataId = "example-dev.properties",autoRefreshed = true)
    public class TestController {
        @NacosValue(value="${eclipse2019:woman}",autoRefreshed = true)
        private String eclipse2019;
    
        @GetMapping("/get")
        public String get(){
            return "eclipse2019是个"+eclipse2019;
        }
    }
  • 修改application.properties文件

    nacos.config.server-addr=192.168.8.74:8848

2.2.1.2 注册中心

官方提供代码案例见nacos-spring-boot-example/nacos-spring-boot-discovery-example

springboot集成nacos自身没有提供自动注册的api,需要手动实现

  1. 简单注册实现

    • 添加jar包依赖

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>2.3.2.RELEASE</version>
              <relativePath/> <!-- lookup parent from repository -->
          </parent>
          <groupId>com.example</groupId>
          <artifactId>springboot-eclipse2019-nacos-discovery</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <name>springboot-eclipse2019-nacos-discovery</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-web</artifactId>
              </dependency>
      
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-test</artifactId>
                  <scope>test</scope>
              </dependency>
      
              <dependency>
                  <groupId>com.alibaba.boot</groupId>
                  <artifactId>nacos-discovery-spring-boot-starter</artifactId>
                  <version>0.2.7</version>
              </dependency>
          </dependencies>
      
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
                  </plugin>
              </plugins>
          </build>
      
      </project>
    • 创建一个测试类,用户返回当前nacos服务器上注册的服务列表

      @RestController
      public class ServiceController {
          @NacosInjected
          private NamingService namingService;
          @GetMapping("/discovery")
          public List<Instance> get(@RequestParam String serviceName) throws NacosException {
              return namingService.getAllInstances(serviceName);
          }
          @PostMapping("/registry")
          public void registry(@RequestBody RegistryInstance registryInstance) throws NacosException {
              namingService.registerInstance(registryInstance.getSeriveName(),registryInstance.getIp(),
                      registryInstance.getPort(),registryInstance.getGroupName());
      
          }
      }
    • 修改application.properties文件

      nacos.discovery.server-addr=192.168.8.74:8848
    • 先调用registry这个接口,向nacos注册服务

    • 再访问 http://localhost:8080/discovery?serviceName=example 获取指定服务的实例信息

    • 也可以通过直接调用nacos server的服务注册接口进行服务注册

      http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=example&ip=127.0.0.1&port=8080
  2. 自动注册实现

    • pom文件中增加

      <dependency>
          <groupId>com.alibaba.boot</groupId>
          <artifactId>nacos-config-spring-boot-starter</artifactId>
          <version>0.2.7</version>
      </dependency>
    • application.properties中添加以下配置

      # springApplicationName
      spring.application.name=nacos-server
      # 应用端口以及地址
      server.port=8088
      server.ip=192.168.8.20
      # nacos配置中心地址
      nacos.config.server-addr=192.168.8.74:8848
    • 然后在项目中增加配置类

      @Configuration
      @NacosPropertySource(dataId = "springboot-eclipse2019-nacos-discovery",autoRefreshed = true)
      public class NacosConfig {
          @Value("${server.port}")
          private int serverPort;
      
          @Value("${server.ip}")
          private String ip;
      
          @Value("${spring.application.name}")
          private String applicationName;
      
          @NacosInjected
          private NamingService namingService;
      
          /**
           * 开机自动注册服务
           *
           * @throws NacosException
           */
          @PostConstruct
          public void registerInstance() throws NacosException {
              namingService.registerInstance(applicationName, ip, serverPort);
          }
      
      }

      这种方式不够友好,会存在bean实例化的时候去注册服务,但是此时服务并不一定百分百启动成功。所以自动注册还可以通过下面这种方式

    • 通过事件监听的方式实现自动注册

      @Component
      public class AutoReigsterDemo implements ApplicationListener {
      
          @Value("${server.port}")
          private int serverPort;
      
          @Value("${server.ip}")
          private String ip;
      
          @Value("${spring.application.name}")
          private String applicationName;
      
          @NacosInjected
          private NamingService namingService;
      
          @Override
          public void onApplicationEvent(ApplicationEvent applicationEvent) {
              try {
                  namingService.registerInstance(applicationName, ip, serverPort);
              } catch (NacosException e) {
                  e.printStackTrace();
              }
          }
      }

2.2.2 集成springcloud

2.2.2.1 注册中心

接下来,我们通过一个案例来演示一下spring cloud alibaba下使用nacos实现配置中心以及服务注册的功能。

官方代码见nacos-examples-master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example

下面我们自己实现一下

  1. maven父工程

    springcloud-eclipse2019-nacos-discovery

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
        <spring-boot.version>2.2.5.RELEASE</spring-boot.version>
    </properties>
    
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>springcloud-eclipse2019-nacos-discovery</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>nacos-api</module>
        <module>nacos-provider</module>
        <module>nacos-consumer</module>
    </modules>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>2.1.0.RELEASE</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
  2. 接口端

    创建maven的quickstart项目,nacos-api

    1. pom文件替换

      <parent>
          <groupId>com.example</groupId>
          <artifactId>springcloud-eclipse2019-nacos-discovery</artifactId>
          <version>1.0-SNAPSHOT</version>
      </parent>
      
      <modelVersion>4.0.0</modelVersion>
      
      <groupId>com.example</groupId>
      <artifactId>nacos-api</artifactId>
      <version>1.0-SNAPSHOT</version>
      
      <dependencies>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-openfeign</artifactId>
          </dependency>
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-openfeign-core</artifactId>
              <version>2.0.0.RELEASE</version>
          </dependency>
      </dependencies>
      
      <build>
          <pluginManagement>
              <plugins>
                  <plugin>
                      <artifactId>maven-clean-plugin</artifactId>
                      <version>3.1.0</version>
                  </plugin>
                  <plugin>
                      <artifactId>maven-resources-plugin</artifactId>
                      <version>3.0.2</version>
                  </plugin>
                  <plugin>
                      <artifactId>maven-compiler-plugin</artifactId>
                      <version>3.8.0</version>
                  </plugin>
                  <plugin>
                      <artifactId>maven-surefire-plugin</artifactId>
                      <version>2.22.1</version>
                  </plugin>
                  <plugin>
                      <artifactId>maven-jar-plugin</artifactId>
                      <version>3.0.2</version>
                  </plugin>
                  <plugin>
                      <artifactId>maven-install-plugin</artifactId>
                      <version>2.5.2</version>
                  </plugin>
                  <plugin>
                      <artifactId>maven-deploy-plugin</artifactId>
                      <version>2.8.2</version>
                  </plugin>
                  <plugin>
                      <artifactId>maven-site-plugin</artifactId>
                      <version>3.7.1</version>
                  </plugin>
                  <plugin>
                      <artifactId>maven-project-info-reports-plugin</artifactId>
                      <version>3.0.0</version>
                  </plugin>
              </plugins>
          </pluginManagement>
      </build>

    2. 创建接口UserService

      public interface UserService {
          @GetMapping("/users")
          String users();
          @PostMapping("/user")
          String insert(@RequestBody UserDto userDto);
      }

    3. 创建UserDto

      public class UserDto {
          private String name;
          private String sex;
          private int age;
          public String getName() {
              return name;
          }
          public void setName(String name) {
              this.name = name;
          }
          public String getSex() {
              return sex;
          }
          public void setSex(String sex) {
              this.sex = sex;
          }
          public int getAge() {
              return age;
          }
          public void setAge(int age) {
              this.age = age;
          }
      }

    4. 创建UserServiceClient

      @FeignClient("nacos-provider")//这里要跟服务提供端注册的名字一样
      public interface UserServiceClient extends UserService {
      }
  3. 服务提供端

    创建springboot项目nacos-provider

    1. 替换pom
      <parent>
          <groupId>com.example</groupId>
          <artifactId>springcloud-eclipse2019-nacos-discovery</artifactId>
          <version>1.0-SNAPSHOT</version>
      </parent>
      <modelVersion>4.0.0</modelVersion>
      <artifactId>nacos-provider</artifactId>
      <dependencies>
          <dependency>
              <groupId>com.example</groupId>
              <artifactId>nacos-api</artifactId>
              <version>1.0-SNAPSHOT</version>
          </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>
      </dependencies>
      <build>
          <plugins>
              <plugin>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-maven-plugin</artifactId>
                  <executions>
                      <execution>
                          <goals>
                              <goal>repackage</goal>
                          </goals>
                      </execution>
                  </executions>
              </plugin>
              <plugin>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <configuration>
                      <source>1.8</source>
                      <target>1.8</target>
                  </configuration>
              </plugin>
          </plugins>
      </build>

    2. 创建接口实现类
      @RestController
      public class UserServiceImpl implements UserService {
          @Value("${server.port}")
          private int port;
          @Override
          public String users() {
              return "获取"+port+"端口上的user成功";
          }
          @Override
          public String insert(UserDto userDto) {
              return port+"端口上:"+userDto.getName()+","+
                      userDto.getAge()+","+userDto.getSex()+"插入成功";
          }
      }

    3. 启动类增加注解
      @SpringBootApplication
      @EnableDiscoveryClient
      public class NacosProviderApplication {
      
          public static void main(String[] args) {
              SpringApplication.run(NacosProviderApplication.class, args);
          }
      
      }

    4. 配置文件
      spring.application.name=nacos-provider
      server.port=8088
      spring.cloud.nacos.discovery.server-addr=192.168.8.74:8848
      # 注册到 nacos 的指定 namespace,默认为 public
      #spring.cloud.nacos.discovery.namespace=dbaf147f-cf53-4d0b-8b17-d4313c17beb9

  4. 服务消费端

    1. 创建springboot项目nacos-consumer

    2. 替换pom

      <parent>
          <groupId>com.example</groupId>
          <artifactId>springcloud-eclipse2019-nacos-discovery</artifactId>
          <version>1.0-SNAPSHOT</version>
      </parent>
      <modelVersion>4.0.0</modelVersion>
      <artifactId>nacos-consumer</artifactId>
      <properties>
          <spring-cloud-openfeign.version>2.0.0.RELEASE</spring-cloud-openfeign.version>
          <spring-cloud-netflix.version>2.0.0.RELEASE</spring-cloud-netflix.version>
      </properties>
      <dependencies>
          <dependency>
              <groupId>com.example</groupId>
              <artifactId>nacos-api</artifactId>
              <version>1.0-SNAPSHOT</version>
          </dependency>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
              <version>${spring-cloud-netflix.version}</version>
          </dependency>
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-openfeign</artifactId>
              <version>${spring-cloud-openfeign.version}</version>
          </dependency>
          <dependency>
              <groupId>com.alibaba.cloud</groupId>
              <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
          </dependency>
      </dependencies>
      <build>
          <plugins>
              <plugin>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-maven-plugin</artifactId>
                  <executions>
                      <execution>
                          <goals>
                              <goal>repackage</goal>
                          </goals>
                      </execution>
                  </executions>
              </plugin>
              <plugin>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <configuration>
                      <source>1.8</source>
                      <target>1.8</target>
                  </configuration>
              </plugin>
          </plugins>
      </build>

    3. 创建controller

      @RestController
      public class TestController {
          @Autowired
          UserServiceClient userServiceClient;
          @GetMapping("/user")
          public String users(){
              int a = 0;
              return userServiceClient.users();
          }
          @PostMapping("/user")
          public String user(@RequestBody UserDto userDto){
              return userServiceClient.insert(userDto);
          }
      }

    4. 启动类增加注解

      @SpringBootApplication
      @EnableDiscoveryClient
      @EnableFeignClients(basePackages = "com.example.clients")//这里的地址要跟api中的client地址一样
      public class NacosConsumerApplication {
          public static void main(String[] args) {
              SpringApplication.run(NacosConsumerApplication.class, args);
          }
      }

    5. 配置文件

      spring.application.name=nacos-consumer
      server.port=8080
      spring.cloud.nacos.discovery.server-addr=192.168.8.74:8848

2.2.2.2 配置中心

在Nacos中,实现动态配置管理,相对于Spring Cloud中的Config来说,友好太多了,先给大家简单演示一下

代码见nacos-examples-master/nacos-spring-cloud-example/nacos-spring-cloud-config-example

下面我们自己实现一下

springcloud-eclipse2019-nacos-config

  1. 配置pom

    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springcloud-eclipse2019-nacos-config</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud-eclipse2019-nacos-config</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-web</artifactId>
        </dependency>
    
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
    </dependencies>

  2. bootstrap.properties

    spring.cloud.nacos.config.server-addr=192.168.8.74:8848
    spring.application.name=nacos-config

    需要注意,配置中心的ip,需要放在bootstrap.properties文件中,因为需要保证优先级。

  3. TestController

    @RestController
    @RequestMapping("/config")
    @RefreshScope
    public class TestController {
    
        @Value("${eclipse2019:girl}")
        private String eclipse2019;
    
        @RequestMapping("/get")
        public String get(){
            return eclipse2019;
        }
    }

  4. 测试过程

    1. 启动服务,访问http://localhost:8080/config/get,浏览器会显示eclipse2019的默认值,因为这个时候nacos还没有配置eclipse2019的key

    2. 进入控制台,增加配置,dataid=nacos-config.properties,group=default_group, 并且增加 eclipse2019= xx的value属性 再次刷新url,就可以读取到值的变化

  5. 关于Nacos Config配置解释

    在 Nacos Spring Cloud 中, dataId 的完整格式如下:

    ${prefix}-${spring.profiles.active}.${file-extension}
    1. prefix 默认为 spring.application.name 的值,也可以通过配置项spring.cloud.nacos.config.prefix 来配置。

    2. spring.profiles.active 即为当前环境对应的 profile,详情可以参考 。 注意:当spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}

    3. file-exetension 为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

2.3 Nacos的集群搭建

5分钟

在前面的课程讲解过程中,我们部署的Nacos是一个standalone的模式。Nacos是可以支持集群部署的,我们可以配置三台服务器做一个简单的测试

2.3.1 环境准备

准备三台服务器

  • 192.168.8.74

  • 192.168.8.75

  • 192.168.8.76

2.3.2 下载编译好的包

https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3.2.tar.gz

2.3.3 配置数据源

需要注意的是,Nacos默认采用的是一个derby的内置数据库,在实际过程中,不建议使用这种数据源。建议采用高可用数据库,比如我们使用mysql构建主从。

那我们可以使用mysql作为数据源来进行服务的配置。

导入mysql数据库脚本

每台nacos服务都连各自的数据库

/*
 * Copyright 1999-2018 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info   */
/******************************************/
CREATE TABLE `config_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) DEFAULT NULL,
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  `c_desc` varchar(256) DEFAULT NULL,
  `c_use` varchar(64) DEFAULT NULL,
  `effect` varchar(64) DEFAULT NULL,
  `type` varchar(64) DEFAULT NULL,
  `c_schema` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_aggr   */
/******************************************/
CREATE TABLE `config_info_aggr` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(255) NOT NULL COMMENT 'group_id',
  `datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
  `content` longtext NOT NULL COMMENT '内容',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `app_name` varchar(128) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';


/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_beta   */
/******************************************/
CREATE TABLE `config_info_beta` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_tag   */
/******************************************/
CREATE TABLE `config_info_tag` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL COMMENT 'content',
  `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `src_user` text COMMENT 'source user',
  `src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_tags_relation   */
/******************************************/
CREATE TABLE `config_tags_relation` (
  `id` bigint(20) NOT NULL COMMENT 'id',
  `tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
  `tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
  `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  `group_id` varchar(128) NOT NULL COMMENT 'group_id',
  `tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
  `nid` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`nid`),
  UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = group_capacity   */
/******************************************/
CREATE TABLE `group_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';

/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = his_config_info   */
/******************************************/
CREATE TABLE `his_config_info` (
  `id` bigint(64) unsigned NOT NULL,
  `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `data_id` varchar(255) NOT NULL,
  `group_id` varchar(128) NOT NULL,
  `app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
  `content` longtext NOT NULL,
  `md5` varchar(32) DEFAULT NULL,
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `src_user` text,
  `src_ip` varchar(50) DEFAULT NULL,
  `op_type` char(10) DEFAULT NULL,
  `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  PRIMARY KEY (`nid`),
  KEY `idx_gmt_create` (`gmt_create`),
  KEY `idx_gmt_modified` (`gmt_modified`),
  KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';


/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = tenant_capacity   */
/******************************************/
CREATE TABLE `tenant_capacity` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
  `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
  `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
  `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
  `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
  `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
  `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
  `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';


CREATE TABLE `tenant_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `kp` varchar(128) NOT NULL COMMENT 'kp',
  `tenant_id` varchar(128) default '' COMMENT 'tenant_id',
  `tenant_name` varchar(128) default '' COMMENT 'tenant_name',
  `tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
  `create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
  `gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
  `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
  KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';

CREATE TABLE `users` (
	`username` varchar(50) NOT NULL PRIMARY KEY,
	`password` varchar(500) NOT NULL,
	`enabled` boolean NOT NULL
);

CREATE TABLE `roles` (
	`username` varchar(50) NOT NULL,
	`role` varchar(50) NOT NULL,
	UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);

CREATE TABLE `permissions` (
    `role` varchar(50) NOT NULL,
    `resource` varchar(255) NOT NULL,
    `action` varchar(8) NOT NULL,
    UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

修改nacos中application.properties文件内容

#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=nacos
db.password=nacos

2.3.4 启动nacos服务

启动nacos服务之前,需要配置集群

在nacos/conf目录下,有一个cluster.conf配置文件,在这个配置文件中配置这三个节点的ip和端口

192.168.8.74:8848
192.168.8.75:8848
192.168.8.76:8848

三种不同启动方式命令

外部数据源

#我们使用的外部数据源,所以用这个命令启动,三台服务器都需要启动
sh startup.sh 

内存数据源

sh startup.sh -p embedded

当然,Nacos也可以支持单机运行

sh startup.sh -m standalone

2.4 Nacos server监控

2.4.1 Prometheus

Prometheus是一个开源的监控系统,起源于SoundCloud。它由以下几个核心组件构成:

  • 数据爬虫:根据配置的时间定期的通过HTTP抓去metrics数据。

  • time-series 数据库:存储所有的metrics数据。

  • 简单的用户交互接口:可视化、查询和监控所有的metrics。

2.4.2 Grafana

Grafana使你能够把来自不同数据源比如Elasticsearch, Prometheus, Graphite, influxDB等多样的数据以绚丽的图标展示出来。

它也能基于你的metrics数据发出告警。当一个告警状态改变时,它能通知你通过email,slack或者其他途径。

值得注意的是,Prometheus仪表盘也有简单的图标。但是Grafana的图表表现的更好。这也是为什么,我们需要整合Grafana和Pormetheus来可视化metrics数据。

2.4.3 Nacos server接入到监控

  • 修改${NACOS_HOME}/conf/application.properties

  • 访问这个地址: http://192.168.216.128:8848/nacos/actuator/prometheus 可以看到服务监控信息

    修改prometheus.yml,添加Nacos的采集任务

  • 修改prometheus.yml

    - job_name: 'nacos'
     metrics_path: '/nacos/actuator/prometheus'
     static_configs:
     - targets:
    ["192.168.216.128:8848","192.168.216.129:8848","192.168.216.130:8848"]

  • job_name:任务名称

    • metrics_path: 指标路径

    • targets:实例地址/项目地址,可配置多个

    • scrape_interval: 多久采集一次

    • scrape_timeout: 采集超时时间

  • 启动prometheus服务

    ./prometheus --config.file="prometheus.yml"
    [root@localhost prometheus-2.17.1.linux-amd64]# nohup ./prometheus --config.file=prometheus.yml --web.enable-lifecycle > prometheus.log 2>&1 &

  • 访问:http://192.168.216.128:9090/

    • 在搜索栏中搜索 nacos_monitor,如果可以看到nacos的数据,说明采集成功

    • 在status菜单的service discovery中,可以看到nacos这个job

2.4.4 采用grafana图形化展示metrics数据

  • 下载Grafana:Download Grafana | Grafana Labs

    wget https://dl.grafana.com/oss/release/grafana-7.0.3-1.x86_64.rpm
    sudo yum install grafana-7.0.3-1.x86_64.rpm

  • 启动Grafana, service grafana-server start / $GRAFANA_HOME/bin/grafana-server

  • 访问Grafana , http://localhost:3000 , 默认的帐号密码 admin/admin

  • 菜单选择 Configuration -> Data Source -> Add Data Source -> 名字:prometheus

  • 导入nacos的面板数据 .nacos-granfa.json

下文预告

  1. Nacos中有哪几种节点,它们的区别是什么

  2. Nacos作为注册中心用的是什么一致性协议,不同的节点分别用的是什么协议

  3. Nacos中一致性协议有什么区别

  4. Nacos配置中心用的是Push模型还是Pull模型又或者是其他的模型?

  5. 不同模型的区别及优劣

  6. Nacos的节点是如何保证存活的

  7. Nacos注册的流程

  8. Nacos配置的流程

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木_2024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值